threads/72429: threads blocked in stdio (fgets, etc) are not
cancellable in 5.3 (works in 4.x)
Mark Gooderum
mark at verniernetworks.com
Thu Oct 7 15:36:46 PDT 2004
Uncle. Okay - you're right, sigh.
It's not so much that we're using fgets() as many/most C based parsing
libraries use stdio, bleh.
As for why libc_r is cancellable...
In 4.x _foo() sets the cancellation state and calls __foo() (for read,
write, et.al), in 5.3 it's reversed.
--
Mark
>On Thu, 7 Oct 2004, Mark Gooderum wrote:
>
>
>
>>But this is a major change in behavior from FreeBSD 4 and also a
>>difference from Linux. I'm not a Linux bigot at all but there is a
>>recurring theme that XX threaded apps works on Linux but is unstable on
>>FreeBSD and these sort of major behavior deltas contribute to the
>>perception of FreeBSD threading as unstable by some.
>>
>>
>
>If you want to be portable, you should be using select() or
>poll(). It's not like there is no portable way of doing
>what you want, and in fact relying on fgets() to be cancellable
>is not portable.
>
>
>
>>In fact it means that any thread doing blocking stdio is uncancellable -
>>the standard may not require it but many applications might expect it.
>>Given that the functionality was there in 4.x and lost in 5.x I'd call
>>it a regression.
>>
>>
>
>fgets() was not supposed to be cancellable in 4.x. If it
>is, it is not by intention. Anything that calls _foo (single
>underscore versions of system calls) is intentionally doing
>it that way to avoid entering undesired cancellation points
>(and blocking points in the case of libc_r). There are other
>uses of _read() within libc and those may not want to be
>cancellation points.
>
>The overall design of libc is that all internal uses of system
>calls use the single underscore versions and let the threads
>library override them if it wants. _foo() is not supposed to
>be cancellable, and, in the case of libc_r, is also not supposed
>to allow the process to block when hit (libc_r converts _read()
>and _write() to poll(), then switches to another thread). I
>don't know why fgets() ends up as a cancellation point in libc_r,
>but it shouldn't be by design -- it is a bug.
>
>
>
More information about the freebsd-threads
mailing list