<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:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" 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 12 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle24
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle25
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle26
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle27
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle28
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle30
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</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=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Great work! Thanks for making the test. Can you put this in
bugzilla (<a href="http://deuce.doc.wustl.edu/bugzilla/index.cgi">http://deuce.doc.wustl.edu/bugzilla/index.cgi</a>).
Be aware of our bug fixing policies as described in the docs/ACE-bug-process.html
document<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Regards,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;color:#1F497D'>Johnny
Willemsen<br>
Remedy IT<br>
Postbus 101<br>
2650 AC&nbsp; Berkel en Rodenrijs<br>
The Netherlands<br>
www.theaceorb.nl / www.remedy.nl&nbsp;<br>
<br>
*** Integrated compile and test statistics see <a
href="http://scoreboard.theaceorb.nl">http://scoreboard.theaceorb.nl</a> ***<br>
*** Commercial service and support for
ACE/TAO/CIAO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
***<br>
*** See <a href="http://www.theaceorb.nl/en/support.html">http://www.theaceorb.nl/en/support.html</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
***</span><span style='color:#1F497D'> </span><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Rudy Pot
[mailto:rpot@aweta.nl] <br>
<b>Sent:</b> Tuesday, March 11, 2008 3:18 PM<br>
<b>To:</b> Johnny Willemsen; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Hi,</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Below you can find&nbsp;an extended version of the
ACE_wrappers/tests/Message_Queue_Notifications_Test.cpp</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>The original source was taken from&nbsp;the head of <a
href="https://svn.dre.vanderbilt.edu/viewvc/Middleware/"><strong><span
style='font-size:12.0pt'>[Middleware]</span></strong></a></span><strong><span
style='color:black'> / </span></strong><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:blue'><a
href="https://svn.dre.vanderbilt.edu/viewvc/Middleware/trunk/"><strong><span
style='font-size:12.0pt'>trunk</span></strong></a></span><strong><span
style='color:black'> / </span></strong><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:blue'><a
href="https://svn.dre.vanderbilt.edu/viewvc/Middleware/trunk/ACE/"><strong><span
style='font-size:12.0pt'>ACE</span></strong></a></span><strong><span
style='color:black'> / </span></strong><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:blue'><a
href="https://svn.dre.vanderbilt.edu/viewvc/Middleware/trunk/ACE/tests/"><strong><span
style='font-size:12.0pt'>tests</span></strong></a></span><strong><span
style='color:black'> / Message_Queue_Notifications_Test.cpp</span></strong><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>(Subversion web)</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>NEW TESTS</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Two new tests are added which both can be (de)selected with
defines:</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>1) TEST_CLOSEHOOK: This should test the usecase where notify() race
conditions can occur when an Task EH uses &quot;delete this&quot; in its close
hook. </span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>However,&nbsp;the race condition&nbsp;is not&nbsp;reproducable for
sure. </span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>I have&nbsp;had a segmentation fault only once and unfortunately at
that time&nbsp;coredump was not active on my test system.</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>I tried to increase the chance of race condition by adding an
iteration loop but that didn't help either...</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Any ideas for getting the race condition addressed for sure might
be useful.</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>2) TEST_FULLNOTIFY: This tests the deadlock-usecase (notified
message enqueue with full reactor notification pipe).</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>On&nbsp;our test scoreboard this test will timeout when the
deadlock occurs (maximum run time per test allowed)</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>The deadlock is always adressed whith the latest version of ACE.</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>NOTES:</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>If you want to use this, two things have to be looked at before
checking in:</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>1) #includes section: I had to change some includes in order to get
the test through&nbsp;our compilers and the ACE versions used for the different
platforms (W32 BCB ACE-5.3.1,&nbsp;RH9&nbsp;gcc ACE-5.3.1,&nbsp;FC6&nbsp;gcc
ACE-5.5.6)</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>2) &quot;ACE_TMAIN (int, ACE_TCHAR *[])&quot; probably to be
replaced with &quot;run_main (int, ACE_TCHAR *[])&quot; ?<br>
(In subversion it was &quot;run_main&quot; but that doesn't work with the ACE
versions we use, which are probably already very old...).</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>By the way,&nbsp;some minor change&nbsp;has been
made&nbsp;in&nbsp;the code so the default_message = &quot;ACE RULES&quot; is
used for all the test cases which enqueue messages...</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Message_Queue_T.cpp:</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>For now, I've patched this code to avoid deadlocks. In our
applications we don't use &quot;delete this&quot; on any EH so we won't get
struck by the race conditions.</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>A suggested fix for both of the Message_Queue_T.cpp notify problems
(race / deadlock) is in my second post in this bug-thread (Feb 27 2008 3:37pm).
See also FIX CODE EXAMPLE&nbsp;below in this post.&nbsp;However that is only
pseudo code, not fully worked out. It probably also needs modifications in the
Notification_Strategy and Reactor classes.</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Regards,</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><strong><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Rudy&nbsp;Pot</span></strong><o:p></o:p></p>

<div>

<div>

<div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Embedded Computer Systems</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><strong><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>AWETA G&amp;P b.v</span></strong><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Postbox 17</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>NL-2630 AA&nbsp; Nootdorp</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>tel +31 (0)15 3109961 </span><o:p></o:p></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>fax&nbsp;+31 (0)15 3107321 </span><o:p></o:p></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>mail&nbsp;</span><a href="mailto:rpot@aweta.nl"><span
style='font-size:10.0pt;font-family:"Arial","sans-serif"'>rpot@aweta.nl</span></a><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>web <a href="blocked::http://www.aweta.com">www.aweta.com</a></span><o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>// ============================================================================</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>// $Id: Message_Queue_Notifications_Test.cpp 10757 2008-03-10
11:41:40Z rpot $</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//
============================================================================<br>
//<br>
// = LIBRARY<br>
//&nbsp;&nbsp;&nbsp; tests<br>
//<br>
// = FILENAME<br>
//&nbsp;&nbsp;&nbsp; Message_Queue_Notification_Test.cpp<br>
//<br>
// = DESCRIPTION<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There are two tests that test 2 different
notification<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mechanisms in Message Queue.<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The first test illustrates the notification
mechanisms in<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message_Queue and its integration with
Reactor.<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Note the following things about this part of
the test:<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. Multiple threads are not required.<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. You do not have to explicitly notify the
Reactor<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. This code will work the same with any
Reactor Implementation<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. handle_input, handle_exception,
handle_output are the only<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callbacks supported by this
mechanism<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. The notification mechanism need not notify
the Reactor. You can<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; write your own strategy
classes that can do whatever application<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specific behavior you want.<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The second test also makes sure the high/low
water mark<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; signaling mechanism works flawlessly.<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The third test handles the use case of
notification strategy in <br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combination with EH &quot;delete this&quot;
termination.<br>
//<br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There is also a fourth stress test added for
addressing possible <br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notification deadlocks. It look similar as the
first test but needs <br>
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threads. If deadlock occurs, this test has to
be killed to terminate.<br>
//<br>
// = AUTHOR<br>
//&nbsp;&nbsp;&nbsp; Irfan Pyarali &lt;<a href="mailto:irfan@cs.wustl.edu">irfan@cs.wustl.edu</a>&gt;
and Nanbor Wang &lt;<a href="mailto:nanbor@cs.wustl.edu">nanbor@cs.wustl.edu</a>&gt;<br>
//<br>
// ============================================================================<br>
#include &quot;test_config.h&quot;<br>
#include &quot;ace/Reactor.h&quot;<br>
#include &quot;ace/Task.h&quot;<br>
#include &quot;ace/Reactor_Notification_Strategy.h&quot;<br>
#include &quot;ace/Atomic_Op.h&quot;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#ifndef ACE_SYNCH_H<br>
#include &quot;ace/Synch.h&quot;<br>
#endif<br>
//#include &quot;ace/Barrier.h&quot;<br>
//#include &quot;ace/Synch_Traits.h&quot;<br>
//#include &quot;ace/Null_Condition.h&quot;<br>
//#include &quot;ace/Null_Mutex.h&quot;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>// Are below includes needed?<br>
//#include &quot;ace/OS_NS_string.h&quot;<br>
//#include &quot;ace/OS_NS_unistd.h&quot;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>ACE_RCSID(tests, Message_Queue_Notifications_Test, &quot;$Id:
Message_Queue_Notifications_Test.cpp 10757 2008-03-10 11:41:40Z rpot $&quot;)</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>static int iterations = 10;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>static const size_t worker_threads = 2;<br>
static const char * default_message = &quot;ACE RULES&quot;;<br>
static const size_t default_high_water_mark = 20;<br>
static const size_t default_low_water_mark = 10;<br>
static const int watermark_iterations = 2 * default_high_water_mark;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#define TEST_CLOSEHOOK&nbsp; 1&nbsp; // Test for Message_Queue_T
notify race conditions.<br>
#define TEST_FULLNOTIFY 1&nbsp; // Test for Message_Queue_T notify deadlock.</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
class Message_Handler : public ACE_Task&lt;ACE_NULL_SYNCH&gt;<br>
{<br>
&nbsp; // = TITLE<br>
&nbsp; //&nbsp;&nbsp; This class implements a notification strategy for the
Reactor.<br>
public:<br>
&nbsp; // = Initialization and termination.<br>
&nbsp; Message_Handler (ACE_Reactor &amp;reactor);<br>
&nbsp; // Constructor.</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Demuxing hooks.<br>
&nbsp; virtual int handle_input (ACE_HANDLE);<br>
&nbsp; virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);<br>
&nbsp; virtual int handle_exception (ACE_HANDLE fd = ACE_INVALID_HANDLE);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>private:<br>
&nbsp; int process_message (void);<br>
&nbsp; void make_message (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_Reactor_Notification_Strategy notification_strategy_;<br>
};</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
class Watermark_Test : public ACE_Task&lt;ACE_SYNCH&gt;<br>
{<br>
&nbsp; // = TITLE<br>
&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; This class test the correct functioning of
build-in flow<br>
&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; control machanism in ACE_Task.<br>
public:<br>
&nbsp; Watermark_Test (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; virtual int svc (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; int consumer (void);<br>
&nbsp; int producer (void);<br>
&nbsp; int put_message (ACE_Time_Value* timeout = 0);<br>
&nbsp; int get_message (void);<br>
&nbsp; void print_producer_debug_message (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>private:<br>
&nbsp; const size_t len_;<br>
&nbsp; const size_t hwm_;<br>
&nbsp; const size_t lwm_;<br>
&nbsp; ACE_Atomic_Op &lt;ACE_SYNCH_MUTEX, int&gt; role_;<br>
#if defined (ACE_HAS_THREADS)<br>
&nbsp; ACE_Barrier mq_full_;<br>
&nbsp; ACE_Barrier mq_low_water_mark_hit_;<br>
#endif /* ACE_HAS_THREADS */<br>
};</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
#if defined (ACE_HAS_THREADS)</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#if defined (TEST_CLOSEHOOK)<br>
class CloseHook_Handler : public ACE_Task&lt;ACE_MT_SYNCH&gt;<br>
{<br>
&nbsp; // = TITLE<br>
&nbsp; //&nbsp;&nbsp; This class tests the behaviour of the Task &lt;close&gt;
hook called in <br>
&nbsp; //&nbsp;&nbsp; combination with notified MB_STOP message enqueing.<br>
&nbsp; //&nbsp;&nbsp; It should normally cause this dynamically created task
(EH) to <br>
&nbsp; //&nbsp;&nbsp; gracefully delete itself.<br>
public:<br>
&nbsp; // = Initialization and termination.<br>
&nbsp; CloseHook_Handler (ACE_Reactor &amp;reactor);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Demuxing hooks.<br>
&nbsp; virtual int handle_input (ACE_HANDLE);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Starts the threads needed for testing.<br>
&nbsp; virtual int open (void *args = 0); </span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>private:<br>
&nbsp; // = Ensure dynamic creation.<br>
&nbsp; virtual ~CloseHook_Handler ();</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Svc hook.<br>
&nbsp; virtual int svc (void);<br>
&nbsp; // = Hook called from &lt;ACE_Thread_Exit&gt; during thread exit.<br>
&nbsp; virtual int close (u_long flags = 0);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_Reactor_Notification_Strategy&nbsp;&nbsp;
notification_strategy_;<br>
&nbsp;
ACE_Barrier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
startupBarrier_; <br>
&nbsp; ACE_Message_Block::ACE_Message_Type messageType_;<br>
};<br>
#endif /* TEST_CLOSEHOOK */</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
#if defined (TEST_FULLNOTIFY)<br>
class FullNotify_Handler : public ACE_Task&lt;ACE_MT_SYNCH&gt;<br>
{<br>
&nbsp; // = TITLE<br>
&nbsp; //&nbsp;&nbsp; This class tests the behaviour of (notified) message
enqueing at a point <br>
&nbsp; //&nbsp;&nbsp; when the Reactor notification pipe is full. It should
then just block.<br>
&nbsp; //&nbsp;&nbsp; After the (consumer) Reactor eventloop has handled some
pending <br>
&nbsp; //&nbsp;&nbsp; notifications, the notifiers (producer threads) should
just get unblocked.<br>
public:<br>
&nbsp; // = Initialization and termination.<br>
&nbsp; FullNotify_Handler (ACE_Reactor &amp;reactor);<br>
&nbsp; virtual ~FullNotify_Handler ();</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Demuxing hooks.<br>
&nbsp; virtual int handle_input (ACE_HANDLE);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // = Starts the threads needed for testing.<br>
&nbsp; virtual int open (void *args = 0); </span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>private:<br>
&nbsp; // = Svc hook.<br>
&nbsp; virtual int svc (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; void make_message (void);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_Reactor_Notification_Strategy notification_strategy_;<br>
&nbsp; static const int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
iMAX_NR_THREADS = 2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<br>
&nbsp; // Identifiers needed when we have more than one thread active.<br>
&nbsp;
ACE_thread_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
thread_ids_[iMAX_NR_THREADS];&nbsp; <br>
};<br>
#endif /* TEST_FULLNOTIFY */</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#endif /* ACE_HAS_THREADS */</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
Message_Handler::Message_Handler (ACE_Reactor &amp;reactor)<br>
&nbsp; // First time handle_input will be called<br>
&nbsp; : notification_strategy_ (&amp;reactor,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Event_Handler::READ_MASK)<br>
{<br>
&nbsp; this-&gt;msg_queue ()-&gt;notification_strategy
(&amp;this-&gt;notification_strategy_);<br>
&nbsp; this-&gt;make_message ();<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Message_Handler::handle_input (ACE_HANDLE)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message_Handler::handle_input\n&quot;)));</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // Next time handle_output will be called.<br>
&nbsp; this-&gt;notification_strategy_.mask (ACE_Event_Handler::WRITE_MASK);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return process_message ();<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Message_Handler::handle_output (ACE_HANDLE fd)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message_Handler::handle_output\n&quot;)));<br>
&nbsp; ACE_UNUSED_ARG (fd);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // Next time handle_exception will be called.<br>
&nbsp; this-&gt;notification_strategy_.mask (ACE_Event_Handler::EXCEPT_MASK);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return process_message ();<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Message_Handler::handle_exception (ACE_HANDLE fd)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message_Handler::handle_exception\n&quot;)));<br>
&nbsp; ACE_UNUSED_ARG (fd);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // Next time handle_input will be called.<br>
&nbsp; this-&gt;notification_strategy_.mask (ACE_Event_Handler::READ_MASK);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return this-&gt;process_message ();<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Message_Handler::process_message (void)<br>
{<br>
&nbsp; ACE_Message_Block *mb;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; if (this-&gt;getq (mb,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(ACE_Time_Value *) &amp;ACE_Time_Value::zero) == -1)<br>
&nbsp;&nbsp;&nbsp; ACE_ERROR_RETURN ((LM_ERROR,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;%p\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;dequeue_head&quot;)),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1);<br>
&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;message received = %s\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mb-&gt;rd_ptr ()));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mb-&gt;release ();<br>
&nbsp;&nbsp;&nbsp; }</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; this-&gt;make_message ();<br>
&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>void<br>
Message_Handler::make_message (void)<br>
{<br>
&nbsp; if (--iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Message_Block *mb;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW (mb,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Message_Block (default_message));</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;sending message\n&quot;)));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;putq (mb);<br>
&nbsp;&nbsp;&nbsp; }<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
Watermark_Test::Watermark_Test (void)<br>
&nbsp; : len_ (ACE_OS::strlen (default_message) + 1),<br>
&nbsp;&nbsp;&nbsp; hwm_ (this-&gt;len_ * default_high_water_mark),<br>
&nbsp;&nbsp;&nbsp; lwm_ (this-&gt;len_ * default_low_water_mark),<br>
&nbsp;&nbsp;&nbsp; role_ (0)<br>
#if defined (ACE_HAS_THREADS)<br>
&nbsp;&nbsp;&nbsp; , mq_full_ (worker_threads),<br>
&nbsp;&nbsp;&nbsp; mq_low_water_mark_hit_ (worker_threads)<br>
#endif /* ACE_HAS_THREADS */<br>
{<br>
&nbsp; this-&gt;water_marks (ACE_IO_Cntl_Msg::SET_LWM,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;lwm_);<br>
&nbsp; this-&gt;water_marks (ACE_IO_Cntl_Msg::SET_HWM,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;hwm_);<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Watermark_Test::producer (void)<br>
{<br>
&nbsp; int i = watermark_iterations;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; for (ssize_t hwm = this-&gt;hwm_;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hwm &gt;= 0 ;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hwm -= this-&gt;len_)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;put_message ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;print_producer_debug_message ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i--;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this-&gt;msg_queue ()-&gt;is_full ())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; }<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;(%P|%t) Producer: High water mark hit ---- \n&quot;)));</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_MT (this-&gt;mq_full_.wait ());</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // The following put_message should block until the message
queue<br>
&nbsp; // has dropped under the lwm.<br>
&nbsp; this-&gt;put_message ();</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_ASSERT (this-&gt;msg_queue ()-&gt; message_bytes ()
&lt;= this-&gt;lwm_ + this-&gt;len_);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; this-&gt;print_producer_debug_message ();</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; for (i--; i &gt;= 0 ; i--)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;put_message ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;print_producer_debug_message ();<br>
&nbsp;&nbsp;&nbsp; }</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Watermark_Test::consumer (void)<br>
{<br>
&nbsp; ACE_MT (this-&gt;mq_full_.wait ());</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_OS::sleep (1);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // Let producer proceed and block in putq.</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; for (int i = watermark_iterations; i &gt;= 0; i--)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;get_message ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::sleep (0);<br>
&nbsp;&nbsp;&nbsp; }</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Watermark_Test::get_message (void)<br>
{<br>
&nbsp; ACE_Message_Block *mb;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; if (this-&gt;getq (mb) == -1)<br>
&nbsp;&nbsp;&nbsp; ACE_ERROR_RETURN ((LM_ERROR,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;%p\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;dequeue_head&quot;)),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1);<br>
&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;(%P|%t) Consumer: message size = %3d, &quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;message count = %3d\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;msg_queue ()-&gt; message_bytes (),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;msg_queue ()-&gt; message_count ()));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mb-&gt;release ();<br>
&nbsp;&nbsp;&nbsp; }</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Watermark_Test::put_message (ACE_Time_Value *timeout)<br>
{<br>
&nbsp; ACE_Message_Block *mb;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_NEW_RETURN (mb,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Message_Block (default_message,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;len_),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1);</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return this-&gt;putq (mb, timeout);<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>void<br>
Watermark_Test::print_producer_debug_message (void)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;(%P|%t) Producer: message size = %3d, &quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;message count = %3d\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;msg_queue ()-&gt; message_bytes (),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this-&gt;msg_queue ()-&gt; message_count ()));<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
Watermark_Test::svc (void)<br>
{<br>
&nbsp; // this-&gt;role_ is an Atomic_Op object.<br>
&nbsp; int role = this-&gt;role_++;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; switch (role)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; case 0:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;producer ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; case 1:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;consumer ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'><br>
//-----------------------------------------------------------------------------<br>
#if defined (ACE_HAS_THREADS)<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#if defined (TEST_CLOSEHOOK)<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>CloseHook_Handler::CloseHook_Handler (ACE_Reactor &amp;reactor)<br>
&nbsp; : notification_strategy_ (&amp;reactor,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Event_Handler::READ_MASK)<br>
&nbsp; , startupBarrier_(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
Barrier for ourself and the new thread.<br>
&nbsp; , messageType_(ACE_Message_Block::MB_NORMAL)<br>
{<br>
&nbsp; this-&gt;msg_queue()-&gt;notification_strategy
(&amp;this-&gt;notification_strategy_);<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>CloseHook_Handler::~CloseHook_Handler()<br>
{<br>
&nbsp; if (this-&gt;reactor() != 0)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; // Remove ourself from reactor Eh queue (don't call
handle_close).<br>
&nbsp;&nbsp;&nbsp; this-&gt;reactor()-&gt;remove_handler(this,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Event_Handler::READ_MASK |<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Event_Handler::DONT_CALL&nbsp; );<br>
&nbsp;&nbsp;&nbsp; this-&gt;reactor(0); <br>
&nbsp; };<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
CloseHook_Handler::handle_input (ACE_HANDLE)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;CloseHook_Handler::handle_input\n&quot;)));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; // All messages handled in svc().<br>
&nbsp; return 0; // Stay registered.<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
CloseHook_Handler::open (void *args)<br>
{<br>
&nbsp; ACE_UNUSED_ARG (args);<br>
&nbsp; if (this-&gt;activate(THR_NEW_LWP | THR_DETACHED) &lt; 0)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_ERROR_RETURN ((LM_ERROR<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,ACE_TEXT (&quot;CloseHook_Handler::open, activate ERROR(%s)!\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,strerror(ACE_OS::last_error())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
),-1);<br>
&nbsp; };<br>
&nbsp; startupBarrier_.wait();<br>
&nbsp; return 0;<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
CloseHook_Handler::svc (void)<br>
{<br>
ACE_Message_Block *pMb=0;<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; startupBarrier_.wait();<br>
&nbsp; while (messageType_ != ACE_Message_Block::MB_STOP)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; if (this-&gt;msg_queue()-&gt;dequeue_head(pMb) &gt;= 0)
//&nbsp; Block on input queue.<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messageType_ = pMb-&gt;msg_type();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pMb-&gt;release();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG, ACE_TEXT
(&quot;CloseHook_Handler::svc[t=%t]: pMb-&gt;release()\n&quot;)));<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_WARNING,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;CloseHook_Handler::svc: Invalid message dequeued!\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
));<br>
&nbsp;&nbsp;&nbsp; };<br>
&nbsp; };<br>
&nbsp; return 0;<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int <br>
CloseHook_Handler::close (u_long flags)<br>
{<br>
&nbsp; ACE_UNUSED_ARG (flags);<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,ACE_TEXT (&quot;CloseHook_Handler::close hook
called.\n&quot;)));<br>
&nbsp; // Service thread has exited, and this object is now invalid.<br>
&nbsp; delete this;<br>
&nbsp; return 0;<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#endif /* TEST_CLOSEHOOK */<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
#if defined (TEST_FULLNOTIFY)<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>FullNotify_Handler::FullNotify_Handler (ACE_Reactor &amp;reactor)<br>
&nbsp; : notification_strategy_ (&amp;reactor,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Event_Handler::READ_MASK)<br>
{<br>
&nbsp; this-&gt;reactor(&amp;reactor);<br>
&nbsp; this-&gt;msg_queue()-&gt;notification_strategy (&amp;this-&gt;notification_strategy_);<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>FullNotify_Handler::~FullNotify_Handler()<br>
{<br>
&nbsp; this-&gt;wait();<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
FullNotify_Handler::handle_input (ACE_HANDLE)<br>
{<br>
&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;FullNotify_Handler::handle_input\n&quot;)));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_Message_Block *mb;<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; if (this-&gt;msg_queue()-&gt;is_empty())<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message queue is empty!\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
));<br>
&nbsp; else if (this-&gt;getq (mb,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(ACE_Time_Value *) &amp;ACE_Time_Value::zero) == -1)<br>
&nbsp;&nbsp;&nbsp; ACE_ERROR_RETURN ((LM_ERROR,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;%p\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;dequeue_head&quot;)),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1);<br>
&nbsp; else<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;message received = %s\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mb-&gt;rd_ptr ()));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mb-&gt;release ();<br>
&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; return 0; // Stay registered.<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
FullNotify_Handler::open (void *args)<br>
{<br>
&nbsp; ACE_UNUSED_ARG (args);<br>
&nbsp; // Activate the threads: Most are default parms, except n_threads <br>
&nbsp; // and thread_ids_.<br>
&nbsp; // thread_ids_ is used to distinguise between the threads.<br>
&nbsp; if
(this-&gt;activate(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Activate the svc() <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
THR_NEW_LWP | THR_JOINABLE&nbsp;&nbsp; // (default) flags.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,iMAX_NR_THREADS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// - n_threads <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) force_active<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,ACE_DEFAULT_THREAD_PRIORITY&nbsp; // (default) priority<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) grp_id<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) *task<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) thread_handles[]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) *stack[]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (default) stack_size[]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,thread_ids_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// - thread_ids[]&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
) &lt; 0)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_ERROR_RETURN ((LM_ERROR<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,ACE_TEXT (&quot;FullNotify_Handler::open, activate ERROR(%s)!\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,strerror(ACE_OS::last_error())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
),-1);<br>
&nbsp; };<br>
&nbsp; return 0;<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>int<br>
FullNotify_Handler::svc (void)<br>
{<br>
int iNotifications=0;<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; //ACE_DEBUG((LM_ERROR, &quot;&gt;&gt;
FullNotify_Handler::svc(%t)\n&quot;));<br>
&nbsp; //--------------------------------------------<br>
&nbsp; if (ACE_Thread::self() == thread_ids_[0]) <br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; // [Thread 0]<br>
&nbsp;&nbsp;&nbsp; // Hit the reactor's notification queue until it is full.<br>
&nbsp;&nbsp;&nbsp; // We can only continue if main thread handles the reactor
notifications.<br>
&nbsp;&nbsp;&nbsp; // Global 'iterations' will countdown if next thread
performs 'make_message'.<br>
&nbsp;&nbsp;&nbsp; while (iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;(%t) Reactor notification (%d)\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,iNotifications++<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Notify the Reactor, which will
call our &lt;handle_input&gt;.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Timeout when notify pipe is full? Somehow it
isn't full when timeout<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // occurs.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; FC6: <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; - With timeout parm:&nbsp;&nbsp;&nbsp;
108 x notify until timeout occurs.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; - Without timeout parm: 432 x notify
until it blocks.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ACE_Time_Value timeout (10);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //this-reactor()-&gt;notify (this,
ACE_Event_Handler::READ_MASK, &amp;timeout);<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;reactor()-&gt;notify (this,
ACE_Event_Handler::READ_MASK);<br>
&nbsp;&nbsp;&nbsp; };<br>
&nbsp; }<br>
&nbsp; //--------------------------------------------<br>
&nbsp; else if (ACE_Thread::self() == thread_ids_[1])<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; // [Thread 1]<br>
&nbsp;&nbsp;&nbsp; // Use Message_Queue and hit the notification queue again
(blocks).<br>
&nbsp;&nbsp;&nbsp; // We can only continue if main thread handles the reactor
notifications.<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // Sleep some time until notification pipe is
full?<br>
&nbsp;&nbsp;&nbsp; ACE_OS::sleep(2); <br>
&nbsp;&nbsp;&nbsp; while (iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;make_message();<br>
&nbsp;&nbsp;&nbsp; };<br>
&nbsp; };<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; //ACE_DEBUG((LM_ERROR, &quot;&lt;&lt;
FullNotify_Handler::svc(%t)\n&quot;));<br>
&nbsp; return 0;<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>void<br>
FullNotify_Handler::make_message (void)<br>
{<br>
&nbsp; if (--iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Message_Block *mb;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW (mb,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Message_Block (default_message));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;sending message\n&quot;)));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;putq (mb);<br>
&nbsp;&nbsp;&nbsp; }<br>
}<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#endif /* TEST_FULLNOTIFY */<br>
#endif /* ACE_HAS_THREADS */<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//-----------------------------------------------------------------------------<br>
int<br>
//run_main (int, ACE_TCHAR *[])<br>
ACE_TMAIN (int, ACE_TCHAR *[])<br>
{<br>
&nbsp; ACE_START_TEST (ACE_TEXT (&quot;Message_Queue_Notifications_Test&quot;));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;\nStarting message queue reactive notification
test...\n&quot;)));<br>
&nbsp; <br>
&nbsp;&nbsp;&nbsp; ACE_Reactor reactor;<br>
&nbsp;&nbsp;&nbsp; Message_Handler mh (reactor);<br>
&nbsp; <br>
&nbsp;&nbsp;&nbsp; while (iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor.handle_events ();<br>
&nbsp; }<br>
#if defined (ACE_HAS_THREADS)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;\nStarting message queue watermark test...\n&quot;)));<br>
&nbsp;&nbsp;&nbsp; Watermark_Test watermark_test;<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;High water mark is %d\n&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Low water mark is %d\n&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default_high_water_mark,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
default_low_water_mark));<br>
&nbsp; <br>
&nbsp;&nbsp;&nbsp; watermark_test.activate (THR_NEW_LWP | THR_DETACHED,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
worker_threads);<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // This frees the memory used by the DETACHED
thread.<br>
&nbsp;&nbsp;&nbsp; ACE_Thread_Manager::instance ()-&gt;wait ();<br>
&nbsp; }<br>
#else<br>
&nbsp; ACE_DEBUG ((LM_INFO,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message queue watermark test not performed because threads are
not supported\n&quot;)));<br>
#endif /* ACE_HAS_THREADS */<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#if !defined (TEST_CLOSEHOOK)<br>
&nbsp; ACE_DEBUG ((LM_INFO,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Task &lt;close&gt; hook trigger test not used.\n&quot;)));<br>
#elif defined (ACE_HAS_THREADS)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;\nStarting test: Task &lt;close&gt; hook triggered by notified
message enqueue...\n&quot;)));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;
ACE_Reactor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor;<br>
&nbsp;&nbsp;&nbsp; CloseHook_Handler* pChh&nbsp; = 0;<br>
&nbsp;&nbsp;&nbsp; ACE_Message_Block* pMBlk = 0;<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; for (int iIterations=0; iIterations&lt;10;
iIterations++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Dynamically allocate Task EH which deletes
itself after MB_STOP <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // is received.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN (pChh,
CloseHook_Handler(reactor), -1);<br>
&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start svc thread.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChh-&gt;open();<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Just enqueue some normal
messages.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN( pMBlk, ACE_Message_Block(0,
ACE_Message_Block::MB_NORMAL), -1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChh-&gt;putq( pMBlk );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN( pMBlk, ACE_Message_Block(0,
ACE_Message_Block::MB_NORMAL), -1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChh-&gt;putq( pMBlk );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN( pMBlk, ACE_Message_Block(0,
ACE_Message_Block::MB_NORMAL), -1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChh-&gt;putq( pMBlk );<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Quit svc thread and let task
delete itself (and see what happens).<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN( pMBlk, ACE_Message_Block(0,
ACE_Message_Block::MB_STOP), -1);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChh-&gt;putq( pMBlk );<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This frees the memory used by the
DETACHED thread.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Thread_Manager::instance ()-&gt;wait ();<br>
&nbsp;&nbsp;&nbsp; };<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; }<br>
#else<br>
&nbsp; ACE_DEBUG ((LM_INFO,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Task &lt;close&gt; hook trigger test not performed because
threads are not supported\n&quot;)));<br>
#endif /* ACE_HAS_THREADS */<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>#if !defined (TEST_FULLNOTIFY)<br>
&nbsp; ACE_DEBUG ((LM_INFO,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Blocking (full) notification test not used.\n&quot;)));<br>
#elif defined (ACE_HAS_THREADS)<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_DEBUG ((LM_DEBUG,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;\nStarting test: message enqueue with blocking (full)
notification...\n&quot;)));<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // Global message enqueue iterations.<br>
&nbsp;&nbsp;&nbsp; iterations = 10;&nbsp; <o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; ACE_Reactor reactor;<br>
&nbsp;&nbsp;&nbsp; FullNotify_Handler fnh (reactor); <o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // Start producer threads.<br>
&nbsp;&nbsp;&nbsp; fnh.open();<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // Sleep until notification pipe is full and all
producer threads block.<br>
&nbsp;&nbsp;&nbsp; ACE_OS::sleep(4); <o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; // Empty the notification pipe so producers
should normally unblock.<br>
&nbsp;&nbsp;&nbsp; while (iterations &gt; 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor.handle_events ();<br>
&nbsp; }<br>
#else<br>
&nbsp; ACE_DEBUG ((LM_INFO,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_TEXT (&quot;Message enqueue with full notification test not performed
because threads are not supported\n&quot;)));<br>
#endif /* ACE_HAS_THREADS */<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; ACE_END_TEST;<br>
&nbsp; return 0;<br>
}</span><o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div class=MsoNormal align=center style='text-align:center'>

<hr size=2 width="100%" align=center>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Greg Popovitch [mailto:gpy@altair.com] <br>
<b>Sent:</b> woensdag 27 februari 2008 21:35<br>
<b>To:</b> Johnny Willemsen; Rudy Pot; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny, I understand completely. I hope someone will provide the
regression test (I can&#8217;t). Thanks for the help.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>greg<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Johnny Willemsen
[mailto:jwillemsen@remedy.nl] <br>
<b>Sent:</b> Wednesday, February 27, 2008 3:32 PM<br>
<b>To:</b> Greg Popovitch; 'Rudy Pot'; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Even when a deadlock can be shown on paper, we do need to have a
regression test that triggers it. That way we can see it ourselves as core
developers and we can also make sure we don't introduce the problem back in the
future by any other change.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Greg Popovitch
[mailto:gpy@altair.com] <br>
<b>Sent:</b> Wednesday, February 27, 2008 8:14 PM<br>
<b>To:</b> Johnny Willemsen; Rudy Pot; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny, I agree with the usefulness of having regression tests. <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Still, this issue is a clear deadlock situation, which can be
easily explained and understood (see below). I think it is a&nbsp; no-brainer
to remove a known deadlock, occuring when the program is running and busy, even
if there is a chance of a race condition at exit. &nbsp;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Deadlock explaination:<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoPlainText>In my enqueuing thread:<o:p></o:p></p>

<p class=MsoPlainText>----------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>1/ enqueue a message for the other thread on my own
message queue<o:p></o:p></p>

<p class=MsoPlainText>------------------------------------------------------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(_msg_queue) _msg_queue-&gt;enqueue_head(mb);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>2/ in ACE DLL, enqueue and notify reactor<o:p></o:p></p>

<p class=MsoPlainText>-----------------------------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>template &lt;ACE_SYNCH_DECL&gt; int<o:p></o:p></p>

<p class=MsoPlainText>ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_head
(ACE_Message_Block *new_item,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout) {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; ACE_TRACE (&quot;ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_head&quot;);<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; int queue_count = 0;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T,
ace_mon, this-&gt;lock_, -1);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (this-&gt;state_ ==
ACE_Message_Queue_Base::DEACTIVATED)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errno =
ESHUTDOWN;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (this-&gt;wait_not_full_cond
(ace_mon, timeout) == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; queue_count = this-&gt;enqueue_head_i
(new_item);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (queue_count == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>=&gt;&nbsp;&nbsp;&nbsp; this-&gt;notify ();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; return queue_count;<o:p></o:p></p>

<p class=MsoPlainText>}<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>3/ notification proceeds through, nothing interesting
there<o:p></o:p></p>

<p class=MsoPlainText>-----------------------------------------------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACEd.dll!ACE_Reactor_Notification_Strategy::notify()&nbsp; Line 29<o:p></o:p></p>

<p class=MsoPlainText>C++<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACEd.dll!ACE_Reactor::notify(ACE_Event_Handler * event_handler=0x000000002971bc70,
unsigned long mask=1, ACE_Time_Value * tv=0x00<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACEd.dll!ACE_WFMO_Reactor::notify(ACE_Event_Handler *
event_handler=0x000000002971bc70, unsigned long mask=1, ACE_Time_Value * timeo<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>4/ getting into WFMO reactor which enqueues on its own
message queue<o:p></o:p></p>

<p class=MsoPlainText>--------------------------------------------------------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>int<o:p></o:p></p>

<p class=MsoPlainText>ACE_WFMO_Reactor_Notify::notify (ACE_Event_Handler
*event_handler,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Reactor_Mask mask,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout) {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; if (event_handler != 0)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Message_Block *mb = 0;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_NEW_RETURN (mb,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Message_Block (sizeof (ACE_Notification_Buffer)),<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-1);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Notification_Buffer
*buffer =<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(ACE_Notification_Buffer *) mb-&gt;base ();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer-&gt;eh_ =
event_handler;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer-&gt;mask_ = mask;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Convert from relative
time to absolute time by adding the<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // current time of
day.&nbsp; This is what &lt;ACE_Message_Queue&gt;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expects.<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (timeout != 0)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *timeout +=
timer_queue_-&gt;gettimeofday ();<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(this-&gt;message_queue_.enqueue_tail<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(mb, timeout) == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mb-&gt;release ();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return -1;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event_handler-&gt;add_reference
();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp; return this-&gt;wakeup_one_thread_.signal (); }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>5/ enqueue blocks because queue is full (deadlock because
calling thread is hung in step 1 and will never dequeue)<o:p></o:p></p>

<p class=MsoPlainText>---------------------------------------<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
message_queue_&nbsp;&nbsp;&nbsp; {head_=0x000000006deaf1d0<o:p></o:p></p>

<p class=MsoPlainText>tail_=0x000000007a5826b0 low_water_mark_=16384 ...}<o:p></o:p></p>

<p class=MsoPlainText>ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_Message_Queue_Base<o:p></o:p></p>

<p class=MsoPlainText>{state_=1 } ACE_Message_Queue_Base<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
head_ 0x000000006deaf1d0 {rd_ptr_=0 wr_ptr_=0<o:p></o:p></p>

<p class=MsoPlainText>priority_=0 ...}&nbsp; ACE_Message_Block *<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tail_ 0x000000007a5826b0 {rd_ptr_=0 wr_ptr_=0<o:p></o:p></p>

<p class=MsoPlainText>priority_=0 ...}&nbsp; ACE_Message_Block *<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
low_water_mark_&nbsp;&nbsp; 16384 unsigned __int64<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
high_water_mark_&nbsp; 16384 unsigned __int64<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cur_bytes_&nbsp; 16384 unsigned __int64<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cur_length_ 0&nbsp;&nbsp;&nbsp;&nbsp; unsigned __int64<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cur_count_&nbsp; 1024&nbsp; unsigned __int64<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>template &lt;ACE_SYNCH_DECL&gt; int<o:p></o:p></p>

<p class=MsoPlainText>ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_tail
(ACE_Message_Block *new_item,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout) {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; ACE_TRACE
(&quot;ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_tail&quot;);<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; int queue_count = 0;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T,
ace_mon, this-&gt;lock_, -1);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (this-&gt;state_ ==
ACE_Message_Queue_Base::DEACTIVATED)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errno =
ESHUTDOWN;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>=&gt;&nbsp;&nbsp;&nbsp; if (this-&gt;wait_not_full_cond
(ace_mon, timeout) == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; queue_count = this-&gt;enqueue_tail_i
(new_item);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (queue_count == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; this-&gt;notify ();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; return queue_count;<o:p></o:p></p>

<p class=MsoPlainText>}<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>greg<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Johnny Willemsen
[mailto:jwillemsen@remedy.nl] <br>
<b>Sent:</b> Wednesday, February 27, 2008 1:22 PM<br>
<b>To:</b> Greg Popovitch; 'Rudy Pot'; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block causesSelect_Reactor
deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Also, in order to make such an important change to the core of
ACE, we do need an automated regression test that reproduces the problem. This
must be written like the ACE regression tests under ACE_wrappers/tests. If
someone can make this test and add it to bugzilla, the issue gets higher in the
todo list, without such a test we have to write one, which consumes more time.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Greg Popovitch
[mailto:gpy@altair.com] <br>
<b>Sent:</b> Wednesday, February 27, 2008 5:37 PM<br>
<b>To:</b> Johnny Willemsen; Rudy Pot; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny, I didn&#8217;t mean any offense. You do confirm my observation
with the statement: &#8220;people don't have time anymore to just fix these kind of
issues without funding&#8221;. I am sorry that this is the case, as I really like
ACE. &nbsp;But I strongly feel that &nbsp;if there is not anyone who feels
enough sense of ownership to fix clear bugs like this one, then it is hard to
justify using ACE in any project which doesn&#8217;t allocate specific funding for
ACE maintenance.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Now again that&#8217;s fine with me, and I certainly don&#8217;t ask anyone
to provide a service for free. However in the light of my own experience
(serious bug fixed in 2002, reintroduced in 2003 and still there in 2008), I
tend to disagree with the statement in ACE&#8217;s overview: &#8220;</span>ACE continues to
improve and its <a href="http://www.cs.wustl.edu/%7Eschmidt/ACE-future.html">future</a>
is bright&#8221;.<span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>greg<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Johnny Willemsen
[mailto:jwillemsen@remedy.nl] <br>
<b>Sent:</b> Wednesday, February 27, 2008 11:20 AM<br>
<b>To:</b> Greg Popovitch; 'Rudy Pot'; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Please read docs/ACE-bug-process.html, the issue is more that
people don't have time anymore to just fix these kind of issues without
funding. This is a change in the core of ACE which has to be investigated,
reviewed, tested, all taking time. At the moment someone is willing to fund
such a change there are multiple people that would be willing to work on this.
We as Remedy IT do fix issues on the doc_group release without funding, but our
budgets for doing that are limited, at the end we also have to pay our bills.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Greg Popovitch
[mailto:gpy@altair.com] <br>
<b>Sent:</b> Wednesday, February 27, 2008 5:13 PM<br>
<b>To:</b> Rudy Pot; Johnny Willemsen; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Rudy, I reported the exact same issue and diagnostic a couple of
months ago (see mailing list on 11/29/2007 and 11/30/2007). Even though this is
a clear bug, it seemed to me that there was no one in particular planning to
fix the code. I ended up patching my own version, moving the notify() in the
code below one line down after the closing brace, so it would be out of the
scope of the ACE_GUARD. This fixes the issue and &nbsp;I have not seen any
termination race conditions.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoPlainText>template &lt;ACE_SYNCH_DECL&gt; int<o:p></o:p></p>

<p class=MsoPlainText>ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_head
(ACE_Message_Block *new_item,<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout) {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; ACE_TRACE
(&quot;ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_head&quot;);<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; int queue_count = 0;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T,
ace_mon, this-&gt;lock_, -1);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (this-&gt;state_ ==
ACE_Message_Queue_Base::DEACTIVATED)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errno =
ESHUTDOWN;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (this-&gt;wait_not_full_cond
(ace_mon, timeout) == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; queue_count = this-&gt;enqueue_head_i
(new_item);<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; if (queue_count == -1)<o:p></o:p></p>

<p class=MsoPlainText>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<o:p></o:p></p>

<p class=MsoPlainText><o:p>&nbsp;</o:p></p>

<p class=MsoPlainText>=&gt;&nbsp;&nbsp;&nbsp; this-&gt;notify ();<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; }<o:p></o:p></p>

<p class=MsoPlainText>&nbsp; return queue_count;<o:p></o:p></p>

<p class=MsoPlainText>}<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ace-bugs-bounces@cse.wustl.edu [mailto:ace-bugs-bounces@cse.wustl.edu] <b>On
Behalf Of </b>Rudy Pot<br>
<b>Sent:</b> Wednesday, February 27, 2008 10:30 AM<br>
<b>To:</b> Johnny Willemsen; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> Re: [ace-bugs] [ACE_Message_Queue] notify PIPE block
causesSelect_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Hi Johnny,</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Thanks for your quick response!</span><o:p></o:p></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>I have had a closer look at all related bug messages and now I see
that my <br>
problem is already quite old (sorry for that).</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Correct me if I'm wrong but as far as I can see now there are two
problems <br>
with ace/Message_Queue_T.cpp:</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>1) Sun May&nbsp; 5 19:14:34 2002&nbsp; Douglas C. Schmidt&nbsp;
&lt;<a href="mailto:schm...@macarena.cs.wustl.edu">schm...@macarena.cs.wustl.edu</a>&gt;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
ace/Message_Queue_T.cpp: Modified all the enqueue*() methods so that<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; their calls to notify()
occur *outside* of the monitor lock.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This change prevents
deadlock from occurring when a reactor's<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notification pipe is
full.&nbsp; Thanks to Sasha Agranov<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<a
href="mailto:sagra...@COMGATES.co.il">sagra...@COMGATES.co.il</a>&gt; for
reporting this.</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>2) Sat Mar 22 11:58:12 2003&nbsp; Douglas C. Schmidt&nbsp; &lt;<a
href="mailto:schm...@tango.doc.wustl.edu">schm...@tango.doc.wustl.edu</a>&gt;</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
ace/Message_Queue_T.cpp: Moved the notify() hook calls within<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the protection of the
guard lock critical section to prevent<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; race conditions on
cleanup.&nbsp; Thanks to Ron Muck &lt;<a href="mailto:r...@sdiusa.com">r...@sdiusa.com</a>&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for this suggestion. </span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Currently, the latter (2) is solved but because of that (1), which
is my <br>
problem, has returned.</span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Is it not possible to solve both problems with adding an extra
notify lock? </span><o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><br>
</span><span style='font-size:10.0pt;font-family:Courier;color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;MessageQueue1, lock1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
handle_*<br>
&nbsp;&nbsp;&nbsp;&nbsp;
[Producer-1]-enqueue--&gt;[|||||||||||||||||||||||||]---&gt;[EH-1] &lt;-----+<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
\<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
\ &lt;notifyLock&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;PIPE?&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+-notify-----&gt;[|||||||||||||||||||||]---&gt;[Reactor]---+<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(consumer)&nbsp;&nbsp; |<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MessageQueue-n,
lock-n&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
/<br>
&nbsp;&nbsp;&nbsp;&nbsp;
[Producer-n]-enqueue--&gt;[|||||||||||||||||||||||||]---&gt;[EH-n] &lt;----+ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
handle_*</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><br>
</span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>I will point out my idea about this in the following fix code
example.</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>This fix might be a problem because I think it needs some interface
change in <br>
ACE_Notification_Strategy too (to get a notification lock somehow) but you have<br>
more insight in the concequences of that. </span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Maybe you first could have a look at this proposal?</span><span
style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Thanks in advance,<br>
Rudy Pot</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>//==============================================================================<br>
FIX CODE EXAMPLE&nbsp; (changes applicable for: enqueue_prio, enqueue_head, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
enqueue_deadline, enqueue_tail )</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><br>
</span><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>template &lt;ACE_SYNCH_DECL&gt; int<br>
ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_prio (ACE_Message_Block
*new_item,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout)<br>
{<br>
&nbsp; ACE_TRACE
(&quot;ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_prio&quot;);<br>
&nbsp; int queue_count = 0;<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T, ace_mon,
this-&gt;lock_, -1);</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; if (this-&gt;state_ == ACE_Message_Queue_Base::DEACTIVATED)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errno = ESHUTDOWN;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp; if (this-&gt;wait_not_full_cond (ace_mon,
timeout) == -1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,ace_notify_mon<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Would be handy if ACE_Notification_Strategy<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// has a lock. To be gathered from notify target<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// (reactor?)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Problem: ACE_Reactor_Notification_Strategy has stored&nbsp; <br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// Reactor reference but ACE_Notification_Strategy not.<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
,this-&gt;notification_strategy-&gt;lock()<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
, -1);</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>+&nbsp;&nbsp;&nbsp;&nbsp; // Somehow check if the (reactor?)
notification channel is full.<br>
+&nbsp;&nbsp;&nbsp;&nbsp; // Probably needs this-&gt;notification_strategy too.<br>
+&nbsp;&nbsp;&nbsp;&nbsp; if (this-&gt;wait_no_notify_full_cond
(ace_notify_mon, timeout) == -1)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; // We cannot enqueue without
causing a deadlock, so exit.</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>+&nbsp;&nbsp;&nbsp;&nbsp; // Because we hold the notify lock, no new
notifications will occur on our<br>
+&nbsp;&nbsp;&nbsp;&nbsp; // target and it is safe to enqueue &amp; notify
hereafter...</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queue_count = this-&gt;enqueue_i
(new_item);</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queue_count == -1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><span
style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;notify (); </span><span
style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>+&nbsp;&nbsp; }; // e.o. notify guarded area.</span><span
style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>&nbsp; }<br>
&nbsp; return queue_count;<br>
}</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>END FIX CODE EXAMPLE&nbsp;<br>
//==============================================================================</span><span
style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>&nbsp;<o:p></o:p></span></p>

</div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<p class=MsoNormal><span style='font-family:"Courier New";color:blue'>&nbsp;<o:p></o:p></span></p>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<div class=MsoNormal align=center style='text-align:center'>

<hr size=2 width="100%" align=center>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Johnny Willemsen
[mailto:jwillemsen@remedy.nl] <br>
<b>Sent:</b> woensdag 27 februari 2008 13:08<br>
<b>To:</b> Rudy Pot; ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> RE: [ace-bugs] [ACE_Message_Queue] notify PIPE block causes
Select_Reactor deadlock.</span><o:p></o:p></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks for using the PRF form. I found the change below in svn <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Johnny<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Courier New";
color:rosybrown'>Sat Mar 22 11:58:12 2003&nbsp; </span></b><b><span
style='font-size:10.0pt;font-family:"Courier New";color:cadetblue'>Douglas C.
Schmidt&nbsp; </span></b><span style='font-size:10.0pt;font-family:"Courier New"'>&lt;<span
style='color:darkgoldenrod'>schmidt@tango.doc.wustl.edu</span>&gt;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
* <b><span style='color:blue'>ace/Message_Queue_T.cpp</span></b>: Moved the
notify() hook calls within<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; the protection of the guard lock critical section to prevent<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; race conditions on cleanup.&nbsp; Thanks to Ron Muck &lt;rlm@sdiusa.com&gt;
<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp; for this suggestion.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
ace-bugs-bounces@cse.wustl.edu [mailto:ace-bugs-bounces@cse.wustl.edu] <b>On
Behalf Of </b>Rudy Pot<br>
<b>Sent:</b> Wednesday, February 27, 2008 11:29 AM<br>
<b>To:</b> ace-bugs@cs.wustl.edu<br>
<b>Subject:</b> [ace-bugs] [ACE_Message_Queue] notify PIPE block causes
Select_Reactor deadlock.<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
ACE VERSION: 5.5.6</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
HOST MACHINE and OPERATING SYSTEM: i386, Linux 2.6.20-1.2933.fc6 </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
TARGET MACHINE and OPERATING SYSTEM, if different from HOST: same.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'><br>
&nbsp;&nbsp;&nbsp; COMPILER NAME AND VERSION (AND PATCHLEVEL): gcc 4.1.1</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
CONTENTS OF $ACE_ROOT/ace/config.h:&nbsp; config-linux.h</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
CONTENTS OF $ACE_ROOT/include/makeinclude/platform_macros.GNU (unless<br>
&nbsp;&nbsp;&nbsp; this isn't used in this case, e.g., with Microsoft Visual
C++):<br>
&nbsp;&nbsp;&nbsp;&nbsp; platform-linux.GNU<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; AREA/CLASS/EXAMPLE AFFECTED: <br>
&nbsp;&nbsp;&nbsp; Message_Queue_T.cpp / ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;
/ enqueue_prio<br>
&nbsp;&nbsp;&nbsp; ( But I think also:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_head, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_deadline,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_tail )</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
See DESCRIPTION.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
DOES THE PROBLEM AFFECT:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMPILATION? NO<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LINKING?&nbsp;&nbsp;&nbsp;&nbsp; NO<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTION?&nbsp;&nbsp; YES<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTHER (please specify)? NO</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
SYNOPSIS:<br>
&nbsp;&nbsp;&nbsp; Application sometimes hangs when main Reactor gets more
busy. <br>
&nbsp;&nbsp;&nbsp; (e.g. due to significant increasing external events)<br>
&nbsp;&nbsp;&nbsp; Coredump shows:<br>
&nbsp;&nbsp;&nbsp; 1) Main Reactor thread is blocking to get the
ACE_Message_Queue lock.<br>
&nbsp;&nbsp;&nbsp; 2) Multiple threads block on ACE_Select_Reactor_Notify-&gt;
which ends up in<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;ACE::send() -&gt; write().<br>
&nbsp;&nbsp;&nbsp; Result is deadlock. We have to kill the application for
shutdown.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
I've read Sidebar17 of C++ Network Programming Volume 2 but our situation <br>
&nbsp;&nbsp;&nbsp; is different from what is stated there (no notify called
from handle_* of<br>
&nbsp;&nbsp;&nbsp; event_handler but producer-consumer deadlock).</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
DESCRIPTION:</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
The application in short.<br>
&nbsp;&nbsp;&nbsp; -------------------------<br>
&nbsp;&nbsp;&nbsp; The part of our program where this deadlock appears is
dealing with <br>
&nbsp;&nbsp;&nbsp; processing messages from an embedded (CAN) network. <br>
&nbsp;&nbsp;&nbsp; There is a thread per CAN message center (hardware
communication channel)<br>
&nbsp;&nbsp;&nbsp; which puts the received message into ACE_Message_Queue's,
depending on who<br>
&nbsp;&nbsp;&nbsp; wants to observe the messages. These are the producer
threads.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
The message queues belongs to observers who all have registered to get<br>
&nbsp;&nbsp;&nbsp; notified by one Reactor which runs in one main Reactor
thread (consumer).<br>
&nbsp;&nbsp;&nbsp; (they also have registered themselves by the message center
threads as being<br>
&nbsp;&nbsp;&nbsp;&nbsp; interested in the messages).</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
Problem cause<br>
&nbsp;&nbsp;&nbsp; --------------<br>
&nbsp;&nbsp;&nbsp; What can happen now is that the main Reactor, which is used
for many other <br>
&nbsp;&nbsp;&nbsp; things in our application, temporarily got other work todo,
and therefore<br>
&nbsp;&nbsp;&nbsp; the message center threads may fill up the
ACE_Select_Reactor notification<br>
&nbsp;&nbsp;&nbsp; PIPE. This causes the message center threads (producers) to
block on the <br>
&nbsp;&nbsp;&nbsp; (FULL) PIPE write().</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
The main Reactor thread (consumer), when ready with the other work, wants to <br>
&nbsp;&nbsp;&nbsp; proceed with handling the pending notifications, and so
emptying the PIPE, <br>
&nbsp;&nbsp;&nbsp; but cannot do this because the current notification code
also holds the <br>
&nbsp;&nbsp;&nbsp; message QUEUE lock! <br>
&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; See code description below:</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
In Message_Queue_T.cpp<br>
&nbsp;&nbsp;&nbsp; ======================<br>
&nbsp;&nbsp;&nbsp; ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_prio,<br>
&nbsp;&nbsp;&nbsp; ( But also the code reveals:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_head, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_deadline,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::enqueue_tail )</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>-------------------------------<br>
DEADLOCK CODE: (Above rev. 46096 until HEAD code)</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>template
&lt;ACE_SYNCH_DECL&gt; int<br>
ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_prio (ACE_Message_Block
*new_item,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ACE_Time_Value *timeout)<br>
{<br>
&nbsp; ACE_TRACE
(&quot;ACE_Message_Queue&lt;ACE_SYNCH_USE&gt;::enqueue_prio&quot;);<br>
&nbsp; int queue_count = 0;<br>
&nbsp; {<br>
&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN (ACE_SYNCH_MUTEX_T, ace_mon, this-&gt;lock_,
-1);</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
if (this-&gt;state_ == ACE_Message_Queue_Base::DEACTIVATED)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errno = ESHUTDOWN;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
if (this-&gt;wait_not_full_cond (ace_mon, timeout) == -1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
queue_count = this-&gt;enqueue_i (new_item);</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
if (queue_count == -1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
this-&gt;notify ();&nbsp; &lt;&lt;&lt;&lt; ERROR DEADLOCK (When blocking on
notify in scope of <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
buffer lock...)<br>
&nbsp; }<br>
&nbsp; return queue_count;<br>
}</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
In above code snippet: <br>
&nbsp;&nbsp;&nbsp; this-&gt;notify (); Causes DEADLOCK when blocking on full
notification pipe.<br>
&nbsp;&nbsp;&nbsp; This happens because &lt;notify()&gt; is now called within
the scope of the <br>
&nbsp;&nbsp;&nbsp; ACE_GUARD_RETURN.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
In older versions of ACE, e.g. 5.3.1, the &lt;notify()&gt; was outside the
scope<br>
&nbsp;&nbsp;&nbsp; of the GUARD and we never had this deadlock.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
In SUBVERSION ACE, I can see this has been changed after revision<br>
&nbsp;&nbsp;&nbsp;&nbsp; r.46096 of Message_Queue_T.cpp (ChangeLogTag:Sat Mar
22 11:58:12 2003)<br>
&nbsp;&nbsp;&nbsp; But I don't know why.</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
See Message_Queue_T.cpp <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : enqueue_prio, enqueue_head, enqueue_deadline,
enqueue_tail</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>-------------------------------<br>
NON DEADLOCK CODE (rev. 46096)<br>
&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; if (queue_count == -1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;
}&nbsp; // e.o. scope ACE_GUARD_RETURN for queue lock.<br>
&nbsp; this-&gt;notify ();&nbsp; // NO deadlock here, notify will unblock as
soon PIPE is <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// emptied.<br>
&nbsp; return queue_count;<br>
}</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>-------------------------------<br>
Concerning Coredump parts:</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>[
consumer ]</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Thread
1 (process 16785):<br>
#0&nbsp; 0x009bc5d9 in __lll_mutex_lock_wait () from /lib/libpthread.so.0<br>
#1&nbsp; 0x009b8636 in _L_mutex_lock_85 () from /lib/libpthread.so.0<br>
#2&nbsp; 0x009b817d in pthread_mutex_lock () from /lib/libpthread.so.0<br>
#3&nbsp; 0x00a9f922 in ACE_OS::mutex_lock () from /usr/lib/libACE.so.5.5.6<br>
#4&nbsp; 0x00fd83c8 in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::is_empty ()<br>
&nbsp;&nbsp; from /opt/lib/libgcp_datadump.so<br>
#5&nbsp; 0x0142d881 in can::CCanSvcDriverObserver::handle_output ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#6&nbsp; 0x00ac03f6 in ACE_Select_Reactor_Notify::dispatch_notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#7&nbsp; 0x00ac057a in ACE_Select_Reactor_Notify::handle_input ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#8&nbsp; 0x00ac14da in ACE_Select_Reactor_Notify::dispatch_notifications ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#9&nbsp; 0x00a5ef8e in ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#10 0x00a5f5fd in ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#11 0x00a65b03 in ACE_OS::gettimeofday () from /usr/lib/libACE.so.5.5.6<br>
#12 0x00abd0d3 in ACE_Reactor::run_reactor_event_loop ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#13 0x0804ae36 in main ()</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'><o:p>&nbsp;</o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>[&nbsp;producer
]<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Thread
28 (process 17023):<br>
#0&nbsp; 0x009bc8f1 in write () from /lib/libpthread.so.0<br>
#1&nbsp; 0x00a55a3a in ACE::send () from /usr/lib/libACE.so.5.5.6<br>
#2&nbsp; 0x00ac082e in ACE_Select_Reactor_Notify::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#3&nbsp; 0x00a5edcc in ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#4&nbsp; 0x00abdce6 in ACE_Reactor::notify () from /usr/lib/libACE.so.5.5.6<br>
#5&nbsp; 0x00abeace in ACE_Reactor_Notification_Strategy::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#6&nbsp; 0x0804b42a in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::notify ()<br>
#7&nbsp; 0x00fd7fa2 in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::enqueue_prio ()<br>
&nbsp;&nbsp; from /opt/lib/libgcp_datadump.so<br>
#8&nbsp; 0x0142d6f3 in can::CCanSvcDriverObserver::update ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#9&nbsp; 0x0143078d in can::CCanSvcDriver_Base::svc_Read ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#10 0x0143087f in can::CCanSvcDriverRemoteRequestImpl::svc ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#11 0x00ad3026 in ACE_Task_Base::svc_run () from /usr/lib/libACE.so.5.5.6<br>
#12 0x00ad39e8 in ACE_Thread_Adapter::invoke_i ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from /usr/lib/libACE.so.5.5.6<br>
#14 0x00a67511 in ace_thread_adapter () from /usr/lib/libACE.so.5.5.6<br>
#15 0x009b626a in start_thread () from /lib/libpthread.so.0<br>
#16 0x92fff470 in ?? ()<br>
#17 0x92fff470 in ?? ()<br>
#18 0x92fff470 in ?? ()<br>
#19 0x92fff470 in ?? ()<br>
#20 0x00000000 in ?? ()</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>[&nbsp;producer
]<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Thread
34 (process 17012):<br>
#0&nbsp; 0x009bc8f1 in write () from /lib/libpthread.so.0<br>
#1&nbsp; 0x00a55a3a in ACE::send () from /usr/lib/libACE.so.5.5.6<br>
#2&nbsp; 0x00ac082e in ACE_Select_Reactor_Notify::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#3&nbsp; 0x00a5edcc in ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#4&nbsp; 0x00abdce6 in ACE_Reactor::notify () from /usr/lib/libACE.so.5.5.6<br>
#5&nbsp; 0x00abeace in ACE_Reactor_Notification_Strategy::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#6&nbsp; 0x0804b42a in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::notify ()<br>
#7&nbsp; 0x00fd7fa2 in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::enqueue_prio ()<br>
&nbsp;&nbsp; from /opt/lib/libgcp_datadump.so<br>
#8&nbsp; 0x0142d6f3 in can::CCanSvcDriverObserver::update ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#9&nbsp; 0x0143062b in can::CCanSvcDriver_Base::svc_Read ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#10 0x014308cd in can::CCanSvcDriverReadImpl::svc ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#11 0x00ad3026 in ACE_Task_Base::svc_run () from /usr/lib/libACE.so.5.5.6<br>
#12 0x00ad39e8 in ACE_Thread_Adapter::invoke_i ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from /usr/lib/libACE.so.5.5.6<br>
#14 0x00a67511 in ace_thread_adapter () from /usr/lib/libACE.so.5.5.6<br>
#15 0x009b626a in start_thread () from /lib/libpthread.so.0<br>
#16 0x96bff470 in ?? ()<br>
#17 0x96bff470 in ?? ()<br>
#18 0x96bff470 in ?? ()<br>
#19 0x96bff470 in ?? ()<br>
#20 0x00000000 in ?? ()</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>[&nbsp;producer
]<o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Thread
26 (process 17025):<br>
#0&nbsp; 0x009bc8f1 in write () from /lib/libpthread.so.0<br>
#1&nbsp; 0x00a55a3a in ACE::send () from /usr/lib/libACE.so.5.5.6<br>
#2&nbsp; 0x00ac082e in ACE_Select_Reactor_Notify::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#3&nbsp; 0x00a5edcc in ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#4&nbsp; 0x00abdce6 in ACE_Reactor::notify () from /usr/lib/libACE.so.5.5.6<br>
#5&nbsp; 0x00abeace in ACE_Reactor_Notification_Strategy::notify ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#6&nbsp; 0x0804b42a in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::notify ()<br>
#7&nbsp; 0x00fd7fa2 in ACE_Message_Queue&lt;ACE_MT_SYNCH&gt;::enqueue_prio ()<br>
&nbsp;&nbsp; from /opt/lib/libgcp_datadump.so<br>
#8&nbsp; 0x0142d6f3 in can::CCanSvcDriverObserver::update ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#9&nbsp; 0x0143078d in can::CCanSvcDriver_Base::svc_Read ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#10 0x0143087f in can::CCanSvcDriverRemoteRequestImpl::svc ()<br>
&nbsp;&nbsp; from /opt/lib/libcanResourceManager.so.2<br>
#11 0x00ad3026 in ACE_Task_Base::svc_run () from /usr/lib/libACE.so.5.5.6<br>
#12 0x00ad39e8 in ACE_Thread_Adapter::invoke_i ()<br>
&nbsp;&nbsp; from /usr/lib/libACE.so.5.5.6<br>
#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from /usr/lib/libACE.so.5.5.6<br>
#14 0x00a67511 in ace_thread_adapter () from /usr/lib/libACE.so.5.5.6<br>
#15 0x009b626a in start_thread () from /lib/libpthread.so.0<br>
#16 0x91bff470 in ?? ()<br>
#17 0x91bff470 in ?? ()<br>
#18 0x91bff470 in ?? ()<br>
#19 0x91bff470 in ?? ()<br>
#20 0x00000000 in ?? ()</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
REPEAT BY:<br>
&nbsp;&nbsp;&nbsp; See description</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>&nbsp;&nbsp;&nbsp;
SAMPLE FIX/WORKAROUND:<br>
&nbsp;&nbsp;&nbsp; Change ACE code so that &lt;this-&gt;notify();&gt; is
outside of GUARD scope?<br>
&nbsp;&nbsp;&nbsp; (like it was before in rev. 46096).</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>[*
end of PRF *]</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Aside
from this deadlock problem:</span><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>One
thing what also comes up now is that I have to look at the notification pipe</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>buffer
length too when I want&nbsp;to increase the&nbsp; ACE_Message_Queue size?</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>(enqueue
will block if notification pipe is full). </span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Or,&nbsp;I
have to use #define ACE_HAS_REACTOR_NOTIFICATION_QUEUE and</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>recompile
ACE?</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Best
regards,</span><o:p></o:p></p>

</div>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

<div>

<p class=MsoNormal><strong><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Rudy&nbsp;Pot</span></strong><o:p></o:p></p>

</div>

<div>

<div>

<div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Embedded
Computer Systems</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><strong><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>AWETA
G&amp;P b.v</span></strong><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>Postbox
17</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>NL-2630
AA&nbsp; Nootdorp</span><o:p></o:p></p>

</div>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>tel
+31 (0)15 3109961 </span><o:p></o:p></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>fax&nbsp;+31
(0)15 3107321 </span><o:p></o:p></p>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>mail&nbsp;</span><a
href="mailto:rpot@aweta.nl"><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>rpot@aweta.nl</span></a><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif"'>web
<a href="blocked::http://www.aweta.com">www.aweta.com</a></span><o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</div>

</body>

</html>