[ https://issues.apache.org/jira/browse/PROTON-1292?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15449528#comment-15449528 ]
Adel Boutros commented on PROTON-1292: -------------------------------------- Indeed I misunderstood you because I thought you were saying "because Proton does not contain multi-threading code, we will not add such options". I will try to test the "-mt" before the end of the week and let you know how it goes. > 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.12.2, 0.13.0 > Reporter: Adel Boutros > Assignee: Andrew Stitcher > > 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-unsubscr...@qpid.apache.org For additional commands, e-mail: dev-h...@qpid.apache.org