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