<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>