<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title></title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
body {
  margin: 5px 5px 5px 5px;
  background-color: #ffffff;
}
/* ========== Text Styles ========== */
hr { color: #000000}
body, table /* Normal text */
{
 font-size: 9pt;
 font-family: 'Courier New';
 font-style: normal;
 font-weight: normal;
 color: #000000;
 text-decoration: none;
}
span.rvts1 /* Heading */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-weight: bold;
 color: #0000ff;
}
span.rvts2 /* Subheading */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-weight: bold;
 color: #000080;
}
span.rvts3 /* Keywords */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-style: italic;
 color: #800000;
}
a.rvts4, span.rvts4 /* Jump 1 */
{
 font-size: 10pt;
 font-family: 'Arial';
 color: #008000;
 text-decoration: underline;
}
a.rvts5, span.rvts5 /* Jump 2 */
{
 font-size: 10pt;
 font-family: 'Arial';
 color: #008000;
 text-decoration: underline;
}
span.rvts6
{
 font-size: 11pt;
 font-family: 'tahoma';
 font-weight: bold;
 color: #ffffff;
 background-color: #0000ff;
}
span.rvts7
{
 font-size: 11pt;
 font-family: 'tahoma';
}
span.rvts8
{
 color: #0000ff;
}
span.rvts9
{
}
span.rvts10
{
 color: #020002;
}
span.rvts11
{
 font-family: 'arial';
 font-weight: bold;
}
span.rvts12
{
 font-size: 7pt;
 font-family: 'arial';
}
a.rvts13, span.rvts13
{
 font-size: 7pt;
 font-family: 'arial';
 color: #0000ff;
 text-decoration: underline;
}
span.rvts14
{
 font-size: 12pt;
 font-family: 'times new roman';
}
/* ========== Para Styles ========== */
p,ul,ol /* Paragraph Style */
{
 text-align: left;
 text-indent: 0px;
 padding: 0px 0px 0px 0px;
 margin: 0px 0px 0px 0px;
}
.rvps1 /* Centered */
{
 text-align: center;
}
--></style>
</head>
<body>

<p>This was done by design. &nbsp;The assumption is not that socket handles won't be greater than 0xFF, but rather that 255 mutexes are enough to share within one application space.</p>
<p><br></p>
<p>You are correct that different socket handles will use the same mutexes, which can cause lock contention, but deadlock should be impossible because within the calls only one mutex is ever held (and released) by a thread.</p>
<p><br></p>
<p>Cheers!</p>
<p>John</p>
<p><br></p>
<p>---</p>
<p>John Lane Schultz</p>
<p>Spread Concepts LLC</p>
<p>Phn: 443 838 2200&nbsp;</p>
<p>Fax: 301 560 8875</p>
<p><br></p>
<p>Tuesday, June 17, 2008, 7:30:13 AM, you wrote:</p>
<p><br></p>
<div><table border=0 cellpadding=1 cellspacing=2>
<tr valign=top>
<td width=12 style="background-color: #0000ff;">
<p><span class=rvts6>&gt;</span></p>
</td>
<td width=812 style="background-color: #ffffff;">
<p><span class=rvts7>The mutex lock in &#8220;Sp.c&#8221; uses a dangerous assumption that doesn&#8217;t hold on Win32. The mbox will be assigned the opened win32 socket handle that could be greater than 0xFF, and for most time is.</span></p>
<p><span class=rvts7>&nbsp;</span></p>
<p><span class=rvts8>int</span><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts10>SP_connect_timeout</span><span class=rvts9>(&nbsp;</span><span class=rvts8>const</span><span class=rvts9>&nbsp;</span><span class=rvts8>char</span><span class=rvts9>&nbsp;*</span><span class=rvts10>spread_name</span><span class=rvts9>,&nbsp;</span><span class=rvts8>const</span><span class=rvts9>&nbsp;</span><span class=rvts8>char</span><span class=rvts9>&nbsp;*</span><span class=rvts10>private_name</span><span class=rvts9>,</span></p>
<p><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts8>int</span><span class=rvts9>&nbsp;</span><span class=rvts10>priority</span><span class=rvts9>,&nbsp;</span><span class=rvts8>int</span><span class=rvts9>&nbsp;</span><span class=rvts10>group_membership</span><span class=rvts9>,&nbsp;</span><span class=rvts10>mailbox</span><span class=rvts9>&nbsp;*</span><span class=rvts10>mbox</span><span class=rvts9>,</span></p>
<p><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts8>char</span><span class=rvts9>&nbsp;*</span><span class=rvts10>private_group</span><span class=rvts9>,&nbsp;</span><span class=rvts10>sp_time</span><span class=rvts9>&nbsp;</span><span class=rvts10>time_out</span><span class=rvts9>&nbsp;)</span></p>
<p><span class=rvts9>{</span></p>
<p><span class=rvts7>.</span></p>
<p><span class=rvts10>s</span><span class=rvts9>&nbsp;=&nbsp;</span><span class=rvts10>socket</span><span class=rvts9>(&nbsp;</span><span class=rvts10>AF_UNIX</span><span class=rvts9>,&nbsp;</span><span class=rvts10>SOCK_STREAM</span><span class=rvts9>, 0 );</span></p>
<p><span class=rvts9>.</span></p>
<p><span class=rvts9>*</span><span class=rvts10>mbox</span><span class=rvts9>&nbsp;=&nbsp;</span><span class=rvts10>s</span><span class=rvts9>;</span></p>
<p><span class=rvts9>}</span></p>
<p><span class=rvts9>&nbsp;</span></p>
<p><span class=rvts7>&nbsp;</span></p>
<p><span class=rvts7>The following code is bad on win32, masking with 0xFF will generate different socket handles using the same mutex and could cause deadlock during multithreaded applications.</span></p>
<p><span class=rvts10>&nbsp;</span></p>
<p><span class=rvts8>int</span><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts10>SP_scat_receive</span><span class=rvts9>(&nbsp;</span><span class=rvts10>mailbox</span><span class=rvts9>&nbsp;</span><span class=rvts10>mbox</span><span class=rvts9>,&nbsp;</span><span class=rvts10>service</span><span class=rvts9>&nbsp;*</span><span class=rvts10>service_type</span><span class=rvts9>,&nbsp;</span><span class=rvts8>char</span><span class=rvts9>&nbsp;</span><span class=rvts10>sender</span><span class=rvts9>[</span><span class=rvts10>MAX_GROUP_NAME</span><span class=rvts9>],</span></p>
<p><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts8>int</span><span class=rvts9>&nbsp;</span><span class=rvts10>max_groups</span><span class=rvts9>,&nbsp;</span><span class=rvts8>int</span><span class=rvts9>&nbsp;*</span><span class=rvts10>num_groups</span><span class=rvts9>,&nbsp;</span><span class=rvts8>char</span><span class=rvts9>&nbsp;</span><span class=rvts10>groups</span><span class=rvts9>[][</span><span class=rvts10>MAX_GROUP_NAME</span><span class=rvts9>],</span></p>
<p><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts10>int16</span><span class=rvts9>&nbsp;*</span><span class=rvts10>mess_type</span><span class=rvts9>,&nbsp;</span><span class=rvts8>int</span><span class=rvts9>&nbsp;*</span><span class=rvts10>endian_mismatch</span><span class=rvts9>,</span></p>
<p><span class=rvts9>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span class=rvts10>scatter</span><span class=rvts9>&nbsp;*</span><span class=rvts10>scat_mess</span><span class=rvts9>&nbsp;)</span></p>
<p><span class=rvts9>{</span></p>
<p><span class=rvts10>.</span></p>
<p><span class=rvts10>.</span></p>
<p><span class=rvts10>Mutex_lock</span><span class=rvts9>( &amp;</span><span class=rvts10>Mbox_mutex</span><span class=rvts9>[</span><span class=rvts10>mbox</span><span class=rvts9>&nbsp;&amp;&nbsp;</span><span class=rvts10>MAX_MUTEX_MASK</span><span class=rvts9>][1] );</span></p>
<p><span class=rvts9>.</span></p>
<p><span class=rvts9>.</span></p>
<p><span class=rvts9>}</span></p>
<p><span class=rvts9>&nbsp;</span></p>
<p><span class=rvts9>&nbsp;</span></p>
<p><span class=rvts7>&nbsp;</span></p>
<p><span class=rvts11>Mats Dal</span></p>
<p><span class=rvts12>Senior Software Engineer 1</span></p>
<p><br></p>
<p><span class=rvts12>Tel 861</span></p>
<p><span class=rvts12>Fax +46 8 658 78 99</span></p>
<p><span class=rvts12>Cell 0709-549851</span></p>
<p><a class=rvts13 href="mailto:Mats.Dal@dice.se">Mats.Dal@dice.se</a></p>
<p><br></p>
<p><span class=rvts11>DICE</span></p>
<p><br></p>
<p><span class=rvts12>EA Digital Illusions CE AB</span></p>
<p><span class=rvts12>Katarinavägen 15</span></p>
<p><span class=rvts12>P.O. Box 20068</span></p>
<p><span class=rvts12>SE-104 60 Stockholm, Sweden</span></p>
<p><a class=rvts13 href="http://www.dice.se">www.dice.se</a></p>
<p><br></p>
<p><br></p>
<p><span class=rvts12>Corporate Registration Number: 556710-6520&nbsp;</span></p>
<p><br></p>
<p><br></p>
<p><br></p>
<p><span class=rvts12>&nbsp;</span><span class=rvts14>&nbsp;</span></p>
</td>
</tr>
</table>
</div>

</body></html>