You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Adel Boutros (JIRA)" <ji...@apache.org> on 2016/08/29 15:05:20 UTC

[jira] [Created] (PROTON-1292) errno not thread-safe on Solaris

Adel Boutros created PROTON-1292:
------------------------------------

             Summary: errno not thread-safe on Solaris
                 Key: PROTON-1292
                 URL: https://issues.apache.org/jira/browse/PROTON-1292
             Project: Qpid Proton
          Issue Type: Bug
          Components: proton-c
    Affects Versions: 0.13.0, 0.12.2
            Reporter: Adel Boutros


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.

[1]: https://github.com/apache/qpid-proton/blob/0.12.2/proton-c/src/posix/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-reentrant-with-pthreads 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org