summaryrefslogtreecommitdiff
path: root/TAO/examples/RTCORBA/Activity/Thread_Task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/examples/RTCORBA/Activity/Thread_Task.cpp')
-rw-r--r--TAO/examples/RTCORBA/Activity/Thread_Task.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/TAO/examples/RTCORBA/Activity/Thread_Task.cpp b/TAO/examples/RTCORBA/Activity/Thread_Task.cpp
new file mode 100644
index 00000000000..fe30b56c19b
--- /dev/null
+++ b/TAO/examples/RTCORBA/Activity/Thread_Task.cpp
@@ -0,0 +1,146 @@
+//$Id$
+#include "Thread_Task.h"
+
+#include "ace/High_Res_Timer.h"
+#include "ace/OS_NS_unistd.h"
+#include "tao/debug.h"
+#include "tao/ORB_Core.h"
+
+#include "Activity.h"
+#include "Task_Stats.h"
+#include "ace/Barrier.h"
+
+Thread_Task::Thread_Task (void)
+{
+}
+
+int
+Thread_Task::activate_task (ACE_Barrier* barrier, RTCORBA::PriorityMapping *priority_mapping)
+{
+ barrier_ = barrier;
+
+ // Convert the priority specified to this class to its native number.
+ RTCORBA::NativePriority native_priority;
+
+ if (priority_mapping->to_native (this->task_priority_, native_priority) == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Cannot convert CORBA priority %d to native priority\n",
+ this->task_priority_),
+ -1);
+
+ long flags =
+ THR_NEW_LWP |
+ THR_JOINABLE |
+ ACTIVITY::instance()->orb ()->orb_core ()->orb_params ()->thread_creation_flags ();
+
+ // Become an active object.
+ if (this->activate (flags,
+ 1,
+ 0,
+ native_priority) == -1)
+ {
+ if (ACE_OS::last_error () == EPERM)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("Insufficient privilege to run this test.\n")),
+ -1);
+ else
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%t) task activation at priority %d failed, ")
+ ACE_TEXT ("exiting!\n%a"),
+ native_priority,
+ -1));
+ }
+ return 0;
+}
+
+int
+Thread_Task::svc (void)
+{
+ // if debugging, dump the priority that we're actually at.
+ if (TAO_debug_level > 0)
+ {
+
+ // Get the priority of the current thread.
+ RTCORBA::Priority prio =
+ ACTIVITY::instance()->current ()->the_priority ();
+
+ if (prio == this->task_priority_)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) actual prio of %d equals desired priority\n"),
+ prio));
+ else
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("(%t) actual prio = %d, desired priority_ = %d!\n"),
+ prio,
+ this->task_priority_));
+ }
+ }
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "Thread_Task (%t) - wait\n"));
+
+ // First, wait for other threads.
+ this->barrier_->wait ();
+
+ // first thread here inits the Base_Time.
+ task_stats_->base_time (BASE_TIME::instance ()->base_time_);
+
+ // now wait till the phase_ period expires.
+ ACE_OS::sleep (ACE_Time_Value (0, phase_));
+
+ ACE_UINT32 gsf = ACE_High_Res_Timer::global_scale_factor ();
+
+ ACE_hrtime_t before, after;
+
+ for (int i = 0; i < iter_ ; ++i)
+ {
+ before = ACE_OS::gethrtime ();
+
+ job_->work (load_);
+
+ after = ACE_OS::gethrtime ();
+
+ task_stats_->sample (before, after);
+
+ if (period_ != 0) // blast mode, no sleep.
+ {
+ // convert to microseconds
+#if !defined ACE_LACKS_LONGLONG_T
+
+ ACE_UINT32 elapsed_microseconds = ACE_UINT32((after - before) / gsf);
+
+#else /* ! ACE_LACKS_LONGLONG_T */
+
+ ACE_UINT32 elapsed_microseconds = (after - before) / gsf;
+
+#endif /* ! ACE_LACKS_LONGLONG_T */
+
+#if defined (ACE_WIN32)
+ elapsed_microseconds*=1000; // convert to uSec on Win32
+#endif /* ACE_WIN32 */
+
+ // did we miss any deadlines?
+
+ int const missed =
+ elapsed_microseconds > period_ ? elapsed_microseconds/period_ : 0;
+
+ long sleep_time = (missed + 1)*period_ ;
+ sleep_time -= elapsed_microseconds;
+
+ if (TAO_debug_level > 0)
+ ACE_DEBUG ((LM_DEBUG, "(%t) sleep time = %d\n", sleep_time));
+
+ ACE_Time_Value t_sleep (0, sleep_time);
+ ACE_OS::sleep (t_sleep);
+ } /* period != 0 */
+ } /* for */
+
+ task_stats_->end_time (ACE_OS::gethrtime ());
+
+ job_->shutdown (); // tell the job that we're done.
+
+ ACTIVITY::instance ()->task_ended (this);
+
+ return 0;
+}