<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=windows-1252">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi,</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 class="moz-txt-link-freetext" 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.<br>
    </p>
    <pre class="moz-signature" cols="72">Johnny Willemsen
Remedy IT
<a class="moz-txt-link-freetext" href="http://www.remedy.nl">http://www.remedy.nl</a>
</pre>
    <div class="moz-cite-prefix">On 2/19/19 3:33 AM, Wanner, Charles W
      [US] (AS) wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:2d3a0df95c51456a9cc8e8c17864c93b@XCGC3026.northgrum.com">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <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"><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"><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"><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">    /*<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"><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>
          <o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
ace-users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:ace-users@list.isis.vanderbilt.edu">ace-users@list.isis.vanderbilt.edu</a>
<a class="moz-txt-link-freetext" href="http://list.isis.vanderbilt.edu/cgi-bin/mailman/listinfo/ace-users">http://list.isis.vanderbilt.edu/cgi-bin/mailman/listinfo/ace-users</a></pre>
    </blockquote>
  </body>
</html>