<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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: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:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:black;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">Hello,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    When is the next ACE TAO release scheduled?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Thank You,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Chuck W.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="color:windowtext">From:</span></b><span style="color:windowtext"> Johnny Willemsen [mailto:jwillemsen@remedy.nl]
<br>
<b>Sent:</b> Tuesday, February 19, 2019 4:47 AM<br>
<b>To:</b> Wanner, Charles W [US] (AS) <charles.wanner@ngc.com>; ace-users@list.isis.vanderbilt.edu<br>
<b>Subject:</b> EXT :Re: [ace-users] ACE Library Bug: ACE_Thread_Timer_Queue_Adapter has a Time Policy Issue<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p>Hi,<span style="font-size:12.0pt"><o:p></o:p></span></p>
<p>Thanks for using the PRF form. We discussed your issue this morning within our Remedy IT support team. During the discussion we identified a much easier and smaller solution which we implemented and tested. See
<a href="https://github.com/DOCGroup/ACE_TAO/pull/837">https://github.com/DOCGroup/ACE_TAO/pull/837</a> for the pull request we prepared and merged to ACE/TAO master, this change will be part of the next ACE release.<o:p></o:p></p>
<pre>Johnny Willemsen<o:p></o:p></pre>
<pre>Remedy IT<o:p></o:p></pre>
<pre><a href="http://www.remedy.nl">http://www.remedy.nl</a><o:p></o:p></pre>
<div>
<p class="MsoNormal">On 2/19/19 3:33 AM, Wanner, Charles W [US] (AS) wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Version: ACE+TAO 6.4.5<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">HOST: CentOS Linux release 7.6.1810 (Core)<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Config.h Contents:<o:p></o:p></p>
<p class="MsoNormal">#define ACE_ENABLE_SWAP_ON_WRITE<o:p></o:p></p>
<p class="MsoNormal">#define ACE_LACKS_CDR_ALIGNMENT<o:p></o:p></p>
<p class="MsoNormal">#define ACE_HAS_CLOCK_GETTIME_MONOTONIC <o:p></o:p></p>
<p class="MsoNormal">#define ACE_HAS_IPV6<o:p></o:p></p>
<p class="MsoNormal">#define ACE_USES_IPV4_IPV6_MIGRATION<o:p></o:p></p>
<p class="MsoNormal">#include "ace/config-linux.h"<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">AREA/CLASS/EXAMPLE AFFECTED: class ACE_Thread_Timer_Queue_Adapter (file: Timer_Queue_Adapter.[h,inl,cpp])<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">DOES THE PROBLEM AFFECT: Execution<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">SYNOPSIS:<o:p></o:p></p>
<p class="MsoNormal">   The thread created by the class ACE_Thread_Timer_Queue_Adapter will not pend and just continue to consume the CPU. 
<o:p></o:p></p>
<p class="MsoNormal">The problem occurs when the TQ Type is not using the ACE_Default_Time_Policy.<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<p class="MsoNormal">DESCRIPTION:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Declaration of the ACE_Thread_Timer_Queue_Adapter:<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<p class="MsoNormal">template <class TQ, class TYPE = ACE_Event_Handler*><o:p></o:p></p>
<p class="MsoNormal">class ACE_Thread_Timer_Queue_Adapter : public ACE_Task_Base<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">The issue is when class TQ's Time Policy is not the ACE_Default_Time_Policy.  The root of the problem is class's<o:p></o:p></p>
<p class="MsoNormal">condition_ is always expecting a time value based on the default time policy (Wall Clock Time).  In the
<o:p></o:p></p>
<p class="MsoNormal">ACE_Thread_Timer_Queue_Adapter::svc method the absolute time to wait for a scheduled timer will be based on TQ's<o:p></o:p></p>
<p class="MsoNormal">Time Policy (line 279), but condition_ is expecting an absolute time to be based on the default time policy (Wall Clock Time)<o:p></o:p></p>
<p class="MsoNormal">(line 282).<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">From the ACE_Thread_Timer_Queue_Adapter::svc method, lines 268-283<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">          // Compute the remaining time, being careful not to sleep<o:p></o:p></p>
<p class="MsoNormal">          // for "negative" amounts of time.<o:p></o:p></p>
<p class="MsoNormal">          ACE_Time_Value const tv_curr =<o:p></o:p></p>
<p class="MsoNormal">            this->timer_queue_->gettimeofday ();<o:p></o:p></p>
<p class="MsoNormal">          ACE_Time_Value const tv_earl =<o:p></o:p></p>
<p class="MsoNormal">            this->timer_queue_->earliest_time ();<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">          if (tv_earl > tv_curr)<o:p></o:p></p>
<p class="MsoNormal">            {<o:p></o:p></p>
<p class="MsoNormal">              // The earliest time on the Timer_Queue lies in future;<o:p></o:p></p>
<p class="MsoNormal">              // convert the tv to an absolute time.<o:p></o:p></p>
<p class="MsoNormal">              ACE_Time_Value const tv = this->timer_queue_->gettimeofday () + (tv_earl - tv_curr);   // tv based on the Time from the TQ's Time Policy<o:p></o:p></p>
<p class="MsoNormal">              // ACELIB_DEBUG ((LM_DEBUG,  ACE_TEXT ("waiting until %u.%3.3u secs\n"),<o:p></o:p></p>
<p class="MsoNormal">              // tv.sec(), tv.msec()));<o:p></o:p></p>
<p class="MsoNormal">              this->condition_.wait (&tv);   // condition_ is expecting an absolute time to always be based on the default time policy (Wall Clock Time)<o:p></o:p></p>
<p class="MsoNormal">            }<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">REPEAT BY:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">1) Declare the ACE_Thread_Timer_Queue_Adapter with the following parameters:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    class MyTimerInterface : public ACE_Task<ACE_MT_SYNCH, ACE_Monotonic_Time_Policy><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    ......<o:p></o:p></p>
<p class="MsoNormal">    /**<o:p></o:p></p>
<p class="MsoNormal">     * \brief Timer Interface Timer Heap Type<o:p></o:p></p>
<p class="MsoNormal">     */<o:p></o:p></p>
<p class="MsoNormal">    typedef ACE_Timer_Heap_T<ACE_Event_Handler *,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_Event_Handler_Handle_Timeout_Upcall,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_SYNCH_RECURSIVE_MUTEX,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_Monotonic_Time_Policy> MyTimerHeapTyp;<o:p></o:p></p>
<p class="MsoNormal">    /**<o:p></o:p></p>
<p class="MsoNormal">     * \brief  My Interface Timer Queue Thread Type<o:p></o:p></p>
<p class="MsoNormal">     */<o:p></o:p></p>
<p class="MsoNormal">    typedef ACE_Thread_Timer_Queue_Adapter<MyTimerHeapTyp> MyTimerQThreadTyp;<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    MyTimerQThreadTyp   myTimerT;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    .....<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    };<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal"> 2) Schedule a periodic timer with myTimerT<o:p></o:p></p>
<p class="MsoNormal"> 3) Monitor the CPU utilization of the process or process threads with top.<o:p></o:p></p>
<p class="MsoNormal"> 4) top should show the thread created by myTimerT member constantly running and consuming the CPU.<o:p></o:p></p>
<p class="MsoNormal"> 5) I use the following API call to set the thread's name to know which of my threads are displayed in top.<o:p></o:p></p>
<p class="MsoNormal">    /*<o:p></o:p></p>
<p class="MsoNormal">    ** Set the Linux Process/Thread Name<o:p></o:p></p>
<p class="MsoNormal">    */<o:p></o:p></p>
<p class="MsoNormal">    prctl(PR_SET_NAME, "MyTimerT");<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    Just add the line to the MyTimerInterface::handle_timeout method of the ACE_Event_Hander object passed to the schedule method.<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    this->myTimerT.schedule(this, .....)<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    When you use the "top -H -p <Process's PID>", you should see "MyTimerT" under top's "COMMAND" column.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">SAMPLE FIX/WORKAROUND:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">  I think the based solution would be to add a ACE Condition Attributes data member similar to class Message_Queue_T<o:p></o:p></p>
<p class="MsoNormal">  <o:p></o:p></p>
<p class="MsoNormal">  I got this declaration from Message_Queue_T.h, lines 611-615.  Add the following lines to the private section of<o:p></o:p></p>
<p class="MsoNormal">  ACE_Thread_Timer_Queue_Adapter class:<o:p></o:p></p>
<p class="MsoNormal">    /// Attributes to initialize conditions with.<o:p></o:p></p>
<p class="MsoNormal">  /* We only need this because some crappy compilers can't<o:p></o:p></p>
<p class="MsoNormal">     properly handle initializing the conditions with<o:p></o:p></p>
<p class="MsoNormal">     temporary objects. */<o:p></o:p></p>
<p class="MsoNormal">  ACE_Condition_Attributes_T<TIME_POLICY> cond_attr_;<o:p></o:p></p>
<p class="MsoNormal">  <o:p></o:p></p>
<p class="MsoNormal">  Update line 162 in Timer_Queue_Adapter.cpp:<o:p></o:p></p>
<p class="MsoNormal">     condition_ (mutex_),<o:p></o:p></p>
<p class="MsoNormal">  Change To:<o:p></o:p></p>
<p class="MsoNormal">     condition_ (mutex_, cond_attr_),<o:p></o:p></p>
<p class="MsoNormal">     <o:p></o:p></p>
<p class="MsoNormal">  The issue with the fix is the TIME_POLICY Type.  The current declaration has TIME_POLICY in the<o:p></o:p></p>
<p class="MsoNormal">  TQ Type, so it is not currently available in the ACE_Thread_Timer_Queue_Adapter.   My knowledge on<o:p></o:p></p>
<p class="MsoNormal">  C++ Templates is not great.  So not positive if there is a way for the ACE_Thread_Timer_Queue_Adapter<o:p></o:p></p>
<p class="MsoNormal">  class to have access to the TIME_POLICY from the TQ type to declare a data member.  If it is not possible,
<o:p></o:p></p>
<p class="MsoNormal">  then TIME_POLICY type would need to be added to the ACE_Thread_Timer_Queue_Adapter declaration.<o:p></o:p></p>
<p class="MsoNormal">  <o:p></o:p></p>
<p class="MsoNormal">  Currently:<o:p></o:p></p>
<p class="MsoNormal">   template <class TQ, class TYPE = ACE_Event_Handler*><o:p></o:p></p>
<p class="MsoNormal">   class ACE_Thread_Timer_Queue_Adapter : public ACE_Task_Base<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<p class="MsoNormal">  My Change:<o:p></o:p></p>
<p class="MsoNormal">   template <class TQ, class TYPE = ACE_Event_Handler*, typename TIME_POLICY = ACE_Default_Time_Policy><o:p></o:p></p>
<p class="MsoNormal">   class ACE_Thread_Timer_Queue_Adapter : public ACE_Task_Base<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<p class="MsoNormal">  Adding the TIME_POLICY at the end and defaulting the value to ACE_Default_Time_Policy should not cause compilation errors<o:p></o:p></p>
<p class="MsoNormal">  with existing code.<o:p></o:p></p>
<p class="MsoNormal">   <o:p></o:p></p>
<p class="MsoNormal">  My one concern is the TQ's TIME_POLICY could be out of synch with ACE_Thread_Timer_Queue_Adapter's TIME_POLICY.  Hopefully<o:p></o:p></p>
<p class="MsoNormal">  there is a way to do a validation check at compile time.  As of now, I do not know how to do a validation check if the two<o:p></o:p></p>
<p class="MsoNormal">  TIME_POLICY types were not the same.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">  Each of the method's declaration had to be updated in the Timer_Queue_Adapter.inl and Timer_Queue_Adapter.cpp.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">  I have implemented, compiled, and tested to ACE_Thread_Timer_Queue_Adapter class.  The problem with the CPU processing has<o:p></o:p></p>
<p class="MsoNormal">  gone away when using the ACE_Monotonic_Time_Policy.<o:p></o:p></p>
<p class="MsoNormal">  <o:p></o:p></p>
<p class="MsoNormal">  The new code is the following:<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    class MyTimerInterface : public ACE_Task<ACE_MT_SYNCH, ACE_Monotonic_Time_Policy><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    ......<o:p></o:p></p>
<p class="MsoNormal">    /**<o:p></o:p></p>
<p class="MsoNormal">     * \brief Timer Interface Timer Heap Type<o:p></o:p></p>
<p class="MsoNormal">     */<o:p></o:p></p>
<p class="MsoNormal">    typedef ACE_Timer_Heap_T<ACE_Event_Handler *,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_Event_Handler_Handle_Timeout_Upcall,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_SYNCH_RECURSIVE_MUTEX,<o:p></o:p></p>
<p class="MsoNormal">                             ACE_Monotonic_Time_Policy> MyTimerHeapTyp;<o:p></o:p></p>
<p class="MsoNormal">    /**<o:p></o:p></p>
<p class="MsoNormal">     * \brief  My Interface Timer Queue Thread Type<o:p></o:p></p>
<p class="MsoNormal">     */<o:p></o:p></p>
<p class="MsoNormal">    typedef ACE_Thread_Timer_Queue_Adapter<MyTimerHeapTyp, <o:p>
</o:p></p>
<p class="MsoNormal">                                           ACE_Event_Handler *,
<o:p></o:p></p>
<p class="MsoNormal">                                           ACE_Monotonic_Time_Policy> MyTimerQThreadTyp;<o:p></o:p></p>
<p class="MsoNormal">    <o:p></o:p></p>
<p class="MsoNormal">    MyTimerQThreadTyp   myTimerT;<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    .....<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">    };<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial",sans-serif">Chuck Wanner</span>
<br>
<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Times New Roman",serif"><br>
<br>
<o:p></o:p></span></p>
<pre>_______________________________________________<o:p></o:p></pre>
<pre>ace-users mailing list<o:p></o:p></pre>
<pre><a href="mailto:ace-users@list.isis.vanderbilt.edu">ace-users@list.isis.vanderbilt.edu</a><o:p></o:p></pre>
<pre><a href="http://list.isis.vanderbilt.edu/cgi-bin/mailman/listinfo/ace-users">http://list.isis.vanderbilt.edu/cgi-bin/mailman/listinfo/ace-users</a><o:p></o:p></pre>
</blockquote>
</div>
</body>
</html>