[PATCH 5/6] ws2_32: Added support for overlapped GetAddrInfoExW.
Jacek Caban
jacek at codeweavers.com
Tue Aug 1 12:05:13 CDT 2017
On 01.08.2017 18:52, Sebastian Lackner wrote:
> On 01.08.2017 18:29, Jacek Caban wrote:
>> +static void WINAPI getaddrinfo_callback(TP_CALLBACK_INSTANCE *instance, void *context, TP_WORK *work)
>> +{
>> + struct getaddrinfo_args *args = context;
>> + OVERLAPPED *overlapped = args->overlapped;
>> + struct WS_addrinfo *res;
>> +
>> + overlapped->Internal = WS_getaddrinfo(args->nodename, args->servname, NULL, &res);
> What if the app does busy-looping instead of using the event, and expects the result to
> be set after overlapped->Internal changed?
>
> My understanding is that setting overlapped->Internal should be the very last thing in
> the function, the app could decide to deallocate / reuse the memory after the async
> operation has finished.
It's not clear for me if it's supposed to be guaranteed, but it surely
won't hurt. I will change it.
>> + if (res)
>> + {
>> + *args->result = addrinfo_list_AtoW(res);
>> + overlapped->u.Pointer = args->result;
>> + WS_freeaddrinfo(res);
>> + }
>> [...]
>> + tp_work = CreateThreadpoolWork(getaddrinfo_callback, args, NULL);
>> + if (!tp_work)
>> + {
>> + HeapFree(GetProcessHeap(), 0, args);
>> + ret = GetLastError();
>> + goto end;
>> + }
>>
>> + overlapped->Internal = WSAEINPROGRESS;
>> + SubmitThreadpoolWork(tp_work);
> I don't see a CloseThreadpoolWork call or cleanup group anywhere, so there is likely a
> leak in this code. Also, when all callbacks have different arguments, it would be better
> to use TrySubmitThreadpoolCallback(). Work callbacks are typically used when the same
> task is queued multiple times.
TrySubmitThreadpoolCallback() looks like what I need, I will change it.
Thanks,
Jacek
More information about the wine-devel
mailing list