[ https://issues.apache.org/jira/browse/PROTON-1292?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15449462#comment-15449462 ]
Andrew Stitcher commented on PROTON-1292: ----------------------------------------- Maybe you are misunderstanding me: I'm happy to make Proton-C MT safe on Solaris (like it is on Linux). I'm asking you to try "-mt" as a compile flag to enable this as I don't have easy access to Solaris presently. [The bit that is confusing you I think is me saying that we have not done anything special on Linux for MT safeness at all, because by default it just works, which isn't true for Solaris. I'm really not concerned with the tiny bit of extra overhead this would add on Solaris] > 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