Veel systems calls in Linux zetten de globale variable "errno" als er iets mis gaat. Globale variabelen geven natuurlijk problemen als je met meerdere threads gaat spelen (en system calls doet vanuit meerdere threads). Volgens de header files in Linux wordt dit als volgt opgelost (errno.h):
oftwel, errno wordt een macro die een variable terug geeft die de locale errno van een thread zou moeten zijn. Nergens wordt _LIC_REENTRANT verder gedefineerd (behalve in glibc zelf..). Mag ik er dan vanuit gaan dat als je glibc gebruikt geen _LIBC wordt gedefineerd maar iets van GNU_LIBC?
Hoe kan ik detecteren bijv. in een automake/autoconf script of de thread library dit ook support? Behalve op linux, wordt dit ook onder bsd gesupport?
Of is het misschien beter om zelf mutex locks te gaan gebruiken rondom elke system call?
C:
1
2
3
4
5
6
7
8
9
| /* Function to get address of global `errno' variable. */ extern int *__errno_location (void) __THROW __attribute__ ((__const__)); # if !defined _LIBC || defined _LIBC_REENTRANT /* When using threads, errno is a per-thread value. */ # define errno (*__errno_location ()) # endif # endif /* !__ASSEMBLER__ */ #endif /* _ERRNO_H */ |
oftwel, errno wordt een macro die een variable terug geeft die de locale errno van een thread zou moeten zijn. Nergens wordt _LIC_REENTRANT verder gedefineerd (behalve in glibc zelf..). Mag ik er dan vanuit gaan dat als je glibc gebruikt geen _LIBC wordt gedefineerd maar iets van GNU_LIBC?
Hoe kan ik detecteren bijv. in een automake/autoconf script of de thread library dit ook support? Behalve op linux, wordt dit ook onder bsd gesupport?
Of is het misschien beter om zelf mutex locks te gaan gebruiken rondom elke system call?