Adel Raise an JIRA issue so this does not get overlooked or forgotten.
[As a side point, this list is not the best way to report bugs, but entirely the best way to ask for advice and help!] Andrew On Mon, 2016-08-29 at 09:32 +0200, Adel Boutros wrote: > Hello, > > For some time, we were having random errors on Solaris with proton-c > where we would get a transport error "proton:io connect: Error 0". We > were finally able to reproduce it in a multi-threading environment. > It turns out some C/C++ system calls such as opening sockets will set > the value of "errno" and some parts of proton-c code you rely on the > value of errno to determine if the operation was successful or > not[1]. > > The issue is that errno is not thread safe[2] and as a consequence if > by the time Thread A was checking the value of errno, Thread B has > set it to something else, the check will fail. > > We resolved it by compiling Proton with "-D_REENTRANT" which makes > errno thread local variable. > > Please note we only got this error on Solaris because on Linux > setting "-lpthread" implies "-D_REENTRANT flag" according to > stackoverflow[2]. > > Do you think this flag could be set by default in the CMakeList of > proton to avoid others having the same issue? > > On Solaris: > /usr/include/errno.h > > #if defined(_REENTRANT) || defined(_TS_ERRNO) || _POSIX_C_SOURCE - 0 > >= 199506L > extern int *___errno(); > #define errno (*(___errno())) > #else > extern int errno; > /* ANSI C++ requires that errno be a macro */ > #if __cplusplus >= 199711L > #define errno errno > #endif > #endif /* defined(_REENTRANT) || defined(_TS_ERRNO) */ > > PS: The code is still the same on 0.14.0. So the error could happen > there as well I guess. > > Regards, > Adel > > [1]: https://github.com/apache/qpid-proton/blob/0.12.2/proton-c/src/p > osix/io.c (line 187-188) > [2]: http://stackoverflow.com/questions/1694164/is-errno-thread-safe > [3]: http://stackoverflow.com/questions/875789/gcc-do-i-need-d-reentr > ant-with-pthreads > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
