[ 
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

Reply via email to