On Mon, 2013-05-06 at 19:23 -0600, Erich E. Hoover wrote:
> --- a/dlls/iphlpapi/iphlpapi_main.c
> +++ b/dlls/iphlpapi/iphlpapi_main.c
> @@ -210,8 +210,14 @@ DWORD WINAPI AllocateAndGetIpAddrTableFromStack(PMIB_IPADDRTABLE *ppIpAddrTable,
> */
> BOOL WINAPI CancelIPChangeNotify(LPOVERLAPPED overlapped)
> {
> - FIXME("(overlapped %p): stub\n", overlapped);
> - return FALSE;
> + HANDLE handle;
> +
> + TRACE("(overlapped %p)\n", overlapped);
> +
> + if (!overlapped)
> + return FALSE;
> + handle = (HANDLE) overlapped->u.Pointer;
> + return TerminateThread(handle, STATUS_CANCELLED);
> }
TerminateThread is not the right tool here. If the thread is blocked on the
recv call while being terminated it will leak the netlink socket.
You'd need a way to synchronize the threads, but an overhead of one thread per
caller is rather costly in the first place. This suggests that the server should
poll the socket.