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.