On Mon, Jan 16, 2023 at 04:30:48PM +0100, Frederik Seiffert via curl-library 
wrote:
> When receiving CURL_POLL_REMOVE, I call dispatch_source_cancel() [2] to stop 
> the dispatch source. As this is done asynchronously, it is required to wait 
> for the cancellation handler before closing the socket according to the 
> documentation:
> 
> > The cancellation handler is submitted to the source's target queue when the 
> > source's event handler has finished, indicating that it is safe to close 
> > the source's handle (file descriptor or mach port).
> 
> However libcurl closes the socket immediately after calling the socket 
> function, and at least on Windows this causes GCD to sometimes crash because 
> WSAEventSelect() returns WSAENOTSOCK ("Socket operation on nonsocket") here: 
> [3].
> 
> Does anyone have a suggestion as to how to work around this? The only thing I 
> can think of is to use CURLOPT_CLOSESOCKETFUNCTION and wait for the 
> cancellation handler before closing the socket. Would this be the recommended 
> approach? I’m fairly new to this topic, so I might be missing something 
> obvious.

IMHO, that sounds like a good approach. curl assumes POSIX semantics on sockets
which allow them to be closed at any time. If your environment doesn't allow
that, then hooking in to CURLOPT_CLOSESOCKETFUNCTION sounds like a good way
to maintain those semantics.

> I found that building libcurl with "CURL_DISABLE_SOCKETPAIR" fixes most these 
> crashes, but this seems like a poor workaround and some crashes remain.

I agree. That option just stops one source of socket closes, but others will
remain.

Dan
-- 
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html

Reply via email to