Re: Calling libiptc API from a separate thread in a C program throws segmentati



On 2012-01-17, Richard Kettlewell <rjk@xxxxxxxxxxxxxxx> wrote:
Kaz Kylheku <kaz@xxxxxxxxxxx> writes:
Richard Kettlewell <rjk@xxxxxxxxxxxxxxx> wrote:

errno ends up indirected either way though (at least here).
"Either way" between which alternatives?

$ cat t.c
#include <errno.h>

int main() { return errno; }
$ gcc -E t.c|grep main
int main() { return (*__errno_location ()); }
$ gcc -pthread -E t.c|grep main
int main() { return (*__errno_location ()); }

I think you must have misread the condition in bits/errno.h.

Indeed I did. But what's shocking is how long ago that behavior changed, wow.

They have all the history back-ported into git.

It was in 1997 that checks for __USE_REENTRANT was dropped from there and other
numerous other places:

http://sourceware.org/git/?p=glibc.git;a=commit;f=sysdeps/unix/sysv/linux/bits/errno.h;h=19361cb768c280e47f2ca69ed63e1d75f332e592

In the commit comment, Drepper declared a policy:

``Don't use __USE_REENTRENT. All code must be prepared to be running in a
multi-threaded environment.''

So that's that. On glibc, -lpthread is basically enough. Everything is switched
to thread-safe by linkage to stub pthread routines that get overriden by the
real ones.

(I was just thinking that errno was still an exception.)
.