<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hello,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have narrowed down the cause of intermittent failures in our stress<o:p></o:p></p>
<p class="MsoNormal">test cases to the use of gethostbyname() in noPoll library.<o:p></o:p></p>
<p class="MsoNormal">This function is not thread safe under Linux (possibly other platforms too).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I fixed this by modifying  function nopoll_conn_sock_connect_opts()<o:p></o:p></p>
<p class="MsoNormal">This function is used for outbound client connections. <o:p>
</o:p></p>
<p class="MsoNormal">Our application makes multiple websocket connections to <o:p>
</o:p></p>
<p class="MsoNormal">different hosts in one process. The problem was revealed when<o:p></o:p></p>
<p class="MsoNormal">I started using dns hosts names instead of IP addresses.<o:p></o:p></p>
<p class="MsoNormal">I updated the function to use getaddrinfo() instead of gethostbyname().<o:p></o:p></p>
<p class="MsoNormal">My modifications fixed the stress test failures.<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">There is another place gethostbyname is used that I did not<o:p></o:p></p>
<p class="MsoNormal">fix since we are not yet using the server (listen) mode.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Below is my modified function for reference:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">NOPOLL_SOCKET nopoll_conn_sock_connect_opts (noPollCtx       * ctx,<o:p></o:p></p>
<p class="MsoNormal">                                                                                     const char      * host,<o:p></o:p></p>
<p class="MsoNormal">                                                                                     const char      * port,<o:p></o:p></p>
<p class="MsoNormal">                                                                                     noPollConnOpts  * options)<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">                NOPOLL_SOCKET        session;<o:p></o:p></p>
<p class="MsoNormal">                struct addrinfo hints, *servinfo, *p;<o:p></o:p></p>
<p class="MsoNormal">                int rc;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                memset(&hints, 0, sizeof hints);<o:p></o:p></p>
<p class="MsoNormal">                hints.ai_family = AF_INET; /* force IPv4 */<o:p></o:p></p>
<p class="MsoNormal">                hints.ai_socktype = SOCK_STREAM; <o:p></o:p></p>
<p class="MsoNormal">                if ((rc = getaddrinfo(host, port, &hints, &servinfo)) != 0) {<o:p></o:p></p>
<p class="MsoNormal">                                nopoll_log (ctx, NOPOLL_LEVEL_DEBUG, "unable to resolve host name %s", host);<o:p></o:p></p>
<p class="MsoNormal">                                return -1;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                p = servinfo;<o:p></o:p></p>
<p class="MsoNormal">                if (p == NULL) {<o:p></o:p></p>
<p class="MsoNormal">                                nopoll_log (ctx, NOPOLL_LEVEL_DEBUG, "unable to retrieve address for host name %s", host);<o:p></o:p></p>
<p class="MsoNormal">                                return -1;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* create the socket and check if it */<o:p></o:p></p>
<p class="MsoNormal">                session      = socket (AF_INET, SOCK_STREAM, 0);<o:p></o:p></p>
<p class="MsoNormal">                if (session == NOPOLL_INVALID_SOCKET) {<o:p></o:p></p>
<p class="MsoNormal">                                nopoll_log (ctx, NOPOLL_LEVEL_CRITICAL, "unable to create socket");<o:p></o:p></p>
<p class="MsoNormal">                freeaddrinfo(servinfo);<o:p></o:p></p>
<p class="MsoNormal">                                return -1;<o:p></o:p></p>
<p class="MsoNormal">                } /* end if */<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* disable nagle */<o:p></o:p></p>
<p class="MsoNormal">                nopoll_conn_set_sock_tcp_nodelay (session, nopoll_true);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* bind to specified interface */<o:p></o:p></p>
<p class="MsoNormal">                if( nopoll_true != nopoll_conn_set_bind_interface (session, options) ) {<o:p></o:p></p>
<p class="MsoNormal">                                nopoll_log (ctx, NOPOLL_LEVEL_CRITICAL, "unable to bind to specified interface");<o:p></o:p></p>
<p class="MsoNormal">                                nopoll_close_socket (session);<o:p></o:p></p>
<p class="MsoNormal">                                freeaddrinfo(servinfo);<o:p></o:p></p>
<p class="MsoNormal">                                return -1;<o:p></o:p></p>
<p class="MsoNormal">                } /* end if */<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* set non blocking status */<o:p></o:p></p>
<p class="MsoNormal">                nopoll_conn_set_sock_block (session, nopoll_false);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* do a tcp connect */<o:p></o:p></p>
<p class="MsoNormal">                if (connect (session, p->ai_addr, p->ai_addrlen) < 0) {<o:p></o:p></p>
<p class="MsoNormal">                                if(errno != NOPOLL_EINPROGRESS && errno != NOPOLL_EWOULDBLOCK && errno != NOPOLL_ENOTCONN) {<o:p></o:p></p>
<p class="MsoNormal">                                        shutdown (session, SHUT_RDWR);<o:p></o:p></p>
<p class="MsoNormal">                        nopoll_close_socket (session);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                                nopoll_log (ctx, NOPOLL_LEVEL_WARNING, "unable to connect to remote host %s:%s errno=%d",<o:p></o:p></p>
<p class="MsoNormal">                                                                    host, port, errno);<o:p></o:p></p>
<p class="MsoNormal">                                freeaddrinfo(servinfo);<o:p></o:p></p>
<p class="MsoNormal">                                                return -1;<o:p></o:p></p>
<p class="MsoNormal">                                } /* end if */<o:p></o:p></p>
<p class="MsoNormal">                } /* end if */<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                freeaddrinfo(servinfo);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                /* return socket created */<o:p></o:p></p>
<p class="MsoNormal">                return session;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Regards,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Rahul<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Rahul Kale<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">IP Video Systems<o:p></o:p></p>
<p class="MsoNormal">Barco, Inc<o:p></o:p></p>
<p class="MsoNormal">1287 Anvilwood Ave<o:p></o:p></p>
<p class="MsoNormal">Sunnyvale, CA  94089<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Tel  +1 408 400 4238<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
This message is subject to the following terms and conditions: <a href="http://www.barco.com/en/maildisclaimer">
MAIL DISCLAIMER</a>
</body>
</html>