diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-11 02:43:56 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-11 02:43:56 +0000 |
commit | cea26aeb6e1bc30c754707f0936d199e08bea071 (patch) | |
tree | 3dc833f539f796899b4af99622b5da8f50388c6f | |
parent | a0baa394448bbfac7de050fa8384851d3759cc8a (diff) | |
download | ATCD-cea26aeb6e1bc30c754707f0936d199e08bea071.tar.gz |
Removed all the files in $TAO_ROOT/local
62 files changed, 0 insertions, 17955 deletions
diff --git a/TAO/local/ChangeLog b/TAO/local/ChangeLog deleted file mode 100644 index 5d0a532464f..00000000000 --- a/TAO/local/ChangeLog +++ /dev/null @@ -1,210 +0,0 @@ -Mon Dec 8 15:43:42 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * bin/Event_Service/svc.conf: - * tests/svc.conf: - These files are needed for proper operation, I forgot to add - them at first. - -Mon Dec 8 13:20:39 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * bin/Event_Service/Makefile: - * bin/Event_Service/Dispatching_Modules.cpp: - * bin/Event_Service/Dispatching_Modules.h: - * bin/Event_Service/Event_Channel.cpp: - * bin/Event_Service/Event_Channel.h: - * bin/Event_Service/RT_Task.cpp: - * bin/Event_Service/ReactorTask.cpp: - * bin/Event_Service/ReactorTask.h: - * bin/Scheduling_Service/Config_Scheduler.cpp: - * bin/Scheduling_Service/Scheduler_Internal.cpp: - More fine tuning of TIMEPROBES, trying to track the wasted time. - - * tests/Latency.cpp: - Use ACE_ERROR and ACE_DEBUG instead of iostreams. - - * bin/Scheduling_Service/Scheduler_Internal.cpp: - Fixed problem on scheduling computation, I guess I left some - code commented out and never actually fixed it. - -Wed Dec 3 16:11:39 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * tests/Latency.h: - * tests/Latency.cpp: - * bin/Event_Service/Event_Channel.cpp: - * bin/Event_Service/Dispatching_Modules.i: - * bin/Event_Service/Dispatching_Modules.h: - Use the new timestamps on the Events to track the movement of - the events on the EC. - -Wed Dec 03 09:27:44 1997 David L. Levine <levine@cs.wustl.edu> - - * local/bin/Event_Service/Event_Channel.cpp: added - ACE_Atomic_Op<ACE_ES_MUTEX, int> template instantiation. - -Tue Dec 2 10:32:01 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * local/bin/Event_Service/Makefile: - * local/bin/Event_Service/Dispatching_Modules.h: - * local/bin/Event_Service/Event_Channel.cpp: - * local/bin/Event_Service/Event_Channel.h: - * local/bin/Event_Service/Event_Channel.i: - * local/bin/Event_Service/RT_Task.cpp: - * local/bin/Event_Service/RT_Task.h: - The ACE_TIMEPROBE implementation was moved into the orbsvcs - library. - Added some more ACE_TIMEPROBE to the point were all the lifetime - of an event seems to every message - seems - Removed some forwarding info leftovers on the Event Channel - implementation. - - * local/tests/Latency.cpp: - Added some ACE_TIMEPROBE calls to measure delays. - Use the double field to timestamp the event, using a - highrestimer (TOTAL HACK). - -Sun Nov 30 16:57:40 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * bin/Event_Service/Makefile: - Added the old probe=X flag to include/exclude ACE_TIMEPROBE code. - - * bin/Event_Service/Event_Channel.i: - * bin/Event_Service/Event_Channel.cpp: - * bin/Event_Service/Dispatching_Modules.i: - * bin/Event_Service/Dispatching_Modules.cpp: - Normalized ACE_TIMEPROBE messages, all start with two spaces, - but the timeout, which starts a loop, IMHO is easier to read - that way. - - * bin/Scheduling_Service/dump_schedule.cpp: - * bin/Event_Service/Event_Service.cpp: - g++ does not seems to cast _var types to _ptr parameters on its - own, an explicit call to the ptr() method seems needed. - - * tests/Latency.h: - Removed virtual methods from Latency_Supplier, thanks to g++ for - noticing that those were uneeded. - -Tue Nov 25 22:49:23 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * bin/Event_Service/Event_Service.cpp: - * bin/Scheduling_Service/dump_schedule.cpp: - * bin/Scheduling_Service/schedule_service.cpp: - * tests/Latency.cpp: - The Naming Service has been working for quite a bit now, we use - it instead of the ad-hoc ORBcore flags. - - * tests/Latency.cpp: - Use the high resolution timer to measure round-trip delays, and - keep most of the original code for it. But we are not using the - time_ field on the events (yet); a global variable takes its - place. - - -Mon Nov 24 20:53:03 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * bin/Event_Service/Event_Channel.h: - * bin/Event_Service/Event_Channel.cpp: - Removed the forward_event support, since this is MDA/Boeing - propietary. - -Thu Nov 20 22:07:36 1997 David L. Levine <levine@cs.wustl.edu> - - * local/bin/Scheduling_Service/Scheduler_Generic.*: - added ACE_Scheduler_Generic. It's a drop-in - replacement for ACE_Scheduler_Internal that assigns - the same priority and subpriority to all tasks. - -Wed Nov 19 14:53:25 1997 David L. Levine <levine@cs.wustl.edu> - - * local/bin/Scheduling_Service/Scheduler.cpp: #include - Scheduler.h instead of Scheduler_Internal.h. - (export): changed loop index from u_int to int to avoid - signed/unsigned comparison. - -Tue Nov 18 13:26:32 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * tests/Latency.cpp: - Added minimal code to measure round trip delays through the EC. - -Mon Nov 17 18:44:29 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * tests/Latency.h: - * tests/Latency.cpp: - Added small classes to implement the Supplier and Consumer - personalities of Latency_Supplier; they delegate on it to do the - job. - The QoS for the Consumer personality of Latency_Supplier was - wrong. - -Sun Nov 16 00:11:28 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu> - - * README: - * Makefile: - This directory should hold the propietary code of Boeing. It - even holds its own ChangeLog to keep the profile *very* low. - IT MUST NOT BE DISTRIBUTED IN THE RELEASES. - - * bin/Makefile: - This directory contains the Services (Event and Schedule). - - * bin/Scheduling_Service/Makefile: - * bin/Scheduling_Service/.cvsignore: - * bin/Scheduling_Service/svc.conf: - * bin/Scheduling_Service/Config_Scheduler.cpp: - * bin/Scheduling_Service/Config_Scheduler.h: - * bin/Scheduling_Service/Config_Scheduler.i: - * bin/Scheduling_Service/Scheduler.cpp: - * bin/Scheduling_Service/Scheduler.h: - * bin/Scheduling_Service/Scheduler.i: - * bin/Scheduling_Service/Scheduler_Internal.cpp: - * bin/Scheduling_Service/Scheduler_Internal.h: - * bin/Scheduling_Service/Scheduler_Internal.i: - * bin/Scheduling_Service/dump_schedule.cpp: - * bin/Scheduling_Service/schedule_service.cpp: - This is the implementation of the Scheduling Service. - The dump utility is also here, in the future we may want to move - it. - - * bin/Event_Service/Makefile: - * bin/Event_Service/BCU.cpp: - * bin/Event_Service/BCU.h: - * bin/Event_Service/CORBA_Utils_T.cpp: - * bin/Event_Service/CORBA_Utils_T.h: - * bin/Event_Service/CORBA_Utils_T.i: - * bin/Event_Service/Channel_Clients.i: - * bin/Event_Service/Channel_Clients_T.i: - * bin/Event_Service/Debug_Macros.h: - * bin/Event_Service/Dispatching_Modules.cpp: - * bin/Event_Service/Dispatching_Modules.h: - * bin/Event_Service/Dispatching_Modules.i: - * bin/Event_Service/Event_Channel.cpp: - * bin/Event_Service/Event_Channel.h: - * bin/Event_Service/Event_Channel.i: - * bin/Event_Service/Event_Service.cpp: - * bin/Event_Service/Fast_Reactor.h: - * bin/Event_Service/GPlot_File.cpp: - * bin/Event_Service/GPlot_File.h: - * bin/Event_Service/GPlot_File.i: - * bin/Event_Service/Local_ESTypes.cpp: - * bin/Event_Service/Local_ESTypes.h: - * bin/Event_Service/Local_ESTypes.i: - * bin/Event_Service/Memory_Pools.cpp: - * bin/Event_Service/Memory_Pools.h: - * bin/Event_Service/Memory_Pools.i: - * bin/Event_Service/RT_Task.cpp: - * bin/Event_Service/RT_Task.h: - * bin/Event_Service/RT_Task.i: - * bin/Event_Service/ReactorTask.cpp: - * bin/Event_Service/ReactorTask.h: - * bin/Event_Service/Task_Manager.cpp: - * bin/Event_Service/Task_Manager.h: - * bin/Event_Service/Task_Manager.i: - Implements the Event Service. - - * tests/Makefile: - * tests/Latency.cpp: - * tests/Latency.h: - * tests/Utilization.cpp: - * tests/Utilization.h: - Simple tests for the Event Service. diff --git a/TAO/local/Makefile b/TAO/local/Makefile deleted file mode 100644 index 658bbefe555..00000000000 --- a/TAO/local/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -#---------------------------------------------------------------------------- -# -# $Id$ -# -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -DIRS = bin \ - tests - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(ACE_ROOT)/include/makeinclude/macros.GNU -include $(ACE_ROOT)/include/makeinclude/rules.common.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nested.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/TAO/local/README b/TAO/local/README deleted file mode 100644 index f556fcac4da..00000000000 --- a/TAO/local/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory should contain the non-distributable code for TAO, such -as the Boeing propietary stuff. diff --git a/TAO/local/bin/Event_Service/BCU.cpp b/TAO/local/bin/Event_Service/BCU.cpp deleted file mode 100644 index 862f6240cdc..00000000000 --- a/TAO/local/bin/Event_Service/BCU.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// $Id$ - -#include "BCU.h" -#include "ace/ACE.h" - - -u_long -ACE_BCU (u_long n) -{ - const u_long ACE_BCU_PRIME_NUMBER = 9619; - - u_long retval = 0; - - while (n-- > 0) - retval = ACE::is_prime (ACE_BCU_PRIME_NUMBER, 2, ACE_BCU_PRIME_NUMBER / 2); - - return retval; -} - - -u_long -ACE_BCU (u_long number, - u_long n) -{ - u_long retval = 0; - - while (n-- > 0) - retval = ACE::is_prime (number, 2, number); - - return retval; -} diff --git a/TAO/local/bin/Event_Service/BCU.h b/TAO/local/bin/Event_Service/BCU.h deleted file mode 100644 index 9eaf5fdf96b..00000000000 --- a/TAO/local/bin/Event_Service/BCU.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ace ORB -// -// = FILENAME -// Benchmark Computation Units -// -// = AUTHOR -// David Levine and Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// -// Times how long it takes to generate each of the first N prime -// numbers. -// ============================================================================ - -#if !defined (ACE_BCU_H) -#define ACE_BCU_H - -#include "ace/OS.h" - - -u_long ACE_BCU (u_long n); -// Check if a specific, hardcoded number is prime (via ACE::is_prime) <n> -// times. - - -u_long ACE_BCU (u_long number, u_long n); -// Check if <number> is prime (via ACE::is_prime ()) <n> times. - -#endif /* ACE_BCU_H */ diff --git a/TAO/local/bin/Event_Service/CORBA_Utils_T.cpp b/TAO/local/bin/Event_Service/CORBA_Utils_T.cpp deleted file mode 100644 index f603421eaaa..00000000000 --- a/TAO/local/bin/Event_Service/CORBA_Utils_T.cpp +++ /dev/null @@ -1,349 +0,0 @@ -// $Id$ - -#if !defined (ACE_CORBA_UTILS_C) -#define ACE_CORBA_UTILS_C - -#include "CORBA_Utils_T.h" -#include "ace/Log_Msg.h" - -#if !defined (__ACE_INLINE__) -#include "CORBA_Utils_T.i" -#endif /* __ACE_INLINE__ */ - -template <class TYPE> -ACE_CORBA_Sequence<TYPE>::ACE_CORBA_Sequence (const ACE_CORBA_Sequence<TYPE> &source) - : maximum_ (0), - length_ (0), - buffer_ (0), - release_ (0) -{ - (*this) = source; -} - -template <class TYPE> -ACE_CORBA_Sequence<TYPE>::ACE_CORBA_Sequence (void) - : maximum_ (0), - length_ (0), - buffer_ (0), - release_ (0) -{ -} - -template <class TYPE> -ACE_CORBA_Sequence<TYPE>::~ACE_CORBA_Sequence (void) -{ - if (release_) - { - this->delete_array (buffer_, maximum_); - } -} - -template <class TYPE> -ACE_CORBA_Sequence<TYPE>::ACE_CORBA_Sequence (CORBA::ULong max) - : maximum_ (max), - length_ (0), - buffer_ (0), - - release_ (0) -{ - if (maximum_ > 0) - { - buffer_ = this->new_array (maximum_); - release_ = 1; - } -} - -template <class TYPE> TYPE * -ACE_CORBA_Sequence<TYPE>::new_array (size_t len) -{ - return new TYPE[len]; -} - -template <class TYPE> void -ACE_CORBA_Sequence<TYPE>::delete_array (TYPE *buf, size_t) -{ - delete [] buf; -} - -template <class TYPE> -ACE_CORBA_Sequence<TYPE>::ACE_CORBA_Sequence (CORBA::ULong max, - CORBA::ULong length, - TYPE* data, - CORBA::Boolean release) - : maximum_ (max), - length_ (length), - buffer_ (data), - release_ (release) -{ - if ((buffer_ == 0) && (max > 0)) - { - // @@ What should we do here? - errno = ENOMEM; - ACE_ERROR ((LM_ERROR, "No memory.\n")); - } -} - -// @@ This makes a deep copy, dig? -template <class TYPE> ACE_CORBA_Sequence<TYPE> & -ACE_CORBA_Sequence<TYPE>::operator= (const ACE_CORBA_Sequence<TYPE> &source) -{ - if (source.length () > 0) - { - // If our buffer is too small, release it and allocate one just big - // enough. If buffer_ == 0, this works fine. - if (this->maximum () < source.length ()) - { - if (release_) - { - this->delete_array (buffer_, maximum_); - } - maximum_ = source.length (); - buffer_ = this->new_array (maximum_); - release_ = 1; - } - - // Copy each of the items from the source. - for (CORBA::ULong index=0; index < source.length (); index++) - (*this)[index] = source[index]; - - this->length (source.length ()); - } - - return *this; -} - -template <class TYPE> void -ACE_CORBA_Sequence<TYPE>::length (CORBA::ULong len) -{ - if (len > maximum_) - { - // Allocate the space that we need. - TYPE* tmp = this->new_array (len); - // Copy over the old sequence. - for (int i = 0; i < maximum_; ++i) - { - tmp[i] = buffer_[i]; - } - if (release_) - { - this->delete_array (buffer_, maximum_); - } - buffer_ = tmp; - release_ = 1; - maximum_ = len; - // The destructor of -old- will release the old buffer_ if - // necessary. - } - - length_ = len; -} - - -// g++ can't handle these operator [] functions if they're inline -template <class TYPE> TYPE& -ACE_CORBA_Sequence<TYPE>::operator [] (CORBA::ULong i) -{ - // @@ Should we do bounds checking? - if (i >= maximum_) - { - ACE_ERROR ((LM_ERROR, "Trying to write past maximum.\n")); - return buffer_[maximum_ - 1]; - } - else - return buffer_[i]; -} - -template <class TYPE> const TYPE& -ACE_CORBA_Sequence<TYPE>::operator [] (CORBA::ULong i) const -{ - if (i >= length_) - { - ACE_ERROR ((LM_ERROR, "Trying to read past length.\n")); - return buffer_[length_ - 1]; - } - - return buffer_[i]; -} - -// ******************** - -/* -template <class TYPE> void -dump (const ACE_CORBA_Sequence<TYPE> &seq) -{ - for (CORBA::ULong index=0; index < seq.length (); index++) - dump (seq[index]); -} -*/ - -/* -template <class TYPE> ACE_INLINE void -operator += (ACE_CORBA_Sequence<TYPE> &seq, - const TYPE &item) -{ - CORBA::ULong length = seq.length (); - seq.length (length + 1); - seq[length] = item; -} -*/ - -template <class TYPE> ACE_INLINE void -operator += (ACE_CORBA_Sequence<TYPE> &dest, - const ACE_CORBA_Sequence<TYPE> &source) -{ - int old_length = dest.length (); - int new_length = old_length + source.length (); - dest.length (new_length); - - int difference = new_length - old_length; - - for (int x=0; x < difference; x++) - dest[old_length + x] = source[x]; -} - -/* -template <class TYPE> ACE_INLINE void -remove_item (TYPE &seq, CORBA::ULong index) -{ - int new_length = seq.length () - 1; - - // Shift the set back one, starting at <index>. - for (int x = index; x < new_length; x++) - seq[x] = seq[x+1]; - - // Set the new length. - seq.length (new_length); -} -*/ - -// ************************************************************ -// ************************************************************ -// ************************************************************ - -template<class TYPE> -ACE_CORBA_var<TYPE>::ACE_CORBA_var (const ACE_CORBA_var<TYPE> &source) -{ - if (source.me_ != 0) - me_ = (TYPE *) source.me_->_duplicate (); - // CORBA::duplicate (source.me_); -} - -template<class TYPE> -ACE_CORBA_var<TYPE>::ACE_CORBA_var (void) - : me_ (0) -{ -} - -template<class TYPE> -ACE_CORBA_var<TYPE>::ACE_CORBA_var (TYPE *source) -{ - me_ = (TYPE *) source->_duplicate (); - // CORBA::duplicate (source); -} - -template<class TYPE> -ACE_CORBA_var<TYPE>::~ACE_CORBA_var (void) -{ - if (me_ != 0) - me_->_release (); - //CORBA::release (me_); -} - -template<class TYPE> ACE_CORBA_var<TYPE> & -ACE_CORBA_var<TYPE>::operator= (TYPE *source) -{ - if (me_ != source && - me_ != 0) - me_->_release (); - //CORBA::release (me_); - - me_ = (TYPE *) source->_duplicate (); - // CORBA::duplicate (source); - return *this; -} - -template<class TYPE> ACE_CORBA_var<TYPE> & -ACE_CORBA_var<TYPE>::operator= (const ACE_CORBA_var<TYPE> &source) -{ - if (me_ != source.me_ && - me_ != 0) - me_->_release (); - // CORBA::release (me_); - - me_ = (TYPE *) source.me_->_duplicate (); - // CORBA::duplicate (source.me_); - return *this; -} - -template<class TYPE> TYPE * -ACE_CORBA_var<TYPE>::operator->(void) -{ - return me_; -} - -template<class TYPE> -ACE_CORBA_var<TYPE>::operator TYPE *(void) const -{ - return me_; -} - -/* -template<class TYPE> -ACE_CORBA_var<TYPE>::operator TYPE *&(void) -{ - return me_; -} -*/ - -template<class TYPE> -ACE_CORBA_var<TYPE>::operator TYPE &(void) const -{ - return *me_; -} - -// ************************************************************ -// ************************************************************ - -/* -ACE_CORBA_Object_Ref<IMPL>::ACE_CORBA_Object_Ref (void) - : impl_ (0) -{ -} - -ACE_CORBA_Object_Ref<IMPL>::ACE_CORBA_Object_Ref (IMPL *impl) - : impl_ (impl) -{ -} - -ACE_CORBA_Object_Ref<IMPL>::~ACE_CORBA_Object_Ref (void) - : impl_ (0) -{ -} - -ACE_CORBA_Object_Ref<IMPL> & -ACE_CORBA_Object_Ref<IMPL>::operator= (const ACE_CORBA_Object_Ref<IMPL> &source) -{ - return *this; -} - -IMPL * -ACE_CORBA_Object_Ref<IMPL>::operator->(void) -{ - return impl_; -} - -IMPL * -ACE_CORBA_Object_Ref<IMPL>::operator IMPL *(void) -{ - return impl_; -} - -ACE_CORBA_Object_Ref<IMPL> * -ACE_CORBA_Object_Ref<IMPL>::_duplicate (ACE_CORBA_Object_Ref<IMPL> *source) -{ - source->ref_count_++; - return source; -} - -*/ -#endif /* ACE_CORBA_UTILS_C */ diff --git a/TAO/local/bin/Event_Service/CORBA_Utils_T.h b/TAO/local/bin/Event_Service/CORBA_Utils_T.h deleted file mode 100644 index 8abf180d9e1..00000000000 --- a/TAO/local/bin/Event_Service/CORBA_Utils_T.h +++ /dev/null @@ -1,236 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ace_orb -// -// = FILENAME -// CORBA_Utilities.h -// -// = AUTHORS -// Tim Harrison. -// -// = NOTE -// This class is a bit ackward when using a real ORB, but we cannot -// easily remove it since some of the types are used in the -// implementation of the EC. TODO -// -// ============================================================================ - -#if !defined (ACE_CORBA_UTILS_H) -#define ACE_CORBA_UTILS_H - -#include "ace/Time_Value.h" -#include "tao/corba.h" - -template <class TYPE> -class ACE_CORBA_Sequence// : public CORBA::Object -// = TITLE -// -// = DESCRIPTION -{ -public: - - ACE_CORBA_Sequence (const ACE_CORBA_Sequence<TYPE> &source); - // Copy construction. - - ACE_CORBA_Sequence (CORBA::ULong max); - ACE_CORBA_Sequence (CORBA::ULong max, - CORBA::ULong length, - TYPE* data, - CORBA::Boolean release = 0); - ACE_CORBA_Sequence (void); - - virtual ~ACE_CORBA_Sequence (void); - - ACE_CORBA_Sequence<TYPE> &operator= (const ACE_CORBA_Sequence<TYPE> &); - - // static TYPE* allocbuf(CORBA::ULong nelems); - // static void freebuf(TYPE* data); - - CORBA::ULong maximum (void) const; - CORBA::ULong length (void) const; - void length (CORBA::ULong len); - - TYPE& operator [] (CORBA::ULong IT_i); - - const TYPE& operator [] (CORBA::ULong IT_i) const; - - virtual TYPE *new_array (size_t len); - // Allocates TYPE[len]. This facilitates template methods through - // template specialization to allow the use of different memory - // pools. - - virtual void delete_array (TYPE *buf, size_t len); - // delete [] <buf>. - -protected: - CORBA::ULong maximum_; - CORBA::ULong length_; - TYPE* buffer_; - unsigned char release_; -}; - -// Utility for debugging sequences. -//template <class TYPE> -//void dump (const ACE_CORBA_Sequence<TYPE> &seq); - -// Utility for appending single items. Increases the length of <set> -// and adds <event> to the end of <set>. -template <class TYPE> void -operator += (ACE_CORBA_Sequence<TYPE> &seq, - const TYPE &item) -{ - CORBA::ULong length = seq.length (); - seq.length (length + 1); - seq[length] = item; -} - -// Utility for appending sequences. -template <class TYPE> void -operator += (ACE_CORBA_Sequence<TYPE> &dest, - const ACE_CORBA_Sequence<TYPE> &source); - -template <class TYPE> void -remove_item (TYPE &seq, CORBA::ULong index) -{ - int new_length = seq.length () - 1; - - // Shift the set back one, starting at <index>. - for (int x = index; x < new_length; x++) - seq[x] = seq[x+1]; - - // Set the new length. - seq.length (new_length); -} -// Removes seq[index] by moving everything after <index> back and -// decrementing the length. - -// ************************************************************ - -template <class TYPE> -class ACE_CORBA_var -// = TITLE -// -// = DESCRIPTION -{ -public: - ACE_CORBA_var (const ACE_CORBA_var<TYPE> &source); - ACE_CORBA_var (void); - ACE_CORBA_var (TYPE *source); - ~ACE_CORBA_var (void); - ACE_CORBA_var<TYPE> &operator= (TYPE *source); - ACE_CORBA_var<TYPE> &operator= (const ACE_CORBA_var<TYPE> &source); - TYPE *operator->(void); - operator TYPE *(void) const; - // operator TYPE *&(void); - operator TYPE &(void) const; -private: - TYPE *me_; -}; - -// ************************************************************ - -/* -template <class IMPL> -class ACE_CORBA_Object_Ref : public CORBA::Object -// = TITLE -// ACE CORBA Object Reference -// -// = DESCRIPTION -// A wrapper for making CORBA Object References. For a single -// address space ORB, this points directly to the IMPL -// class. This is supposed to look like a pointer to -// IMPL with an additional static _duplicate method. -{ -public: - // ACE_CORBA_Object_Ref (ACE_CORBA_Object_Ref<IMPL> &obj); - ACE_CORBA_Object_Ref (void); - ACE_CORBA_Object_Ref (IMPL *impl); - ~ACE_CORBA_Object_Ref (void); - // ACE_CORBA_Object_Ref<IMPL> &operator= (IMPL *source); - ACE_CORBA_Object_Ref<IMPL> &operator= - (const ACE_CORBA_Object_Ref<IMPL> &source); - - IMPL *operator->(void); - // A distributed ORB would require that the CORBA Object Reference - // implement all IMPL interfaces, marshall the parameters, - // and transmit over IIOP. For this single address space ORB, we'll - // just delegate method calls to the IMPL directly. - - operator IMPL *(void) const; - // operator IMPL *&(void); - // operator IMPL &(void) const; - - static ACE_CORBA_Object_Ref<IMPL> *_duplicate - (ACE_CORBA_Object_Ref<IMPL> *source); - -private: - IMPL *impl_; -}; -*/ - -// ************************************************************ - -template <class ITEM, size_t SIZE> -class ACE_ES_Simple_Array -// = TITLE -// Simple Array -// -// = DESCRIPTION -// Wraps ITEM[SIZE] with insert and an iterator. There is no -// remove. It allows duplicates. It is truly very simple. -{ - public: - ACE_ES_Simple_Array (void); - int insert (const ITEM ©_me); - size_t size (void); - ITEM *data (void); - protected: - ITEM data_[SIZE]; - size_t size_; -}; - -template <class ITEM> -class ACE_ES_Array_Iterator -// = TITLE -// Simple Iterator -// -// = DESCRIPTION -// Iterates through an array of ITEMs. -{ -public: - ACE_ES_Array_Iterator (ITEM *data, size_t size); - - int next (ITEM *&next_item); - // Returns 0 when all items have been seen, else 1. Sets - // <next_item> to point at the next ITEM. - - int advance (void); - // Move forward by one element in the Stack. Returns 0 when all the - // items in the Stack have been seen, else 1. - - int done (void) const; - // Returns 1 when all items have been seen, else 0. - -private: - ITEM *data_; - size_t size_; - size_t index_; -}; - -#if defined (__ACE_INLINE__) -#include "CORBA_Utils_T.i" -#endif /* __ACE_INLINE__ */ - -#if defined (ACE_TEMPLATES_REQUIRE_SOURCE) -#include "CORBA_Utils_T.cpp" -#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ - -#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) -#pragma implementation ("CORBA_Utils_T.cpp") -#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ - -#endif /* ACE_CORBA_UTILS_H */ diff --git a/TAO/local/bin/Event_Service/CORBA_Utils_T.i b/TAO/local/bin/Event_Service/CORBA_Utils_T.i deleted file mode 100644 index b31b093baf2..00000000000 --- a/TAO/local/bin/Event_Service/CORBA_Utils_T.i +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -template <class TYPE> ACE_INLINE CORBA::ULong -ACE_CORBA_Sequence<TYPE>::maximum (void) const -{ - return maximum_; -} - -template <class TYPE> ACE_INLINE CORBA::ULong -ACE_CORBA_Sequence<TYPE>::length() const -{ - return length_; -} - - -// ************************************************************ - -template <class ITEM, size_t SIZE> ACE_INLINE -ACE_ES_Simple_Array<ITEM, SIZE>::ACE_ES_Simple_Array (void) : - size_ (0) -{ -} - -template <class ITEM, size_t SIZE> ACE_INLINE int -ACE_ES_Simple_Array<ITEM, SIZE>::insert (const ITEM ©_me) -{ - if (size_ >= SIZE) - return -1; - - data_[size_++] = copy_me; - return 0; -} - -template <class ITEM, size_t SIZE> ACE_INLINE size_t -ACE_ES_Simple_Array<ITEM, SIZE>::size (void) -{ - return size_; -} - -template <class ITEM, size_t SIZE> ACE_INLINE ITEM * -ACE_ES_Simple_Array<ITEM, SIZE>::data (void) -{ - return data_; -} - -// ************************************************************ - -template <class ITEM> ACE_INLINE -ACE_ES_Array_Iterator<ITEM>::ACE_ES_Array_Iterator (ITEM *data, size_t size) : - data_ (data), - size_ (size), - index_ (0) -{ -} - -template <class ITEM> ACE_INLINE int -ACE_ES_Array_Iterator<ITEM>::next (ITEM *&next_item) -{ - next_item = &data_[index_]; - return index_ < (size_ - 1); -} - -template <class ITEM> ACE_INLINE int -ACE_ES_Array_Iterator<ITEM>::advance (void) -{ - index_++; - return index_ < size_; -} - diff --git a/TAO/local/bin/Event_Service/Channel_Clients.i b/TAO/local/bin/Event_Service/Channel_Clients.i deleted file mode 100644 index 6318deb79a0..00000000000 --- a/TAO/local/bin/Event_Service/Channel_Clients.i +++ /dev/null @@ -1,2 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ diff --git a/TAO/local/bin/Event_Service/Channel_Clients_T.i b/TAO/local/bin/Event_Service/Channel_Clients_T.i deleted file mode 100644 index f7c0760fd86..00000000000 --- a/TAO/local/bin/Event_Service/Channel_Clients_T.i +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -template <class TARGET> ACE_INLINE -ACE_PushConsumer_Adapter<TARGET>::ACE_PushConsumer_Adapter (TARGET *target) - : target_ (target) -{ -} - -template <class TARGET> ACE_INLINE void -ACE_PushConsumer_Adapter<TARGET>::push (const RtecEventComm::EventSet& events, - CORBA::Environment &_env) -{ - target_->_push (events, _env); -} - -template <class TARGET> ACE_INLINE void -ACE_PushConsumer_Adapter<TARGET>::disconnect_push_consumer (CORBA::Environment &_env) -{ - target_->_disconnect_push_consumer (_env); -} - -// ************************************************************ - -template <class TARGET> ACE_INLINE -ACE_PushSupplier_Adapter<TARGET>::ACE_PushSupplier_Adapter (TARGET *target) - : target_ (target) -{ -} - -template <class TARGET> ACE_INLINE void -ACE_PushSupplier_Adapter<TARGET>::disconnect_push_supplier (CORBA::Environment &_env) -{ - target_->_disconnect_push_supplier (_env); -} diff --git a/TAO/local/bin/Event_Service/Debug_Macros.h b/TAO/local/bin/Event_Service/Debug_Macros.h deleted file mode 100644 index 8db3d169082..00000000000 --- a/TAO/local/bin/Event_Service/Debug_Macros.h +++ /dev/null @@ -1,11 +0,0 @@ - -#if defined (ACE_ES_NOLOGGING) -#define ACE_ES_DEBUG(X) -#define ACE_ES_DEBUG_ST(X) -#else -#define ACE_ES_DEBUG(X) \ - do { \ - ACE_Log_Msg::instance ()->log X; \ - } while (0) -#define ACE_ES_DEBUG_ST(X) X -#endif /* ACE_ES_NOLOGGING */ diff --git a/TAO/local/bin/Event_Service/Dispatching_Modules.cpp b/TAO/local/bin/Event_Service/Dispatching_Modules.cpp deleted file mode 100644 index d6527ad78d0..00000000000 --- a/TAO/local/bin/Event_Service/Dispatching_Modules.cpp +++ /dev/null @@ -1,606 +0,0 @@ -// $Id$ - -#include "ace/Sched_Params.h" -#include "Memory_Pools.h" -#include "Scheduler_Factory.h" - -#include "Dispatching_Modules.h" - -#if !defined (__ACE_INLINE__) -#include "Dispatching_Modules.i" -#endif /* __ACE_INLINE__ */ - -typedef ACE_EventChannel::DISPATCH_ERROR DISPATCH_ERROR; -typedef ACE_EventChannel::SYNCHRONIZATION_ERROR SYNC_ERROR; -typedef ACE_EventChannel::QOS_ERROR QOS_ERROR; - -// ************************************************************ - -void -ACE_ES_Dispatch_Request::make_copy (RtecEventComm::EventSet &dest) const -{ - if (use_single_event_) - { - dest.length (1); - dest[0] = single_event_; - } - else - { - dest.length (event_set_.length ()); - - for (CORBA::ULong index=0; index < event_set_.length (); index++) - { - RtecEventComm::Event &dest_event = dest[index]; - ACE_ES_Event_Container_var &source_event_var = ((ACE_ES_Event_Container_var &) event_set_[index]); - dest_event = *(source_event_var.operator->()); - } - } -} - -int -ACE_ES_Dispatch_Request::execute (u_long &command_action) -{ - ACE_TIMEPROBE (" dispatch (dequeue) the event"); - - return dispatching_module_->dispatch_event (this, command_action); -} - -#if 0 -void * -ACE_ES_Dispatch_Request::operator new (size_t nbytes) -{ - if (nbytes > sizeof (ACE_ES_Dispatch_Request)) - { - ACE_ERROR ((LM_ERROR, "nbytes = %d, sizeof (ACE_ES_Dispatch_Request_Chunk) = %d.\n", - sizeof (ACE_ES_Dispatch_Request))); - ACE_ASSERT (nbytes <= sizeof (ACE_ES_Dispatch_Request)); - } - - return ACE_ES_Memory_Pools::new_Dispatch_Request (); -} - -void -ACE_ES_Dispatch_Request::operator delete (void *mem) -{ - ACE_ES_Memory_Pools::delete_Dispatch_Request (mem); -} -#endif /* 0 */ - -// ************************************************************ - -ACE_ES_Priority_Dispatching::ACE_ES_Priority_Dispatching (ACE_EventChannel *channel, - int threads_per_queue) - : ACE_ES_Dispatching_Base (channel), - notification_strategy_ (this), - highest_priority_ (0), - shutdown_ (0), - threads_per_queue_ (threads_per_queue) -{ - // If we're single threaded, then we need to use the notification strategy. - if ((threads_per_queue_ == 0) && - (notification_strategy_.open () == -1)) - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Priority_Dispatching")); - - // Initialize the queues. - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - { - queues_[x] = 0; - delete_me_queues_[x] = 0; - } - - this->initialize_queues (); -} - -ACE_ES_Priority_Dispatching::~ACE_ES_Priority_Dispatching (void) -{ - // Delete the queues. - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - delete delete_me_queues_[x]; -} - - -void -ACE_ES_Priority_Dispatching::initialize_queues (void) -{ - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - { - RtecScheduler::Period tv = ACE_Scheduler_Rates[x]; - queues_[x] = new ACE_ES_Dispatch_Queue (this, ¬ification_strategy_); - if (queues_[x] == 0 || - queues_[x]->open_queue (tv, threads_per_queue_) == -1) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Priority_Dispatching::initialize_queues")); - return; - } - - queue_count_[x] = 1; - } - - highest_priority_ = ACE_Scheduler_MAX_PRIORITIES - 1; -} - -void -ACE_ES_Priority_Dispatching::connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - down_->connected (consumer, _env); - - // This code does dynamic allocation of channel dispatch threads. - // It requires that consumer's priorities are known at connection - // time and that threads can request priorities from the scheduler - // at run-time. These are both antithetical to static scheduling. - // The constructor now allocates a thread per rate group. -#if 0 - // We have to tell the lower portions of the channel about the - // consumer first. This is so that any changes to the consumer's - // qos will take effect when we get the dispatch priority. - down_->connected (consumer, _env); - - RtecScheduler::OS_Priority priority = - ACE_Scheduler::instance ().preemption_priority (consumer->qos ().rt_info_); - - { - ACE_ES_GUARD ace_mon (lock_); - - // If a queue has not been created for the consumer's priority, - // create one. - if (queues_[priority] == 0) - { - // Allocate a new dispatch queue. - queues_[priority] = new ACE_ES_Dispatch_Queue (this, ¬ification_strategy_); - if (queues_[priority] == 0) - ACE_THROW (CORBA::NO_MEMORY (0, CORBA::COMPLETED_NO, - "ACE_ES_Priority_Dispatching::connected")); - - // Initialize the dispatch queue corresponding to the - // consumer's priority. With a full implementation of the - // run-time scheduler, the dispatch queue can find it's - // scheduling qos online. However, we pass the rate in case - // one is not found. The rate can be used to obtain the - // proper priority. If threads_per_queue_ == 0, then these - // queues will be passive. Otherwise, they will be active. - // This switches us between MT_ORB and ST_ORB. If we're - // single-threaded, this registers us with the ReactorEx using - // our notification_strategy_. If we're multi-threaded, this - // spawns the threads. - if (queues_[priority]->open_queue (priority, - threads_per_queue_) == -1) - ACE_THROW (DISPATCH_ERROR (0, CORBA::COMPLETED_NO, - "ACE_ES_Priority_Dispatching::connected:" - "queue open failed.\n")); - - // When this goes down to 0, we will shutdown the queue. - queue_count_[priority] = 1; - - // Keep track of this to optimize handle_signal. - if (priority > highest_priority_) - highest_priority_ = priority; - - ACE_DEBUG ((LM_DEBUG, "Created queue priority = %d.\n", priority)); - } - else - queue_count_[priority]++; - } -#endif -} - -void -ACE_ES_Priority_Dispatching::disconnected (ACE_Push_Consumer_Proxy *consumer) -{ - // We'll not dynamically close down queues. - ACE_UNUSED_ARG (consumer); - -#if 0 - RtecScheduler::OS_Priority priority = - ACE_Scheduler::instance ().preemption_priority (consumer->qos ().rt_info_); - - { - ACE_ES_GUARD ace_mon (lock_); - - // If there are no more users of this queue, then we *could* shut - // it down. However, we will not. - if (--queue_count_[priority] <= 0) - { - ACE_DEBUG ((LM_DEBUG, "(%t) unused dispatch queue priority = %d, " - "is_empty = %d.\n", - priority, queues_[priority]->msg_queue ()->is_empty ())); - - queues_[priority]->shutdown_task (); - } - } -#endif -} - -// @@ This method could have a bypass optimization. -// <request> has been dynamically allocated by the filtering module. -void -ACE_ES_Priority_Dispatching::push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &_env) -{ - ACE_TIMEPROBE (" push_source_type: Correlation Module"); - - RtecScheduler::OS_Priority thread_priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_priority; - - if (request->rt_info () != 0) - { - // @@ TODO use ACE_TRY&friends - ACE_TIMEPROBE (" Priority_Dispatching::push - priority requested"); - ACE_Scheduler_Factory::server ()->priority - (request->rt_info (), - thread_priority, - subpriority, - preemption_priority, - _env); - ACE_TIMEPROBE (" Priority_Dispatching::push - priority obtained"); - if (_env.exception ()) - { - return; - } - } - else - { - thread_priority = - ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_PROCESS); - subpriority = ACE_Scheduler_MIN_SUB_PRIORITY; - preemption_priority = ACE_Scheduler_MIN_PREEMPTION_PRIORITY; - } - - // If it's a request to forward an event, it needs a reference to us - // to call dispatch_event. - request->set (this, preemption_priority, subpriority); - - // Make sure that a queue exists for this priority. - if (queues_[preemption_priority] == 0) - { - ACE_ERROR ((LM_ERROR, "Push to closed queue %d, dropping event.\n", preemption_priority)); - return; -#if 0 - ACE_THROW (SYNC_ERROR (0, CORBA::COMPLETED_NO, "ACE_ES_Priority_Dispatching::push")); -#endif /* 0 */ - } - - // Enqueue the request. If we're multi-threaded, this request is a - // command object that will be called by the threads in the queue, - // or will be dequeued by this->handle_signal if we're - // single-threaded. - if (queues_[preemption_priority]->try_put (request) == -1) - { - if (ACE_ES_Dispatch_Request::release (request) != 0) - ACE_ERROR ((LM_ERROR, "ACE_ES_Priority_Dispatching::push" - " release failed.\n")); - if (errno != EPIPE) - { - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ Orbix parameters - // 0, CORBA::COMPLETED_NO, - // "ACE_ES_Priority_Dispatching::push enqueue failed")); - } - else - { - ACE_DEBUG ((LM_DEBUG, - "Request rejected from closed queue %d.\n", - preemption_priority)); - } - } -} - -// Start at highest priority queue checking for queued events -// continuing to lowest priority queue. If an event is ever found, -// dispatch it and then start back at the highest priority queue -// again. -int -ACE_ES_Priority_Dispatching::handle_signal (int, siginfo_t *, ucontext_t *) -{ - int done; - - do - { - done = 1; - for (int x = 0; x <= highest_priority_; x++) - { - // If the queue is not empty, dispatch the request and then - // start the for loop from the beginning. - if ((queues_[x] != 0) && (!queues_[x]->msg_queue ()->is_empty ())) - { - // Dequeue and service the request. - queues_[x]->svc_one (); - - // Exit the for loop and start over. - done = 0; - break; - } - - // If we get through the whole for loop without dispatching - // anything, then we're done. - } - } - while (!done); - - - return 0; -} - -// This is only for the non-win32 single-threaded implementation. -int -ACE_ES_Priority_Dispatching::handle_input (ACE_HANDLE) -{ - return this->handle_signal (0, 0, 0); -} - -// Shutdown each queue. When each queue exits, they will call back -// this->dispatch_queue_closed which allows us to free up resources. -// When the last queue has closed, we'll delete ourselves. -void -ACE_ES_Priority_Dispatching::shutdown (void) -{ - if (shutdown_) - return; - - ACE_DEBUG ((LM_DEBUG, "(%t) ACE_ES_Priority_Dispatching " - "module shutting down.\n")); - - shutdown_ = 1; - - // If we're single threaded, then we need to shut down the - // notification strategy so it can remove itself from the reactor. - if (threads_per_queue_ == 0) - notification_strategy_.shutdown (); - - // Whether these are active or not, they must be shut down. - for (int x = 0; x <= highest_priority_; x++) - if (queues_[x] != 0) - { - ACE_DEBUG ((LM_DEBUG, "shutting down dispatch queue %d.\n", x)); - queues_[x]->shutdown_task (); - } -} - -// This gets called every time a Dispatch Queue closes down. We -// search for <queue> and delete it. If we have been told to delete -// ourself, after the last queue has been deleted, we delete -// ourselves. -void -ACE_ES_Priority_Dispatching::dispatch_queue_closed (ACE_ES_Dispatch_Queue *queue) -{ - ACE_ES_GUARD ace_mon (lock_); - - // Find the queue. - for (int x = 0; x <= highest_priority_; x++) - { - if (queues_[x] == queue) - { - ACE_DEBUG ((LM_DEBUG, "(%t) Dispatch queue %d is closed.\n", x)); - - // Store the queue for deleting in this object's destructor. - delete_me_queues_[x] = queues_[x]; - queues_[x] = 0; - - // Reset highest_priority_. - if (x == highest_priority_) - { - while ((--highest_priority_ >= 0) && - (queues_[highest_priority_] == 0)); - - if (highest_priority_ < 0) - { - ACE_DEBUG ((LM_DEBUG, "Dispatching module shut down.\n")); - up_->shutdown (); - return; - } - } - - // If we found the queue, we can exit the for loop. - break; - } - } -} - -/* -ACE_HANDLE -ACE_ES_Priority_Dispatching::get_handle (void) const -{ - ACE_ES_Priority_Dispatching *fake_this = (ACE_ES_Priority_Dispatching *) this; - return fake_this->notification_strategy_.get_handle (); -} -*/ - -// ************************************************************ - -ACE_ES_Dispatch_Queue::ACE_ES_Dispatch_Queue (ACE_ES_Dispatching_Base *dispatching_module, - ACE_ES_Notification_Strategy *notification_strategy) - : dispatching_module_ (dispatching_module), - notification_strategy_ (notification_strategy) -{ -} - -int -ACE_ES_Dispatch_Queue::open_queue (RtecScheduler::Period &period, - int threads) -{ - // First set up the correct message queue according to whether the - // dispatch queue will be active or not. - - // If there are no threads specified, we'll register with the - // reactor to be called back when someone queues a message. - if (threads == 0) - { - // Allocate a message queue that notifies a reactor when events - // arrive via the msg_queue call. If that succeeds, set the - // notification strategy in our message queue via the open call. - if (this->msg_queue () == 0 || - this->msg_queue ()->open (ACE_ES_QUEUE::DEFAULT_HWM, - ACE_ES_QUEUE::DEFAULT_LWM, - notification_strategy_) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p msg_queue.open failed.\n", - "ACE_ES_Dispatch_Queue::open_queue"), -1); - } - else - { - // Allocate a message queue that does not notify. - ACE_ES_MQ *mq = new ACE_ES_MQ; - if (mq == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Dispatch_Queue::open_queue"), -1); - else - { - // This deletes previous message queue. - this->msg_queue (mq); - // Set this so that the destructor of ACE_Task deletes our - // message queue. Note, this must be after the call to - // msg_queue. - delete_msg_queue_ = 1; - } - } - - // Create a name for ourselves using the priority. - char temp[64]; - ACE_OS::sprintf (temp, "ACE_ES_Dispatch_Queue-%u", period); - - // Open the task. This will query the scheduler for our qos - // structure. It will also synch_threads if it succeeds. - int result = this->open_task (temp); - - switch (result) - { - case -1: - // Error. - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Dispatch_Queue::open_queue"), -1); - case 0: - ACE_TRY - {// @@ TODO: Handle exceptions... - ACE_Scheduler_Factory::server()->set(rt_info_, - 0, 0, 0, 0, - RtecScheduler::VERY_LOW, - RtecScheduler::NO_QUANTUM, - 1, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "ACE_ES_Display_Queue::exception"), -1); - } - ACE_ENDTRY; - case 1: - // Found. - break; - } - - // Spawn threads. - return this->synch_threads (threads); -} - -// This is called back by ACE_RT_Task when all the threads have -// exited. We're going to forward this event to the dispatching -// module so it can clean up any resources. -void -ACE_ES_Dispatch_Queue::threads_closed (void) -{ - dispatching_module_->dispatch_queue_closed (this); -} - -// ************************************************************ - -ACE_ES_EFD_Dispatching::ACE_ES_EFD_Dispatching (ACE_EventChannel *channel) - : ACE_ES_Dispatching_Base (channel) -{ -} - -void -ACE_ES_EFD_Dispatching::push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &) -{ - // If it's a request to forward an event, it needs a reference to us - // to call dispatch_event. - request->set (this, 0, ACE_Scheduler_MIN_SUB_PRIORITY); - - u_long command_action = ACE_RT_Task_Command::RELEASE; - - // This may be a request to delete a push consumer proxy, so we - // should execute it instead of just forwarding it. - request->execute (command_action); - - switch (command_action) - { - case ACE_RT_Task_Command::RELEASE: - // Free the request. - if (ACE_ES_Dispatch_Request::release (request) != 0) - ACE_ERROR ((LM_ERROR, "ACE_ES_EFD_Dispatching::push" - " release failed.\n")); - break; - - default: - ACE_ERROR ((LM_ERROR, "ACE_ES_EFD_Dispatching::push: unknown command action.\n")); - } -} - -// ************************************************************ - -ACE_ES_RTU_Dispatching::ACE_ES_RTU_Dispatching (ACE_EventChannel *channel) - : ACE_ES_Priority_Dispatching (channel, 0) -{ -} - -// We're called from a dispatch queue, so we can not release the request. -int -ACE_ES_RTU_Dispatching::dispatch_event (ACE_ES_Dispatch_Request *request, - u_long &command_action) -{ - // Store the priority of the task currently running. - channel_->rtu_manager ()->priority (request->priority ()); - - ACE_TRY - { - // Forward the request. - up_->push (request, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "ACE_ES_RTU_Dispatching::dispatch_event unknown exception.\n")); - } - ACE_ENDTRY; - - // Reset the priority. - channel_->rtu_manager ()->priority (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, ACE_SCOPE_PROCESS)); - - // If the task was preempted, enqueue the request on the head of the - // dispatch queue. - if (channel_->rtu_manager ()->not_done ()) - command_action = ACE_RT_Task_Command::UNGETQ; - else - // We're done with it. - command_action = ACE_RT_Task_Command::RELEASE; - - return 0; -} - -void -ACE_ES_RTU_Dispatching::push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &_env) -{ - // First enqueue the message in the proper queue. - ACE_ES_Priority_Dispatching::push (request, _env); - - // If the current event is higher priority (lower value) than the - // current running task, then tell the task to preempt itself. - int request_priority = request->priority (); - int running_priority = channel_->rtu_manager ()->priority (); - if (request_priority < running_priority) - channel_->rtu_manager ()->should_preempt (1); - return; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_CORBA_Sequence<ACE_CORBA_var<ACE_ES_Event_Container> >; -template void operator+=(ACE_CORBA_Sequence<ACE_CORBA_var<ACE_ES_Event_Container> > &, ACE_CORBA_var<ACE_ES_Event_Container> const &); - -#if defined(ACE_ES_LACKS_ORB) -template class ACE_CORBA_Sequence<ACE_ES_Event>; -#endif /* ACE_ES_LACKS_ORB */ - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/bin/Event_Service/Dispatching_Modules.h b/TAO/local/bin/Event_Service/Dispatching_Modules.h deleted file mode 100644 index c82f3889ff7..00000000000 --- a/TAO/local/bin/Event_Service/Dispatching_Modules.h +++ /dev/null @@ -1,485 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// orbsvcs -// -// = FILENAME -// Dispatching_Module -// -// = AUTHOR -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// This file holds the different Event Service dispatching -// mechanisms. These include null-dispatching (EFD), -// single-threaded with (RTU) and without preemption (LAME), and a -// multithreaded implementation. -// -// ============================================================================ - -#ifndef ACE_DISPATCHING_MODULES_H -#define ACE_DISPATCHING_MODULES_H - -#include "tao/Timeprobe.h" -#include "ReactorTask.h" -#include "Event_Channel.h" - -// ************************************************************ - -// Forward declarations. -class ACE_ES_Dispatch_Queue; -class ACE_ES_Dispatch_Request; - -// ************************************************************ - -// Forward declarations. -class ACE_ES_Consumer_Module; - -class ACE_ES_Dispatching_Base : public ACE_Event_Handler -// = TITLE -// Event Service Dispatch Module base class -// -// = DESCRIPTION -// We inherit from ACE_Event_Handler so that we can be called back -// by the ReactorEx when requests are queued. The virtual -// dispatch_event method allows ACE_ES_Dispatch_Requests to call -// back the dispatching module when acting as command objects. When -// this implementation is used by the Event Channel it forwards all -// dispatch calls without any queuing. Therefore, it can be -// used to build an EFD. It is also inherited by the Priority -// Dispatching module. -{ -public: - ACE_ES_Dispatching_Base (ACE_EventChannel *channel); - // Default construction. - - virtual void open (ACE_ES_Consumer_Module *up, - ACE_ES_Correlation_Module *down); - // Link to adjacent modules. - - virtual void connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Forward down_. - - virtual void disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Forward down_. - - virtual void disconnected (ACE_Push_Consumer_Proxy *consumer); - // Release any unneeded dispatching resources. - - // = Not needed. - // void connected (ACE_Push_Supplier_Proxy *supplier); - // void disconnecting (ACE_Push_Supplier_Proxy *supplier); - - virtual void push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &) = 0; - // Forward up_. - - virtual int dispatch_event (ACE_ES_Dispatch_Request *request, - u_long &command_action); - // Called by ACE_ES_Dispatch_Requests when dequeued by RT_Tasks. - - virtual void dispatch_queue_closed (ACE_ES_Dispatch_Queue *q); - // Called when all the threads of a <q> have exited. - - virtual void shutdown (void); - // This is called by the Event Channel. This will attempt to shut - // down all of its threads gracefully. Wish it luck. - -protected: - ACE_EventChannel *channel_; - // Dat der channel. - - ACE_ES_MUTEX lock_; - // To synchronize thr_count_. - - int thr_count_; - // The total number of threads in the Dispatching Module. This will - // be the sum of all the Dispatch Queue threads. - - ACE_ES_Consumer_Module *up_; - // Next module up. - - ACE_ES_Correlation_Module *down_; - // Next module down. -}; - -// ************************************************************ - -class ACE_ES_Dispatch_Request : public ACE_RT_Task_Command -// = TITLE -// ACE Event Service Dispatch Request -// -// = DESCRIPTION -// Encapsulates a consumer and the events that will be sent to the -// consumer. Right now, this class keeps a single_event_ that can -// be used when only one event is sent to the consumer. Since this -// is frequently the case (except for correlations), this -// optimization reduces the amount of dynamic memory allocation is -// necessary. This class is also a GOF Command object since it can -// be dequeued by an RT_Task to call back the dispatching module -// for request dispatching. -{ -public: - typedef ACE_CORBA_Sequence<ACE_ES_Event_Container_var> Event_Set; - - ACE_ES_Dispatch_Request (void); - // Default construction. - - virtual ~ACE_ES_Dispatch_Request (void); - // Default destruction. - - ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - RtecScheduler::handle_t rt_info); - // All the events must be added after construction to the - // event_set. - - ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - const Event_Set &event_set, - RtecScheduler::handle_t rt_info); - // Set consumer_ to <consumer> and copy <event_set> to event_set_. - // <rt_info> describes the method receiving this dispatch. - - ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - const RtecEventComm::Time &time, - RtecScheduler::handle_t rt_info); - // Set consumer_ to <consumer> and sets single_event_.creation_time_ - // to <time>. Sets use_single_event_ to 1. <rt_info> describes the - // method receiving this dispatch. - - ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - ACE_ES_Event_Container *event, - RtecScheduler::handle_t rt_info); - // Sets consumer_ and the first slot of event_set_. We use the - // event_set_ instead of the single_event_ so that we can just carry - // around the pointer to <event>. <rt_info> describes the method - // receiving this dispatch. - - RtecScheduler::handle_t rt_info (void); - // Description of the method receiving this request. - - void set (ACE_ES_Dispatching_Base *dispatching_module, - RtecScheduler::OS_Priority priority, - RtecScheduler::Sub_Priority sub_priority); - // For multi-threaded implementations, <dispatching_module> is - // called back when a request is dequeued. <priority> is the - // dispatch priority of the event. <sub_priority> is the enqueue - // priority of the event and will be forwarded to - // ACE_Message_Block. - - ACE_Push_Consumer_Proxy *consumer (void) const; - // Consumer accessor. - - const Event_Set &event_set (void) const; - // If accessed, make_copy will use event_set_. - - Event_Set &event_set (void); - // If accessed, make_copy will use event_set_. - - CORBA::ULong number_of_events (void) const; - // Returns 1 if we're using single_event, or event_set_.size (). - - void make_copy (RtecEventComm::EventSet &dest) const; - // Copy single_event or event_set into <dest>. - - virtual int execute (u_long &command_action); - // Calls dispatching_module_->dispatch_event. - - RtecScheduler::OS_Priority priority (void); - // Priority accessor. - -#if 0 - // @@ This cannot be done: the object would be allocated using this - // class operator new, but it will be removed using the - // ACE_Message_Block operator delete! - void *operator new (size_t nbytes); - // Allocates memory from a thread-specific memory pool. - - void operator delete (void *); - // Returns memory to a thread-specific memory pool. -#endif - -protected: - RtecScheduler::OS_Priority priority_; - - RtecScheduler::handle_t rt_info_; - // Describes the method receiving this dispatch. - - ACE_ES_Dispatching_Base *dispatching_module_; - // The dispatching module called back when we're dequeued by a - // thread. - - int use_single_event_; - // Is true if we're using a single event. Is 0 is we're using - // event_set_. - - ACE_Push_Consumer_Proxy *consumer_; - // The final destination for single_event_ or event_set_. - - ACE_ES_Event_Container single_event_; - // This is used for single event dispatches. - - Event_Set event_set_; - // This is used for event sets that need to be dispatched. -}; - -// ************************************************************ - -#if defined (ACE_WIN32) -class ACE_ES_ReactorEx_NS : public ACE_Notification_Strategy -// = TITLE -// Event Service ReactorEx Notification Strategy -// -// = DESCRIPTION -// Integrates the ACE_Message_Queue notification to signal a -// handle that will wake up the ACE_ES_Priority_Dispatching -// module. This is used in place of the -// ACE_ReactorEx_Notification_Strategy to avoid any queueing by -// the ReactorEx::notify mechanism. -{ -public: - ACE_ES_ReactorEx_NS (ACE_Event_Handler *eh); - // Stores away <eh> for when this->open is called. - - int open (void); - // Registers eh_ with the ReactorEx to be notified when this->notify - // is called. - - void shutdown (void); - // Removes self from the reactor. - - // = These result in eh_->handle_signal getting called. eh_ should - // point to a dispatching module. - virtual int notify (void); - virtual int notify (ACE_Event_Handler *, - ACE_Reactor_Mask mask); - - // ACE_HANDLE get_handle (void); - // Returns event_.handle (). - -private: - ACE_Auto_Event event_; - // Registered with the ReactorEx. -}; - -typedef ACE_ES_ReactorEx_NS ACE_ES_Notification_Strategy; - -#else // ******************************************************* - -class ACE_ES_Reactor_NS : public ACE_Reactor_Notification_Strategy -// = TITLE -// Event Service Reactor Notification Strategy -// -// = DESCRIPTION -// Maps to the ACE_Reactor_Notification_Strategy interface. This -// version is for non WIN32 platforms. -{ -public: - ACE_ES_Reactor_NS (ACE_Event_Handler *eh); - // Calls ACE_Reactor_Notification_Strategy with the ORB's reactor - // and signal mask. - - int open (void); - // Does nothing. - - void shutdown (void); - // Does nothing. -}; - -typedef ACE_ES_Reactor_NS ACE_ES_Notification_Strategy; - -#endif /* ACE_WIN32 */ - -// ************************************************************ - -class ACE_ES_MQ : public ACE_ES_QUEUE -// = TITLE -// Event Service Message Queue -{ - virtual int notify (void) { return 0;} - // Does nothing. -}; - -// ************************************************************ - -class ACE_ES_Dispatch_Queue : public ACE_RT_Task -// = TITLE -// Event Service Dispatch Queue -// -// = DESCRIPTION -// An encapsulation of a dispatch queue. By inheriting from -// ACE_RT_Task, we can make this zero-threaded or multi-threaded. -{ -public: - ACE_ES_Dispatch_Queue (ACE_ES_Dispatching_Base *dispatching_module, - ACE_ES_Notification_Strategy *notification_strategy); - // Stores <dispatching_module> for this->threads_closed. Stores - // away <notification_strategy> for this->synch_threads. - - int open_queue (RtecScheduler::Period &period, - int threads); - // This is a hack to get the channel to work with the new - // scheduler. - -#if 0 - int open_queue (RtecScheduler::OS_Priority priority, - int threads); - // Creates a name from the <priority> and tries to find a scheduling - // qos structure. If one is not found, but created, qos_ is set - // with default values. Either way, if qos_->thread_ > 0, it calls - // this->synch_threads. Otherwise, our message queue will use - // notification_strategy_. This will cause the ReactorEx to call - // back the dispatching_module_ when requests are queued on our - // message queue. Returns 0 on success, -1 on failure. -#endif - - virtual void threads_closed (void); - // Called when every thread has exited. This will call - // dispatching_module_->dispatch_queue_closed. - -private: - ACE_ES_Dispatching_Base *dispatching_module_; - // Used in threads_closed. - - ACE_ES_Notification_Strategy *notification_strategy_; - // Notifies the Dispatching Module when a request has been queued on - // our message queue. -}; - -// ************************************************************ - -class ACE_ES_Priority_Dispatching : public ACE_ES_Dispatching_Base -// = TITLE -// Event Service Priority Dispatching Module -// -// = DESCRIPTION -// Inherits from ACE_Event_Handler to utilitize the -// ACE_Message_Queue notification strategy. This implementation -// does priority dispatching without preemption. -{ -public: - ACE_ES_Priority_Dispatching (ACE_EventChannel *channel, - int threads_per_queue); - // Store <channel>. Spawns <threads_per_queue> thread for each - // dispatch queue. If != 0, then the channel is an MT_CHANNEL. If - // == 0, then the channel is an ST_CHANNEL. - - ~ACE_ES_Priority_Dispatching (void); - // Delete queues. - - void connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Allocate any needed dispatching resources for this consumers - // priority. - - void disconnected (ACE_Push_Consumer_Proxy *consumer); - // Release unneeded dispatch queues. - - // = Not needed. - // void connected (ACE_Push_Supplier_Proxy *supplier); - // void disconnecting (ACE_Push_Supplier_Proxy *supplier); - - virtual void push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &); - // Enqueues the request on the appropriate Dispatch Queue. - - virtual void shutdown (void); - // Closes all queues "asynchronously." When all queues are closed, - // deletes them all and then deletes itself. - - virtual void dispatch_queue_closed (ACE_ES_Dispatch_Queue *q); - // Called when all the threads of a <q> have exited. Deletes <q>. - - // virtual ACE_HANDLE get_handle (void) const; - // Get the I/O handle. - -protected: - virtual int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0); - // Called when input has arrived on a message queue. This is used - // for single-threaded implementations. - - virtual int handle_input (ACE_HANDLE); - // For single-threaded implementations on non-win32 platforms that - // use the ACE_Reactor_Notification_Strategy. This just forwards - // all calls to this->handle_signal (). - - ACE_ES_Notification_Strategy notification_strategy_; - // Shared between all dispatch queues. - - void initialize_queues (void); - // This is a hack to create a queue for each of the 4 rate groups. - - ACE_ES_Dispatch_Queue *queues_[ACE_Scheduler_MAX_PRIORITIES]; - // Pointers to dispatch queues. - - ACE_ES_Dispatch_Queue *delete_me_queues_[ACE_Scheduler_MAX_PRIORITIES]; - // Pointers to dispatch queues that want to die. - - int queue_count_[ACE_Scheduler_MAX_PRIORITIES]; - // The number of consumers using each queue. - - int highest_priority_; - // The highest priority queue in queues_. This allows us to - // optimize the handle_signal method. - - int shutdown_; - // Make sure to only shutdown the dispatching module once. - - int threads_per_queue_; - // The number of threads to spawn for each dispatch queue. -}; - -// ************************************************************ - -class ACE_ES_EFD_Dispatching : public ACE_ES_Dispatching_Base -// = TITLE -// Event Service EFD Dispatching Module -// -// = DESCRIPTION -// Implements a zero-threaded dispatcher with no preemption. -{ -public: - ACE_ES_EFD_Dispatching (ACE_EventChannel *channel); - // Acquires the proper qos structure and passes <channel> onto to - // the dispatching base constructor. - - virtual void push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &); - // Forward up_. -}; - -// ************************************************************ - -class ACE_ES_RTU_Dispatching : public ACE_ES_Priority_Dispatching -// = TITLE -// Event Service RTU Dispatching Module -// -// = DESCRIPTION -// Implements a single-threaded dispatcher with delayed preemption. -{ -public: - ACE_ES_RTU_Dispatching (ACE_EventChannel *channel); - // Store <channel>. - - virtual int dispatch_event (ACE_ES_Dispatch_Request *request, - u_long &command_action); - // Called by ACE_Dispatch_Queues and handle_signal when an event - // needs to be dequeued. Implements an RTU-like delayed preemption - // policy. - - virtual void push (ACE_ES_Dispatch_Request *request, - CORBA::Environment &); - // Calls ACE_ES_Priority_Dispatching::push and then checks if - // preemption is necessary. -}; - -#if defined (__ACE_INLINE__) -#include "Dispatching_Modules.i" -#endif /* __ACE_INLINE__ */ -#endif /* ACE_DISPATCHING_MODULES_H */ - - diff --git a/TAO/local/bin/Event_Service/Dispatching_Modules.i b/TAO/local/bin/Event_Service/Dispatching_Modules.i deleted file mode 100644 index f9d7ea5dde4..00000000000 --- a/TAO/local/bin/Event_Service/Dispatching_Modules.i +++ /dev/null @@ -1,267 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -ACE_INLINE -ACE_ES_Dispatch_Request::ACE_ES_Dispatch_Request (void) : - priority_ (0), - rt_info_ (0), - dispatching_module_ (0), - use_single_event_ (0), - consumer_ (0), - single_event_ (), - event_set_ () -{ -} - -ACE_INLINE -ACE_ES_Dispatch_Request::~ACE_ES_Dispatch_Request (void) -{ -} - -ACE_INLINE -ACE_ES_Dispatch_Request::ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - RtecScheduler::handle_t rt_info) : - priority_ (0), - rt_info_ (rt_info), - dispatching_module_ (0), - use_single_event_ (0), - consumer_ (consumer), - single_event_ (), - event_set_ () -{ -} - -ACE_INLINE -ACE_ES_Dispatch_Request::ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - const Event_Set &event_set, - RtecScheduler::handle_t rt_info) : - priority_ (0), - rt_info_ (rt_info), - dispatching_module_ (0), - use_single_event_ (0), - consumer_ (consumer), - single_event_ (), - event_set_ (event_set) -{ -} - -ACE_INLINE -ACE_ES_Dispatch_Request::ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - ACE_ES_Event_Container *event, - RtecScheduler::handle_t rt_info) : - priority_ (0), - rt_info_ (rt_info), - dispatching_module_ (0), - use_single_event_ (0), - consumer_ (consumer), - single_event_ (), - event_set_ () -{ - event_set_ += event; -} - -ACE_INLINE -ACE_ES_Dispatch_Request::ACE_ES_Dispatch_Request (ACE_Push_Consumer_Proxy *consumer, - const RtecEventComm::Time &time, - RtecScheduler::handle_t rt_info) : - priority_ (0), - rt_info_ (rt_info), - dispatching_module_ (0), - use_single_event_ (1), - consumer_ (consumer), - single_event_ (), - event_set_ () -{ - single_event_.creation_time_ = time; - single_event_.type_ = ACE_ES_EVENT_TIMEOUT; -} - -ACE_INLINE void -ACE_ES_Dispatch_Request::set (ACE_ES_Dispatching_Base *dispatching_module, - RtecScheduler::OS_Priority preemption_priority, - RtecScheduler::Sub_Priority sub_priority) -{ - dispatching_module_ = dispatching_module; - priority_ = preemption_priority; - ACE_Message_Block::msg_priority (sub_priority); -} - -ACE_INLINE ACE_Push_Consumer_Proxy * -ACE_ES_Dispatch_Request::consumer (void) const -{ - return consumer_; -} - -ACE_INLINE const ACE_ES_Dispatch_Request::Event_Set & -ACE_ES_Dispatch_Request::event_set (void) const -{ - return event_set_; -} - -ACE_INLINE ACE_ES_Dispatch_Request::Event_Set & -ACE_ES_Dispatch_Request::event_set (void) -{ - return event_set_; -} - -ACE_INLINE CORBA::ULong -ACE_ES_Dispatch_Request::number_of_events (void) const -{ - if (use_single_event_) - return 1; - else - return event_set_.length (); -} - -ACE_INLINE RtecScheduler::OS_Priority -ACE_ES_Dispatch_Request::priority (void) -{ - return priority_; -} - -ACE_INLINE RtecScheduler::handle_t -ACE_ES_Dispatch_Request::rt_info (void) -{ - return rt_info_; -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Dispatching_Base::ACE_ES_Dispatching_Base (ACE_EventChannel *channel) - : channel_ (channel), - thr_count_ (0), - up_ (0), - down_ (0) -{ -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::open (ACE_ES_Consumer_Module *up, - ACE_ES_Correlation_Module *down) -{ - up_ = up; - down_ = down; - // 1 == 2. -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - down_->connected (consumer, _env); -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::disconnected (ACE_Push_Consumer_Proxy *consumer) -{ - // Do nothing. - ACE_UNUSED_ARG (consumer); -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - down_->disconnecting (consumer, _env); -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::dispatch_queue_closed (ACE_ES_Dispatch_Queue *q) -{ - ACE_UNUSED_ARG (q); -} - -// Just forward the request. This is basically a hook for the RTU -// stuff. -ACE_INLINE int -ACE_ES_Dispatching_Base::dispatch_event (ACE_ES_Dispatch_Request *request, - u_long &command_action) -{ - ACE_TIMEPROBE (" decode the event"); - - ACE_TRY - { - // Forward the request. - up_->push (request, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "ACE_ES_Dispatching_Base::dispatch_event unknown exception.\n")); - } - ACE_ENDTRY; - - // Tell our caller to release the request. - command_action = ACE_RT_Task_Command::RELEASE; - - // Return zero so our calling thread does not exit. - return 0; -} - -ACE_INLINE void -ACE_ES_Dispatching_Base::shutdown (void) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) ACE_ES_Dispatching_Base module shutting down.\n")); -} - -// ************************************************************ - -#if defined (ACE_WIN32) -ACE_INLINE -ACE_ES_ReactorEx_NS::ACE_ES_ReactorEx_NS (ACE_Event_Handler *eh) - : ACE_Notification_Strategy (eh, ACE_Event_Handler::NULL_MASK) -{ -} - -ACE_INLINE int -ACE_ES_ReactorEx_NS::open (void) -{ - return ACE_Task_Manager::instance ()-> - GetReactorTask (0)->get_reactor ().register_handler (eh_, event_.handle ()); -} - -ACE_INLINE void -ACE_ES_ReactorEx_NS::shutdown (void) -{ - ACE_Task_Manager::instance ()->GetReactorTask (0)-> - get_reactor ().remove_handler (eh_, ACE_Event_Handler::DONT_CALL); -} - -ACE_INLINE int -ACE_ES_ReactorEx_NS::notify (void) -{ - return event_.signal (); -} - -ACE_INLINE int -ACE_ES_ReactorEx_NS::notify (ACE_Event_Handler *eh, - ACE_Reactor_Mask mask) -{ - return event_.signal (); -} - -#else /* !defined (ACE_WIN32) */ -// This class is only necessary on non-win32 platforms. -ACE_INLINE -ACE_ES_Reactor_NS::ACE_ES_Reactor_NS (ACE_Event_Handler *eh) - : ACE_Reactor_Notification_Strategy (&(ACE_Task_Manager::instance ()-> - GetReactorTask (0)->get_reactor ()), - eh, ACE_Event_Handler::READ_MASK) -{ -} - -ACE_INLINE int -ACE_ES_Reactor_NS::open (void) -{ - return 0; -} - -ACE_INLINE void -ACE_ES_Reactor_NS::shutdown (void) -{ -} - -#endif /* ACE_WIN32 */ - -// ************************************************************ diff --git a/TAO/local/bin/Event_Service/Event_Channel.cpp b/TAO/local/bin/Event_Service/Event_Channel.cpp deleted file mode 100644 index 3cbe523cf0c..00000000000 --- a/TAO/local/bin/Event_Service/Event_Channel.cpp +++ /dev/null @@ -1,2831 +0,0 @@ -// $Id$ - - -#include "ace/Service_Config.h" - -#include "Dispatching_Modules.h" -#include "Memory_Pools.h" -#include "Scheduler_Factory.h" -#include "Event_Utilities.h" -#include "Event_Channel.h" - -// These are to save space. -#define WRITE_GUARD ACE_ES_WRITE_GUARD -#define READ_GUARD ACE_ES_READ_GUARD - -#if !defined (__ACE_INLINE__) -#include "Event_Channel.i" -#endif /* __ACE_INLINE__ */ - -// ************************************************************ - -static RtecScheduler::OS_Priority -Preemption_Priority (RtecScheduler::handle_t rtinfo) -{ - RtecScheduler::OS_Priority thread_priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_priority; - - ACE_TRY - { - ACE_TIMEPROBE (" Preemption_Priority - priority requested"); - ACE_Scheduler_Factory::server ()->priority - (rtinfo, - thread_priority, - subpriority, - preemption_priority, - ACE_TRY_ENV); - ACE_CHECK_ENV - ACE_TIMEPROBE (" connected - priority obtained"); - } - ACE_CATCH (RtecScheduler::UNKNOWN_TASK, ex_ut) - { - ACE_ERROR_RETURN ((LM_ERROR, "UNKNOWN_TASK %p.\n", - "Preemption_Priority"), 0); - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, "Unexpected exception %p.\n", - "Preemption_Priority"), 0); - - } - ACE_ENDTRY; - return preemption_priority; -} - -static RtecScheduler::OS_Priority -IntervalToPriority (RtecScheduler::Time interval) -{ - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - if (interval <= ACE_Scheduler_Rates[x]) - return x; - - return ACE_Scheduler_MIN_PREEMPTION_PRIORITY; -} - -// ************************************************************ - -class Shutdown_Consumer : public ACE_ES_Dispatch_Request -// = TITLE -// Shutdown Consumer command -// -// = DESCRIPTION -// This command object is sent through the system when a consumer -// disconnects. When the Dispatching Module dequeues this request, -// it calls execute which execute calls back to the Consumer -// Module. At that point, the Consumer Module can tell the rest of -// the system that the consumer has disconnected and delete the -// consumer proxy. This allows all events queued for the consumer -// to be flushed to the consumer proxy (which will drop them). -// Events can be queued in the ReactorEx (in a dispatch set), or in -// the Dispatching Module. -{ -public: - // When executed, tells <consumer_module> that <consumer> has shut - // down. - Shutdown_Consumer (ACE_ES_Consumer_Module *consumer_module, - ACE_Push_Consumer_Proxy *consumer) - : consumer_module_ (consumer_module) - { - consumer_ = consumer; - - // Set rt_info_ to the lowest priority rt_info in consumer_. - // This is so the dispatching module can query us as a dispatch - // request to get the appropriate preemption priority. - ACE_ES_Dependency_Iterator iter (consumer->qos ().dependencies); - while (iter.advance_dependency () == 0) - { - RtecEventComm::EventType &type = (*iter).event_.type_; - if (type != ACE_ES_GLOBAL_DESIGNATOR && - type != ACE_ES_CONJUNCTION_DESIGNATOR && - type != ACE_ES_DISJUNCTION_DESIGNATOR) - { - if (rt_info_ == 0 || - ::Preemption_Priority ((*iter).rt_info) < - ::Preemption_Priority (rt_info_)) - rt_info_ = (*iter).rt_info; - } - } - } - - // Report to the consumer module that consumer_ has shutdown. - virtual int execute (u_long &command_action) - { - consumer_module_->shutdown_request (this); - command_action = ACE_RT_Task_Command::RELEASE; - return 0; - } - - void *operator new (size_t /* nbytes */) - { return ::new char[sizeof (Shutdown_Consumer)]; } - - void operator delete (void *buf) - { ::delete [] buf; } - - // The module that we report to. - ACE_ES_Consumer_Module *consumer_module_; -}; - -// ************************************************************ - -class Shutdown_Channel : public ACE_ES_Dispatch_Request -{ -public: - Shutdown_Channel (ACE_EventChannel *channel) : - channel_ (channel) {} - - // Report to the consumer module that consumer_ has shutdown. - virtual int execute (u_long &command_action) - { -#if 0 - channel_->destroy_i (); -#endif - command_action = ACE_RT_Task_Command::RELEASE; - return 0; - } - - void *operator new (size_t /* nbytes */) - { return ::new char[sizeof (Shutdown_Channel)]; } - - void operator delete (void *buf) - { ::delete [] buf; } - - ACE_EventChannel *channel_; -}; - -// ************************************************************ - -class ACE_ES_Priority_Timer : public ACE_Event_Handler -// = TITLE -// Event Service Timer -// -// = DESCRIPTION -// Manages a thread per priority, each of which sits on its own -// ReactorEx dispatching the timers for its given priority. -{ -public: - ACE_ES_Priority_Timer (void); - // Default construction. - - int connected (RtecScheduler::handle_t rt_info); - // This allows the Priority Timer to prespawn threads. Returns 0 on - // success, -1 on failure. - - int schedule_timer (RtecScheduler::handle_t rt_info, - const ACE_ES_Timer_ACT *act, - RtecScheduler::OS_Priority preemption_priority, - RtecScheduler::Time delta, - RtecScheduler::Time interval = 0); - // Schedule a timer at the appropriate priority for <preemption_priority>. - // Returns the preemption priority used on success, -1 on failure. - - int cancel_timer (RtecScheduler::OS_Priority preemption_priority, - int id, ACE_ES_Timer_ACT *&act); - // Cancel the timer associated with the priority of - // <preemption_priority> and <id>. <act> is filled in with the - // Timer_ACT used when scheduling the timer. Returns 0 on success, - // -1 on failure. - -private: - virtual int handle_timeout (const ACE_Time_Value &tv, - const void *act); - // Casts <act> to ACE_ES_Timer_ACT and calls execute. -}; - -// ************************************************************ - -class Flush_Queue_ACT : public ACE_ES_Timer_ACT -// = TITLE -// Flush Queue Asynchronous Completion Token -// -// = DESCRIPTION -// Carries a single dispatch request through the ReactorEx. -// Deletes itself when execute is called. -{ -public: - Flush_Queue_ACT (ACE_ES_Dispatch_Request *request, - ACE_ES_Dispatching_Module *dispatching_module) : - request_ (request), - dispatching_module_ (dispatching_module) { } - - virtual void execute (void) - { - ACE_TRY - { - ACE_ES_Dispatch_Request *request = request_; - dispatching_module_->push (request, ACE_TRY_ENV); - ACE_CHECK_ENV; - delete this; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "(%t) Flush_Queue_ACT::execute: " - "Unknown exception..\n")); - } - ACE_ENDTRY; - } - - ACE_ES_Dispatch_Request *request_; - ACE_ES_Dispatching_Module *dispatching_module_; -}; - -// ************************************************************ - -// Since this class is *defined* in the cpp file, the INLINE -// definitions must also be in the cpp file. The should go here -// before any use of these methods. - -ACE_INLINE int -ACE_ES_Priority_Timer::schedule_timer (RtecScheduler::handle_t rt_info, - const ACE_ES_Timer_ACT *act, - RtecScheduler::OS_Priority preemption_priority, - RtecScheduler::Time delta, - RtecScheduler::Time interval) -{ - if (rt_info != 0) - { - // Add the timer to the task's dependency list. - RtecScheduler::handle_t timer_rtinfo = - ACE_Task_Manager::instance()->GetReactorTask (preemption_priority)->rt_info (); - - ACE_TRY - { - ACE_Scheduler_Factory::server()->add_dependency - (rt_info, timer_rtinfo, 1, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_DEBUG ((LM_ERROR, "ACE_ES_Priority_Timer::schedule_timer - " - "add_dependency (%d,%d,%d)\n", - rt_info, timer_rtinfo, 1)); - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "add dependency failed")); - } - ACE_ENDTRY; - } - - // @@ We're losing resolution here. - ACE_Time_Value tv_delta; - tv_delta.usec (int (delta / 10)); - if (tv_delta.usec () == 0) - tv_delta.usec (1); - - ACE_Time_Value tv_interval; - if (interval > 0) - { - tv_interval.usec (int (interval / 10)); - if (tv_interval.usec () == 0) - tv_interval.usec (1); - } - - return ACE_Task_Manager::instance()-> - GetReactorTask (preemption_priority)-> - get_reactor ().schedule_timer (this, - (void *) act, - tv_delta, tv_interval); -} - -ACE_INLINE int -ACE_ES_Priority_Timer::cancel_timer (RtecScheduler::OS_Priority preemption_priority, - int id, ACE_ES_Timer_ACT *&act) -{ - const void *vp; - - int result = ACE_Task_Manager::instance()-> - GetReactorTask (preemption_priority)-> - get_reactor ().cancel_timer (id, &vp); - - if (result == 0) - { - ACE_ERROR ((LM_ERROR, "ACE_ES_Priority_Timer::cancel_timer: " - "Tried to cancel nonexistent timer.\n")); - act = 0; - } - else - act = (ACE_ES_Timer_ACT *) vp; - - return result; -} - -// ************************************************************ - -ACE_ES_Event_Container::ACE_ES_Event_Container (void) : - // ACE_ES_Event (), - ref_count_ (1) -{ -} - -ACE_ES_Event_Container::~ACE_ES_Event_Container (void) -{ -} - -ACE_ES_Event_Container::ACE_ES_Event_Container (const ACE_ES_Event_Container &ec) - : RtecEventComm_Event (ec), - ref_count_ (1) -{ -} - -ACE_ES_Event_Container::ACE_ES_Event_Container (const RtecEventComm_Event &e) - : RtecEventComm_Event (e), - ref_count_ (1) -{ -} - -ACE_ES_Event_Container * -ACE_ES_Event_Container::_duplicate (void) -{ - ref_count_++; - return this; -} - -void -ACE_ES_Event_Container::_release (void) -{ - if (--ref_count_ == 0) - delete this; -} - -int -ACE_ES_Event_Container::operator== (const ACE_ES_Event_Container &event) -{ - RtecEventComm::Event &event1 = (RtecEventComm::Event &) *this; - RtecEventComm::Event &event2 = (RtecEventComm::Event &) event; - return event1 == event2; -} - -void * -ACE_ES_Event_Container::operator new (size_t nbytes) -{ - ACE_ASSERT (nbytes <= sizeof (ACE_ES_Event_Container)); - return ACE_ES_Memory_Pools::new_Event_Container (); -} - -void -ACE_ES_Event_Container::operator delete (void *mem) -{ - ACE_ES_Memory_Pools::delete_Event_Container (mem); -} - -void -ACE_ES_Event_Container::dump (void) -{ - ::dump_event ((RtecEventComm::Event &) *this); -} - -// ************************************************************ - -ACE_Push_Supplier_Proxy::ACE_Push_Supplier_Proxy (ACE_ES_Supplier_Module *sm) - : supplier_module_ (sm), - me_ (this), - push_supplier_ (0) -{ -} - -void -ACE_Push_Supplier_Proxy::connect_push_supplier (RtecEventComm::PushSupplier_ptr push_supplier, - const RtecEventChannelAdmin::SupplierQOS &qos, - CORBA::Environment &_env) -{ - if (this->connected ()) - ACE_THROW (RtecEventChannelAdmin::AlreadyConnected); - - push_supplier_ = - RtecEventComm::PushSupplier::_duplicate(push_supplier); - - // ACE_SupplierQOS_Factory::debug (qos); - - // Copy by value. - qos_ = qos; - - // ACE_SupplierQOS_Factory::debug (qos_); - - // @@ TODO: The SupplierQOS should have a more reasonable interface to - // obtain the supplier_id(), BTW, a callback to push_supplier will - // not work: it usually results in some form of dead-lock. - source_id_ = qos_.publications_[0].event_.source_; - - supplier_module_->connected (this, _env); -} - -void -ACE_Push_Supplier_Proxy::push (const RtecEventComm::EventSet &event, - CORBA::Environment &_env) -{ - ACE_TIMEPROBE (" enter Push_Supplier_Proxy::push"); - if (!this->connected ()) - ACE_THROW (RtecEventComm::Disconnected); - - // @@ TOTAL HACK - ACE_hrtime_t ec_recv = ACE_OS::gethrtime (); - for (CORBA::ULong i = 0; i < event.length (); ++i) - { - ACE_OS::memcpy (&event[i].ec_recv_time_, &ec_recv, - sizeof (RtecEventComm::Time)); - } - supplier_module_->push (this, event, _env); -} - -void -ACE_Push_Supplier_Proxy::disconnect_push_consumer (CORBA::Environment &_env) -{ - ACE_TIMEPROBE_PRINT; - if (this->connected ()) - { - push_supplier_ = 0; - supplier_module_->disconnecting (this, _env); - } -} - -void -ACE_Push_Supplier_Proxy::shutdown (void) -{ - ACE_TRY - { - push_supplier_->disconnect_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "ACE_Push_Supplier_Proxy::shutdown failed.\n")); - } - ACE_ENDTRY; -} - -// ************************************************************ - -ACE_Push_Consumer_Proxy::ACE_Push_Consumer_Proxy (ACE_ES_Consumer_Module *cm) - : me_ (this), - push_consumer_ (0), - consumer_module_ (cm) -{ -} - -ACE_Push_Consumer_Proxy::~ACE_Push_Consumer_Proxy (void) -{ -} - - -void -ACE_Push_Consumer_Proxy::connect_push_consumer (RtecEventComm::PushConsumer_ptr push_consumer, - const RtecEventChannelAdmin::ConsumerQOS &qos, - CORBA::Environment &_env) -{ - if (this->connected ()) - ACE_THROW (RtecEventChannelAdmin::AlreadyConnected); - - push_consumer_ = - RtecEventComm::PushConsumer::_duplicate(push_consumer); - // @@ TODO Find out why are two duplicates needed... - RtecEventComm::PushConsumer::_duplicate(push_consumer); - - // ACE_ConsumerQOS_Factory::debug (qos); - - // Copy by value. - qos_ = qos; - - // ACE_ConsumerQOS_Factory::debug (qos_); - - consumer_module_->connected (this, _env); -} - -void -ACE_Push_Consumer_Proxy::disconnect_push_supplier (CORBA::Environment &_env) -{ - ACE_TIMEPROBE_PRINT; - consumer_module_->disconnecting (this, _env); - push_consumer_ = 0; -} - -void -ACE_Push_Consumer_Proxy::suspend (CORBA::Environment &) -{ - correlation_.suspend (); -} - -void -ACE_Push_Consumer_Proxy::resume (CORBA::Environment &) -{ - correlation_.resume (); -} - -void -ACE_Push_Consumer_Proxy::shutdown (void) -{ - ACE_TRY - { - push_consumer_->disconnect_push_consumer (ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "ACE_Push_Consumer_Proxy::shutdown failed.\n")); - } - ACE_ENDTRY; -} - -// ************************************************************ - -ACE_EventChannel::ACE_EventChannel (u_long type) - : POA_RtecEventChannelAdmin::EventChannel ("EventChannel"), - rtu_manager_ (0), - type_ (type), - state_ (INITIAL_STATE), - me_ (this), - destroyed_ (0) -{ - consumer_module_ = new ACE_ES_Consumer_Module (this); - // RtecEventChannelAdmin::ConsumerAdmin_duplicate(consumer_module_); - -#if defined(ACE_ES_LACKS_ORB) - UPSSingleProcessorOrb_startup(type, - dispatching_module, - rtu_active, - rtu_manager); -#else - ACE_NEW(dispatching_module_, - ACE_ES_Priority_Dispatching(this, THREADS_PER_DISPATCH_QUEUE)); -#endif - - correlation_module_ = new ACE_ES_Correlation_Module (this); - subscription_module_ = new ACE_ES_Subscription_Module (this); - supplier_module_ = new ACE_ES_Supplier_Module (this); - timer_ = new ACE_ES_Priority_Timer; - - consumer_module_->open (dispatching_module_); - dispatching_module_->open (consumer_module_, correlation_module_); - correlation_module_->open (dispatching_module_, subscription_module_); - subscription_module_->open (correlation_module_, supplier_module_); - supplier_module_->open (subscription_module_); -} - -ACE_EventChannel::~ACE_EventChannel (void) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) ACE_EventChannel deleting all modules.\n")); - - ACE_TRY - { - this->destroy (ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_EventChannel::~ACE_EventChannel")); - } - ACE_ENDTRY; - // @@ TODO: Shouldn't we use _release() instead? - delete rtu_manager_; - delete consumer_module_; - delete dispatching_module_; - delete correlation_module_; - delete subscription_module_; - delete supplier_module_; - delete timer_; -} - -void -ACE_EventChannel::destroy (CORBA::Environment &_env) -{ - ACE_UNUSED_ARG (_env); - - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR ((LM_ERROR, "ACE_EventChannel::destroy")); - - if (destroyed_ != 0) - return; - - destroyed_ = 1; - ACE_DEBUG ((LM_DEBUG, "(%t) Event Channel shutting down.\n")); - - // Send a shutdown message through the modules. - supplier_module_->shutdown (); - -#if 0 - // Flush all messages in the channel. - Shutdown_Channel *sc = new Shutdown_Channel (this); - if (sc == 0) - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ TODO: Orbix parameters - // (0, CORBA::COMPLETED_NO, "ACE_EventChannel::destroy")); - - // Create a wrapper around the dispatch request. - Flush_Queue_ACT *act = new Flush_Queue_ACT (sc, dispatching_module_); - if (act == 0) - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ TODO Orbix parameters - // (0, CORBA::COMPLETED_NO, "ACE_EventChannel::destroy")); - - // Set a 100ns timer. - if (this->timer ()->schedule_timer (0, // no rt-info - act, - ACE_Scheduler_MIN_PREEMPTION_PRIORITY, - 100, // 10 usec delta - 0) == -1) // no interval - { - ACE_ERROR ((LM_ERROR, "%p queue_request failed.\n", "ACE_ES_Consumer_Module")); - delete sc; - delete act; - } -#endif -} - -void -ACE_EventChannel::shutdown (void) -{ - // @@ TODO: Find a portable way to shutdown the ORB, on Orbix we have - // to call deactive_impl () on a CORBA::POA is that the portable - // way? - // With TAO we need access to the ORB (to call shutdown() on it). - TAO_ORB_Core_instance ()->orb ()->shutdown (); -} - -void -ACE_EventChannel::report_connect (u_long event) -{ - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR ((LM_ERROR, "ACE_EventChannel::report_connect")); - - ACE_CLR_BITS (state_, event); -} - -void -ACE_EventChannel::report_disconnect (u_long event) -{ - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR ((LM_ERROR, "ACE_EventChannel::report_disconnect")); - - ACE_SET_BITS (state_, event); - if (state_ == SHUTDOWN) - ACE_DEBUG ((LM_DEBUG, "(%t) Event Channel has no consumers or suppliers.\n")); -} - -// ************************************************************ - -ACE_ES_Subscription_Info::~ACE_ES_Subscription_Info (void) -{ - Subscriber_Map_Iterator iter (type_subscribers_); - - // Delete all type collections. - for (Subscriber_Map_Entry *temp = 0; - iter.next (temp) != 0; - iter.advance ()) - { - delete temp->int_id_; - } -} - -/* -void -ACE_ES_Subscription_Info::Type_Subscribers::operator= -(const ACE_ES_Subscription_Info::Type_Subscribers &rhs) -{ - ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (rhs.subscribers_); - - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - { - if (subscribers_.insert (consumer) != 0) - ACE_ERROR ((LM_ERROR, "%p insert failed.\n", - "ACE_ES_Subscription_Info::Type_Subscribers::operator=")); - } - - // Pointer copy. - dependency_info_ = rhs.dependency_info_; -} -*/ - -// Remove <consumer> from the consumer set in <type_map> set -// corresponding to <type>. -int -ACE_ES_Subscription_Info::remove (Subscriber_Map &type_map, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type) -{ - Type_Subscribers *subscribers; - - // Find the type set within the type collection. - if (type_map.find (type, subscribers) == -1) - // type_map does not contain the type. - return -1; - - // Remove the consumer from the type set. - if (subscribers->consumers_.remove (consumer) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p remove failed.\n", - "ACE_ES_Subscriber_Info::remove"), -1); - // @@ Should probably remove the supplier from the consumers caller - // list. - - // If the set is empty, remove it from the type collection. - if (subscribers->consumers_.size () == 0) - { - Type_Subscribers *removed_subscribers; - if (type_map.unbind (type, removed_subscribers) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p unbind failed.\n", - "ACE_ES_Subscriber_Info::remove"), -1); - - // Sanity check. - if (removed_subscribers != subscribers) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscriber_Info::remove: " - "removed wrong set!\n"), -1); - - // Free up the set removed. - delete removed_subscribers; - } - - return 0; -} - - -int -ACE_ES_Subscription_Info::remove (SourceID_Map &source_subscribers, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID sid) -{ - Subscriber_Set *subscribers; - - // Find the subscribers of <sid>. - if (source_subscribers.find (sid, subscribers) == -1) - // does not contain the <sid>. - return -1; - - // Remove the consumer from the subscriber set. - if (subscribers->remove (consumer) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p remove failed.\n", - "ACE_ES_Subscriber_Info::remove"), -1); - // @@ Should probably remove the supplier from the consumers caller - // list. - - // If the set is empty, remove it from the type collection. - if (subscribers->size () == 0) - { - Subscriber_Set *removed_subscribers; - if (source_subscribers.unbind (sid, removed_subscribers) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p unbind failed.\n", - "ACE_ES_Subscriber_Info::remove"), -1); - - // Sanity check. - if (removed_subscribers != subscribers) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscriber_Info::remove: " - "removed wrong set!\n"), -1); - - // Free up the set removed. - delete removed_subscribers; - } - - return 0; -} - - -void -ACE_ES_Subscription_Info::append_subscribers (Subscriber_Set &dest, - Subscriber_Set &src) -{ - Subscriber_Set_Iterator src_iter (src); - - // Iterate through the source set. Add each source proxy to the - // destination set. - for (ACE_ES_Consumer_Rep **proxy = 0; - src_iter.next (proxy) != 0; - src_iter.advance ()) - { - if (dest.insert (*proxy) == -1) - ACE_ERROR ((LM_ERROR, "%p: insert failed.\n", "append_subscribers")); - } -} - -int -ACE_ES_Subscription_Info::insert_or_allocate (SourceID_Map &sid_map, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID sid) -{ - Subscriber_Set *subscribers; - - if (sid_map.find (sid, subscribers) == -1) - { - // If the correct type set does not exist, make one with a null - // dependency info (since there is no supplier of this event). - subscribers = new Subscriber_Set; - - if (sid_map.bind (sid, subscribers) == -1) - { - ACE_ERROR ((LM_ERROR, "%p bind failed.\n", - "ACE_ES_Subscription_Info::insert_or_allocate")); - delete subscribers; - return -1; - } - } - - // 0 and 1 are success for insert. - return subscribers->insert (consumer) == -1 ? -1 : 0; -} - -int -ACE_ES_Subscription_Info::insert_or_allocate (Subscriber_Map &type_map, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type) -{ - Type_Subscribers *subscribers; - - if (type_map.find (type, subscribers) == -1) - { - // If the correct type set does not exist, make one with a null - // dependency info (since there is no supplier of this event). - subscribers = new Type_Subscribers (0); - - if (type_map.bind (type, subscribers) == -1) - { - ACE_ERROR ((LM_ERROR, "%p bind failed.\n", - "ACE_ES_Subscription_Info::insert_or_allocate")); - delete subscribers; - return -1; - } - } - - return subscribers->consumers_.insert (consumer); -} - -int -ACE_ES_Subscription_Info::insert_or_fail (Subscriber_Map &type_map, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type, - RtecScheduler::Dependency_Info *&dependency) -{ - Type_Subscribers *subscribers; - - // Get the subscriber set for <type>. - if (type_map.find (type, subscribers) == -1) - return -1; - - // Pass back the description of the method generating <type>. - dependency = subscribers->dependency_info_; - - // Insert the new consumer into the subscriber set. - return subscribers->consumers_.insert (consumer); -} - -// ************************************************************ - -typedef ACE_EventChannel::SYNCHRONIZATION_ERROR SYNC_ERROR; -typedef ACE_EventChannel::QOS_ERROR QOS_ERROR; -typedef ACE_EventChannel::SUBSCRIPTION_ERROR SUBSCRIPTION_ERROR; -typedef ACE_EventChannel::CORRELATION_ERROR CORRELATION_ERROR; - -// ************************************************************ - -ACE_ES_Consumer_Module::ACE_ES_Consumer_Module (ACE_EventChannel* channel) - : lock_ (), - all_consumers_ (), - channel_ (channel), - me_ (this), - down_ (0) -{ -} - -void -ACE_ES_Consumer_Module::open (ACE_ES_Dispatching_Module *down) -{ - down_ = down; -} - -void -ACE_ES_Consumer_Module::connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - channel_->report_connect (ACE_EventChannel::CONSUMER); - down_->connected (consumer, _env); -} - -void -ACE_ES_Consumer_Module::shutdown_request (ACE_ES_Dispatch_Request *request) -{ - Shutdown_Consumer *sc = (Shutdown_Consumer *) request; - - // Tell everyone else that the consumer is disconnected. This means - // that *nothing* is left in the system for the consumer, so - // everyone can free up any resources. - down_->disconnected (sc->consumer ()); - - ACE_DEBUG ((LM_DEBUG, "Deleting proxy for consumer\n")); - - // Delete the consumer proxy. - delete sc->consumer (); - - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - return; - - // Tell the channel that we may need to shut down. - if (all_consumers_.size () <= 0) - { - ACE_DEBUG ((LM_DEBUG, "(%t) No more consumers connected.\n")); - channel_->report_disconnect (ACE_EventChannel::CONSUMER); - } -} - -void -ACE_ES_Consumer_Module::shutdown (void) -{ - Consumers copy; - - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - goto DONE; - - if (all_consumers_.size () == 0) - goto DONE; - - // Make a copy so that the consumers can disconnect without the - // lock being held. - copy = all_consumers_; - } - - // This scope is just to thwart the compiler. It was complaining - // about the above goto's bypassing variable initializations. Yadda - // yadda. - { - Consumer_Iterator iter (copy); - - CORBA::Environment env; - - for (ACE_Push_Consumer_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - (*proxy)->shutdown (); - CORBA::release (*proxy); - // Shouldn't this be _release () - - // Remove the consumer from our list. - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR ((LM_ERROR, "%p Failed to acquire lock.\n", "ACE_ES_Consumer_Module::shutdown")); - - if (all_consumers_.remove (*proxy) == -1) - ACE_ERROR ((LM_ERROR, "%p Failed to remove consumer.\n", "ACE_ES_Consumer_Module::shutdown")); - } - } - } - -DONE: - channel_->shutdown (); -} - -void -ACE_ES_Consumer_Module::disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_THROW (SYNC_ERROR); - // @@ TODO Orbix parameters - // (0, CORBA::COMPLETED_NO, "ACE_ES_Consumer_Module::disconnected")); - - if (all_consumers_.remove (consumer) == -1) - return; - } - - // Tell everyone else that the consumer is disconnecting. This - // allows them to remove the consumer from any subscription lists - // etc. However, messages may still be queued in the ReactorEx or - // in the Dispatching Module for this consumer, so no queues or - // proxies can be deleted just yet. - down_->disconnecting (consumer, _env); - - // Send a shutdown message through the system. When this is - // dispatched, the consumer proxy will be deleted. <request> is - // queued in the Priority_Timer at <priority> level. It will be - // scheduled for dispatching in 1 nanosecond. This gives components - // a hook into the first queueing point in the channel. - - // Create a shutdown message. When this is dispatched, it will - // delete the proxy. - Shutdown_Consumer *sc = new Shutdown_Consumer (this, consumer); - if (sc == 0) - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Consumer_Module::disconnected")); - - // Create a wrapper around the dispatch request. - Flush_Queue_ACT *act = new Flush_Queue_ACT (sc, channel_->dispatching_module_); - if (act == 0) - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Consumer_Module::disconnecting")); - - ACE_DEBUG ((LM_DEBUG, "(%t) initiating consumer disconnect.\n")); - - // Set a 100ns timer. - if (channel_->timer ()->schedule_timer (0, // no rt_info - act, - // ::Preemption_Priority (consumer->qos ().rt_info_), - ACE_Scheduler_MIN_PREEMPTION_PRIORITY, - 100, 0) == -1) - { - ACE_ERROR ((LM_ERROR, "%p queue_request failed.\n", "ACE_ES_Consumer_Module")); - delete sc; - delete act; - } -} - -// This method executes in the same thread of control that will hand -// the event set to the consumer (or it's proxy). A network proxy may -// copy the event set to the network buffer. An active client may -// copy the event set to be queued. Or a same address-space consumer -// can read the set we allocated off the stack. -void -ACE_ES_Consumer_Module::push (const ACE_ES_Dispatch_Request *request, - CORBA::Environment &_env) -{ - ACE_TIMEPROBE (" enter ES_Consumer_Module::push"); - // We'll create a temporary event set with the size of the incoming - // request. - RtecEventComm::EventSet event_set (request->number_of_events ()); - request->make_copy (event_set); - - // Forward the event set. - // @@ TOTAL HACK - ACE_hrtime_t ec_send = ACE_OS::gethrtime (); - for (CORBA::ULong i = 0; i < event_set.length (); ++i) - { - ACE_OS::memcpy (&event_set[i].ec_send_time_, &ec_send, - sizeof (RtecEventComm::Time)); - } - request->consumer ()->push (event_set, _env); - ACE_TIMEPROBE (" leave ES_Consumer_Module::push"); -} - -RtecEventChannelAdmin::ProxyPushSupplier_ptr -ACE_ES_Consumer_Module::obtain_push_supplier (CORBA::Environment &_env) -{ - ACE_Push_Consumer_Proxy *new_consumer = new ACE_Push_Consumer_Proxy (this); - - // Get a new supplier proxy object. - if (new_consumer == 0) - { - ACE_ERROR ((LM_ERROR, "ACE_EventChannel" - "::obtain_push_supplier failed.\n")); - ACE_THROW_RETURN (CORBA::NO_MEMORY (CORBA::COMPLETED_NO), 0); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Consumer_Module::obtain_push_supplier")); - } - - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - { - delete new_consumer; - ACE_THROW_RETURN (SYNC_ERROR, 0); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, - // "ACE_ES_Consumer_Module::obtain_push_supplier"), 0); - } - - if (all_consumers_.insert (new_consumer) == -1) - ACE_ERROR ((LM_ERROR, "ACE_ES_Consumer_Module insert failed.\n")); - } - - // Return the CORBA object reference to the new supplier proxy. - return new_consumer->get_ref (); -} - -// ************************************************************ - -ACE_ES_Correlation_Module::ACE_ES_Correlation_Module (ACE_EventChannel *channel) - : channel_ (channel), - up_ (0), - subscription_module_ (0) -{ -} - -void -ACE_ES_Correlation_Module::open (ACE_ES_Dispatching_Module *up, - ACE_ES_Subscription_Module *sm) -{ - up_ = up; - subscription_module_ = sm; -} - -void -ACE_ES_Correlation_Module::connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &_env) -{ - // Initialize the consumer correlation filter. - if (consumer->correlation ().connected (consumer, this) == -1) - ACE_THROW (CORRELATION_ERROR); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Correlation_Module::connected")); -} - -void -ACE_ES_Correlation_Module::disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &) -{ - if (consumer->correlation ().disconnecting () == -1) - ACE_ERROR ((LM_ERROR, "ACE_ES_Correlation_Module::disconnecting failed.\n")); -} - -int -ACE_ES_Correlation_Module::subscribe (ACE_ES_Consumer_Rep *consumer) -{ - return subscription_module_->subscribe (consumer); -} - -/* -int -ACE_ES_Correlation_Module::unsubscribe (ACE_ES_Consumer_Rep *cr) -{ - return subscription_module_->unsubscribe (cr); -} -*/ - -void -ACE_ES_Correlation_Module::push (ACE_ES_Consumer_Rep *consumer, - ACE_ES_Event_Container *event, - CORBA::Environment &_env) -{ - ACE_TIMEPROBE (" enter ACE_ES_Correlation_Module::push"); - ACE_ES_Dispatch_Request *request = - consumer->correlation ()->push (consumer, event); - ACE_TIMEPROBE (" pushed to Correlation_Module"); - - // If request == 0, then the event was queued for later. Otherwise, - // we need to push the event now. - if (request != 0) - up_->push (request, _env); - - ACE_TIMEPROBE (" push_source_type: Dispatch Module enqueuing"); -} - -// Must check consumer->qos ().use_timeout () before calling this. -// This method is supposed properly schedule a timer with respect to -// the consumer's priority AND the correlation that should receive the -// timeout event. -int -ACE_ES_Correlation_Module::schedule_timeout (ACE_ES_Consumer_Rep_Timeout *consumer) -{ - RtecEventComm::Time &interval = consumer->dependency ()->event_.creation_time_; - RtecEventComm::Time &delay = consumer->dependency ()->event_.creation_time_; - - // Store the preemption priority so we can cancel the correct timer. - // The priority values may change during the process lifetime (e.g., - // after the scheduler has been run). - consumer->preemption_priority (::IntervalToPriority (interval)); - - // Register the timer. - int id = channel_->timer ()->schedule_timer (consumer->dependency ()->rt_info, - consumer, - consumer->preemption_priority (), - delay, interval); - - // Store the timer id for canceling. - consumer->timer_id (id); - - if (id == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p schedule timer failed.\n", - "ACE_ES_Correlation_Module::schedule_timeout"), -1); - - return 0; -} - -// Must check consumer->qos ().timeout_ before calling this. -int -ACE_ES_Correlation_Module::cancel_timeout (ACE_ES_Consumer_Rep_Timeout *consumer) -{ - // Cancel the timer from the Priority Timer. - ACE_ES_Timer_ACT *act; - channel_->timer ()->cancel_timer (consumer->preemption_priority (), - consumer->timer_id (), - act); - - ACE_ASSERT (consumer == act); - - // Free up the Timer ACT. - // delete act; - - return 0; -} - - -int -ACE_ES_Correlation_Module::reschedule_timeout (ACE_ES_Consumer_Rep_Timeout *consumer) -{ - if (this->cancel_timeout (consumer) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Disjunction_Group::reschedule_deadline"), -1); - else - { - RtecEventComm::Time &interval = consumer->dependency ()->event_.creation_time_; - RtecEventComm::Time &delay = consumer->dependency ()->event_.creation_time_; - - // Store the preemption priority so we can cancel the correct timer. - // The priority values may change during the process lifetime (e.g., - // after the scheduler has been run). - consumer->preemption_priority (::IntervalToPriority (interval)); - - // Register the timer. - int id = channel_->timer ()->schedule_timer (0, // Do not pass an RT_Info. - consumer, - consumer->preemption_priority (), - delay, interval); - - // Store the timer id for canceling. - consumer->timer_id (id); - - if (id == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p schedule timer failed.\n", - "ACE_ES_Correlation_Module::reschedule_timeout"), -1); - - return 0; - } -} - -void -ACE_ES_Correlation_Module::shutdown (void) -{ - // Perhaps this should call disconnecting on all the consumers? - // We'll opt to just forward this message for now. - up_->shutdown (); -} - -// ************************************************************ - -ACE_ES_Consumer_Correlation::ACE_ES_Consumer_Correlation (void) : - correlation_module_ (0), - type_id_index_ (0), - channel_ (0), - qos_ (), - pending_events_ (0), - lock_ (), - consumer_ (0), - pending_flags_ (0), - consumer_reps_ (0), - n_consumer_reps_ (0), - timer_reps_ (0), - n_timer_reps_ (0), - conjunction_groups_ (0), - n_conjunction_groups_ (0), - disjunction_groups_ (0), - n_disjunction_groups_ (0), - connected_ (0) -{ -} - -ACE_ES_Consumer_Correlation::~ACE_ES_Consumer_Correlation (void) -{ - delete [] timer_reps_; - for (int cr = 0; cr < n_consumer_reps_; cr++) - consumer_reps_[cr]->_release (); - delete [] consumer_reps_; - delete [] conjunction_groups_; - delete [] disjunction_groups_; - delete [] pending_events_; -} - -void -ACE_ES_Consumer_Correlation::disconnect_push_supplier (CORBA::Environment &) -{ - connected_ = 0; -} - -int -ACE_ES_Consumer_Correlation::allocate_correlation_resources (ACE_ES_Dependency_Iterator &iter) -{ - n_conjunction_groups_ = iter.n_conjunctions (); - if (n_conjunction_groups_ > 0) - { - conjunction_groups_ = new ACE_ES_Conjunction_Group[n_conjunction_groups_]; - if (conjunction_groups_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Correlation::connected"), -1); - for (int n=0; n < n_conjunction_groups_; n++) - conjunction_groups_[n].set_correlation_module (correlation_module_); - } - - n_disjunction_groups_ = iter.n_disjunctions (); - if (n_disjunction_groups_ > 0) - { - disjunction_groups_ = new ACE_ES_Disjunction_Group[n_disjunction_groups_]; - if (disjunction_groups_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Correlation::connected"), -1); - for (int n=0; n < n_disjunction_groups_; n++) - disjunction_groups_[n].set_correlation_module (correlation_module_); - } - - n_consumer_reps_ = iter.n_events (); - if (n_consumer_reps_ > 0) - { - // This allocates more than is needed if there are repeats: - // (A+B)|(B+C). We allocate these individually so that they can - // be deleted individually. - - typedef ACE_ES_Consumer_Rep *reparray; - consumer_reps_ = new reparray[n_consumer_reps_]; - - for (int cr = 0; cr < n_consumer_reps_; cr++) - { - consumer_reps_[cr] = new ACE_ES_Consumer_Rep; - if (consumer_reps_[cr] == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Correlation::connected"), -1); - } - } - - n_timer_reps_ = iter.n_timeouts (); - if (n_timer_reps_ > 0) - { - timer_reps_ = new ACE_ES_Consumer_Rep_Timeout[n_timer_reps_]; - if (timer_reps_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Correlation::connected"), -1); - } - - // This allocates more than is needed. - pending_events_ = new Event_Set[n_consumer_reps_ + n_timer_reps_]; - if (pending_events_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Correlation::connected"), -1); - - return 0; -} - -// We don't need synchronization until after we've been connected and -// subscribed to events. -int -ACE_ES_Consumer_Correlation::connected (ACE_Push_Consumer_Proxy *consumer, - ACE_ES_Correlation_Module *correlation_module) -{ - correlation_module_ = correlation_module; - consumer_ = consumer; - - // for (CORBA_Types::ULong index=0; index < consumer->qos ().dependencies_.length (); index++) - // consumer->qos ().dependencies_[index].event_.dump (); - - ACE_ES_Dependency_Iterator iter (consumer->qos ().dependencies); - iter.parse (); - if (this->allocate_correlation_resources (iter) == -1) - return -1; - - - int cgroup_index = -1; - int dgroup_index = -1; - int crep_index = 0; - int trep_index = 0; - RtecEventComm::EventType group_type = 0; - - while (iter.advance_dependency () == 0) - { - // Keep track of how many conjunction and disjunction groups are - // registered. Update the index pointers so that the helper - // functions can update the appropriate group objects. - switch ((*iter).event_.type_) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - cgroup_index++; - ACE_ASSERT (cgroup_index < n_conjunction_groups_); - group_type = ACE_ES_CONJUNCTION_DESIGNATOR; - continue; - - case ACE_ES_DISJUNCTION_DESIGNATOR: - dgroup_index++; - ACE_ASSERT (dgroup_index < n_disjunction_groups_); - group_type = ACE_ES_DISJUNCTION_DESIGNATOR; - continue; - - case ACE_ES_GLOBAL_DESIGNATOR: - group_type = ACE_ES_GLOBAL_DESIGNATOR; - continue; - - // These Delegate to the appropriate registration method. -#if 0 - // @@ TODO rt_info_ is a handle_t now, does checking against - // 0 still make sense? - // Check for a null rt_info. - if ((*iter).rt_info_ == 0) - { - ACE_ERROR ((LM_ERROR, "Found a ConsumerQOS::dependencies[].rt_info_ == 0.\n")); - continue; - } -#endif /* 0 */ - - case ACE_ES_EVENT_TIMEOUT: - // For backwards compatibility. - case ACE_ES_EVENT_DEADLINE_TIMEOUT: - if (this->register_deadline_timeout (*iter, - group_type, - cgroup_index, - dgroup_index, - trep_index) == -1) - return -1; - break; - - case ACE_ES_EVENT_INTERVAL_TIMEOUT: - if (this->register_interval_timeout (*iter, - group_type, - cgroup_index, - dgroup_index, - trep_index) == -1) - return -1; - break; - - case ACE_ES_EVENT_ACT: - // Store the ACT in the current conjunction or disjunction - // group. - switch (group_type) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - conjunction_groups_[cgroup_index].set_act ((*iter).event_); - break; - case ACE_ES_DISJUNCTION_DESIGNATOR: - disjunction_groups_[cgroup_index].set_act ((*iter).event_); - break; - case ACE_ES_GLOBAL_DESIGNATOR: - default: - ACE_ERROR ((LM_ERROR, "Warning: ACTs not implemented for Global.\n")); - } - break; - - default: - // Non-timer event subscription. - if (this->register_event (*iter, - group_type, - cgroup_index, - dgroup_index, - crep_index) == -1) - return -1; - break; - } - } - - // We may not use all of the consumer reps if there are repeats: - // (A+B)|(B+C). Must update n_consumer_reps_ so we don't try to - // unsubscribe a blank rep during disconnect. - if (crep_index < n_consumer_reps_) - n_consumer_reps_ = crep_index; - - return 0; -} - -int -ACE_ES_Consumer_Correlation::register_deadline_timeout (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int dgindex, - int &trep_index) -{ - // new_timeout will be returned as an ACT. When executed, it will - // forward *iter.event_ to the consumer. - ACE_ES_Consumer_Rep_Timeout *new_timeout = &timer_reps_[trep_index++]; - new_timeout->init (this, dependency); - new_timeout->correlation_type (ACE_ES_Consumer_Rep::DEADLINE_TIMEOUT); - // Deadline timers do not need type ids. - - switch (group_type) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - // Reps keep pointers back to the groups that they're deadlines for. - new_timeout->add_disjunction_group (conjunction_groups_[cgindex]); - // Groups keep references to the deadline timers for rescheduling. - if (conjunction_groups_[cgindex].set_deadline_timeout (new_timeout) == -1) - return -1; - break; - - case ACE_ES_DISJUNCTION_DESIGNATOR: - new_timeout->add_disjunction_group (disjunction_groups_[dgindex]); - if (disjunction_groups_[dgindex].set_deadline_timeout (new_timeout) == -1) - return -1; - break; - - case ACE_ES_GLOBAL_DESIGNATOR: - ACE_ERROR_RETURN ((LM_ERROR, "No global deadline timeouts, yet!\n"), -1); - } - - return 0; -} - -int -ACE_ES_Consumer_Correlation::register_interval_timeout (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int /* dgindex */, - int &trep_index) -{ - // new_timeout will be returned as an ACT. When executed, it will - // forward *iter.event_ to the consumer. - ACE_ES_Consumer_Rep_Timeout *new_timeout = &timer_reps_[trep_index++]; - new_timeout->init (this, dependency); - new_timeout->type_id (this->new_type_id ()); - - switch (group_type) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - // If it's a conjunction, then we need to perform correlations - // on the timeout. - new_timeout->correlation_type (ACE_ES_Consumer_Rep::CORRELATE); - conjunction_groups_[cgindex].add_type (new_timeout->type_id ()); - break; - - case ACE_ES_DISJUNCTION_DESIGNATOR: - case ACE_ES_GLOBAL_DESIGNATOR: - new_timeout->correlation_type (ACE_ES_Consumer_Rep::NO_CORRELATION); - break; - } - - // Schedule the timeout. - if (correlation_module_->schedule_timeout (new_timeout) == -1) - return -1; - else - return 0; -} - -// Search <creps> for a rep matching <dependency>. If one is not -// found, allocate one. All returned reps should have the appropriate -// type_id set. -ACE_ES_Consumer_Rep * -ACE_ES_Consumer_Correlation::get_consumer_rep (RtecEventChannelAdmin::Dependency &dependency, - int &crep_index) -{ - ACE_ES_Consumer_Rep *rep = 0; - - // Step through all existing consumer reps. - for (int x=0; x < crep_index; x++) - { - // If <dependency> matches any previously subscribed consumer - // reps, we'll reuse it. - if (consumer_reps_[x]->dependency ()->event_.type_ == dependency.event_.type_ -#if defined(ACE_ES_LACKS_ORB) - && consumer_reps_[x]->dependency ()->event_.source_ == - dependency.event_.source_ -#endif /* ACE_ES_LACKS_ORB */ -) - { - rep = consumer_reps_[x]; - break; - } - } - - // Check if we didn't find it. - if (rep == 0) - { - if (crep_index >= n_consumer_reps_) - ACE_ERROR_RETURN ((LM_ERROR, "Too many event registrations.\n"), 0); - // Allocate a new rep and set its type id. - rep = consumer_reps_[crep_index]; - crep_index++; - rep->init (this, dependency); - rep->type_id (this->new_type_id ()); - } - - return rep; -} - -int -ACE_ES_Consumer_Correlation::new_type_id (void) -{ - int type_id = type_id_index_; - if (++type_id_index_ >= ACE_ES_MAX_SUBSCRIPTIONS) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_MAX_SUBSCRIPTIONS exceeded.\n"),0); - else - return type_id; -} - -int -ACE_ES_Consumer_Correlation::register_event (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int dgindex, - int &crep_index) -{ - // These are stored in the subscription module data structures. - ACE_ES_Consumer_Rep *consumer_rep = this->get_consumer_rep (dependency, crep_index); - - if (consumer_rep == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Consumer_Correlation::register_event"), -1); - - switch (group_type) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - // If it's a conjunction, then we need to perform correlations - // on the object. Otherwise, NO_CORRELATION is set by default. - consumer_rep->correlation_type (ACE_ES_Consumer_Rep::CORRELATE); - conjunction_groups_[cgindex].add_type (consumer_rep->type_id ()); - break; - - case ACE_ES_DISJUNCTION_DESIGNATOR: - consumer_rep->add_disjunction_group (disjunction_groups_[dgindex]); - break; - - case ACE_ES_GLOBAL_DESIGNATOR: - ACE_ERROR ((LM_ERROR, "ACE_ES_Consumer_Correlation::register_event: " - "ACE_ES_GLOBAL_DESIGNATOR not implemented.\n")); - break; - } - - // Subscribe the consumer_rep to the suppliers. - if (correlation_module_->subscribe (consumer_rep) == -1) - return -1; - else - return 0; -} - -int -ACE_ES_Consumer_Correlation::disconnecting (void) -{ - // If we were forwarding events, disconnect as a supplier. - if (connected_) - { - CORBA::Environment env; - channel_->disconnect_push_consumer (env); - if (env.exception () != 0) - ACE_ERROR ((LM_ERROR, "ACE_ES_Consumer_Correlation::disconnecting failed.\n")); - } - - for (int x=0; x < n_timer_reps_; x++) - correlation_module_->cancel_timeout (&timer_reps_[x]); - - for (int y=0; y < n_consumer_reps_; y++) - if (consumer_reps_[y] != 0) - consumer_reps_[y]->disconnect (); - - return 0; -} - -ACE_ES_Dispatch_Request * -ACE_ES_Consumer_Correlation::push (ACE_ES_Consumer_Rep *cr, - ACE_ES_Event_Container *event) -{ - ACE_TIMEPROBE (" ACE_ES_Consumer_Correlation::push, enter"); - - // Check if this event needs any correlating, or if it should just - // be forwarded real fast-like. - switch (cr->correlation_type ()) - { - case ACE_ES_Consumer_Rep::NO_CORRELATION: - { - // Calls reschedule on all disjunction groups it belongs to. - cr->reschedule_deadlines (); - - ACE_TIMEPROBE (" Consumer_Correlation::push, determine NO CORR."); - ACE_ES_Dispatch_Request *request = - new ACE_ES_Dispatch_Request (consumer_, event, cr->dependency ()->rt_info); - ACE_TIMEPROBE (" Consumer_Correlation::push, NO_CORR: alloc"); - - if (request == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Consumer_Correlation::push"), 0); - - return request; - } - - case ACE_ES_Consumer_Rep::CORRELATE: - return this->correlate (cr, event); - - case ACE_ES_Consumer_Rep::DEADLINE_TIMEOUT: - { - ACE_ES_Dispatch_Request *request = - new ACE_ES_Dispatch_Request (consumer_, cr->dependency ()->rt_info); - - if (request == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Consumer_Correlation::push"), 0); - - // Add the deadline timeout to the outbox. - request->event_set () += event; - - // Add any pending events to the outbox. - cr->top_group ()->add_events (&(request->event_set ()), - pending_events_, pending_flags_); - - return request; - } - - default: - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Consumer_Correlation::push:" - " unknown correlation type\n"), 0); - } -} - -// @@ If we're just event forwarding, then no pending_events_ need to -// be kept! I'll add this optimization later. -ACE_ES_Dispatch_Request * -ACE_ES_Consumer_Correlation::correlate (ACE_ES_Consumer_Rep *cr, - ACE_ES_Event_Container *event) -{ - // If the consumer has specified correlation criteria, then we must - // first acquire the mutex. - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Consumer_Correlation::push"), 0); - - // Add the new event to the pending events. - pending_events_[cr->type_id ()] += event; - - // Set the bit corresponding to the arrived event. - // This should be pending_flags_->event_arrived (index); - ACE_SET_BITS (pending_flags_, ACE_INT2BIT[cr->type_id ()]); - - ACE_ES_Dispatch_Request *request = 0; - Event_Set *outbox = 0; - // Since add_events changes pending_flags_, we need to keep this - // for all iterations through the conjunction groups. - u_long freeze_pending_flags = pending_flags_; - - for (int x=0; x < n_conjunction_groups_; x++) - { - if (conjunction_groups_[x].should_forward (freeze_pending_flags)) - { - // If there is a deadline timer for this conjunction group, - // this will reschedule them. - conjunction_groups_[x].reschedule_deadline (); - - // First time in, allocate the new dispatch request. - if (request == 0) - { - request = - new ACE_ES_Dispatch_Request (consumer_, - cr->dependency ()->rt_info); - if (request == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Consumer_Correlation::correlate"), 0); - outbox = &(request->event_set ()); - } - - // Add each of the pending events for this correlation to - // the outgoing dispatch request. If outbox == 0, then - // this will just clear any pending events. - conjunction_groups_[x].add_events (outbox, - pending_events_, - pending_flags_); - } - } - - return request; -} - - -// ************************************************************ - -ACE_ES_Consumer_Rep::~ACE_ES_Consumer_Rep (void) -{ -} - -void -ACE_ES_Consumer_Rep::execute (void) -{ - ACE_ERROR ((LM_ERROR, "Warning! ACE_ES_Consumer_Rep::execute called.\n")); -} - -// ************************************************************ - -void -ACE_ES_Consumer_Rep_Timeout::execute (void) -{ - ACE_TIMEPROBE (" Consumer_Rep_Timeout::execute"); - if (this->receiving_events ()) - { - CORBA::Environment __env; - ACE_Time_Value tv = ACE_OS::gettimeofday (); - timeout_event_->creation_time_ = tv.sec () * 10000000 + tv.usec () * 10; - correlation_->correlation_module_->push (this, timeout_event_, __env); - if (__env.exception () != 0) - ACE_ERROR ((LM_ERROR, "ACE_ES_Consumer_Rep_Timeout::execute: unexpected exception.\n")); - } -} - -// ************************************************************ - -ACE_ES_Subscription_Module::ACE_ES_Subscription_Module (ACE_EventChannel *channel) - : channel_ (channel), - up_ (0), - down_ (0) -{ -} - -void -ACE_ES_Subscription_Module::open (ACE_ES_Correlation_Module *up, - ACE_ES_Supplier_Module *down) -{ - // Brilliant. - up_ = up; - down_ = down; -} - -ACE_ES_Subscription_Module::~ACE_ES_Subscription_Module (void) -{ -} - -// When a supplier connects, we step through each of its -// publications. For each event type published, we allocate a set in -// the suppliers type collection. Then we build a subscribers list -// starting with any consumers having a type-based subscription in the -// global type collection. -void -ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &_env) -{ - RtecEventComm::EventSourceID sid = 0; - // We will record the source_id for later usage. - { - ACE_ES_WGUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_THROW (SYNC_ERROR); - // @@ TODO: Orbix parameters - // (0, CORBA::COMPLETED_NO, "ACE_ES_Subscription_Module::connected")); - - if (all_suppliers_.insert (supplier) == -1) - ACE_ERROR ((LM_ERROR, "ACE_ES_Subscription_Module insert failed.\n")); - - // For every type that this supplier generates, bind a new - // Type_Subscribers to the type in the supplier proxy's type - // collection. - RtecEventChannelAdmin::PublicationSet &publications = supplier->qos ().publications_; - - sid = publications[0].event_.source_; - for (CORBA::ULong index=0; index < publications.length (); index++) - { - // Check to make sure an RT_Info was specified. -#if 0 - // @@ TODO: We should check if rt_info is a valid handle_t. - if (publications[index].dependency_info_.rt_info.value() == 0) - { - ACE_ERROR ((LM_ERROR, "Found a SupplierQOS::dependency_info_.rt_info_ == 0\n")); - continue; - } -#endif - - RtecEventComm::EventType &event_type = publications[index].event_.type_; - - // Check to make sure a type was specified. - if (event_type == ACE_ES_EVENT_ANY) - { - ACE_ERROR ((LM_ERROR, "ACE_ES_Subscription_Module::connected: " - "source is publishing ACE_ES_EVENT_ANY.\n")); - continue; - } - - // Make a new set for the proxy. Include the dependency - // info describing the RT_Method that generates this event. - // This object will hold all the consumers that subscribe to - // this publication. - ACE_ES_Subscription_Info::Type_Subscribers *new_subscribers = - new ACE_ES_Subscription_Info::Type_Subscribers (&(publications[index].dependency_info_)); - - if (new_subscribers == 0) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Subscription_Module::connected")); - return; - } - - // Check the global type collection for consumers that register - // before suppliers. - ACE_ES_Subscription_Info::Type_Subscribers *existing_subscribers; - if (type_subscribers_.find (event_type, existing_subscribers) == 0) - { - // Iterate through existing subscribers. - ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (existing_subscribers->consumers_); - - for (ACE_ES_Consumer_Rep **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - // Each existing subscriber will get appended to the - // new subscribers list. Dependencies are updated. - - // @@ TODO: Handle exceptions. - ACE_Scheduler_Factory::server()->add_dependency - ((*proxy)->dependency()->rt_info, - new_subscribers->dependency_info_->rt_info, - new_subscribers->dependency_info_->number_of_calls, - _env); - ACE_DEBUG ((LM_DEBUG, "%s - add_dependency (%d,%d,%d)\n", - "ACE_ES_Priority_Timer::schedule_timer", - (*proxy)->dependency()->rt_info, - new_subscribers->dependency_info_->rt_info, - new_subscribers->dependency_info_->number_of_calls)); - if (_env.exception () != 0) - return; - // @@ TODO use the ACE_TRY macros. - - if (new_subscribers->consumers_.insert (*proxy) == -1) - { - ACE_ERROR ((LM_ERROR, - "%p: add_dependency/insert failed.\n", - "ACE_ES_Subscription_Module::connected")); - continue; - } - } - } - - // Put the new subscribers for this event type in the supplier - // proxy's type map. - if (supplier->subscription_info ().type_subscribers_. - bind (event_type, new_subscribers) != 0) - { - // This may occur with a double bind, I think. - ACE_ERROR ((LM_ERROR, "%p can't initialize type.\n", - "ACE_ES_Subscription_Module::connected")); - delete new_subscribers; - continue; - } - } - } // release lock - - // Reregister any consumers that tried to subscribe before this - // supplier connected. - // NOTE: We used to call back the supplier here (using - // supplier->source_id()), this is ineffective and leads to all kind - // of dead-locks (the supplier is blocked and waiting for us). - // We use the information on the publications to get the source_id. - this->reregister_consumers (sid); -} - -// Step through each of the source_subscribers looking for consumers -// that registered for <source> before <source> connected. -void -ACE_ES_Subscription_Module::reregister_consumers (RtecEventComm::EventSourceID source_id) -{ - ACE_ES_Subscription_Info::Subscriber_Set *subscribers = 0; - if (source_subscribers_.find (source_id, subscribers) == -1) - // Not found. - return; - - ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (*subscribers); - - // Try to reregister all consumers. - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - if (this->subscribe (*consumer) == -1) - ACE_ERROR ((LM_ERROR, "%p.\n" "ACE_ES_Subscription_Module::reregister_consumers")); -} - - -void -ACE_ES_Subscription_Module::disconnecting (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &_env) -{ - ACE_ES_WGUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_THROW (SYNC_ERROR); - // @@ TODO: Orbix parameters - // (0, CORBA::COMPLETED_NO, "ACE_ES_Subscription_Module::disconnected")); - - if (all_suppliers_.remove (supplier) == -1) - ACE_THROW (SUBSCRIPTION_ERROR); - // @@ TODO: Orbix parameters. - // (0, CORBA::COMPLETED_NO, "ACE_ES_Subscription_Module remove failed")); - - // Remove all consumers from the supplier's source-based subscription lists. - ACE_ES_Subscription_Info::Subscriber_Set_Iterator source_iterator - (supplier->subscription_info ().source_subscribers_); - - for (ACE_ES_Consumer_Rep **consumer; - source_iterator.next (consumer) != 0; - source_iterator.advance ()) - (*consumer)->_release (); - - // Get the subscriber list for each type. - ACE_ES_Subscription_Info::Subscriber_Map_Iterator type_map_iterator - (supplier->subscription_info ().type_subscribers_); - - for (ACE_ES_Subscription_Info::Subscriber_Map_Entry *entry; - type_map_iterator.next (entry) != 0; - type_map_iterator.advance ()) - { - // Remove all consumers from the supplier's source-based subscription lists. - ACE_ES_Subscription_Info::Subscriber_Set_Iterator type_iterator - (entry->int_id_->consumers_); - - for (ACE_ES_Consumer_Rep **c; - type_iterator.next (c) != 0; - type_iterator.advance ()) - (*c)->_release (); - } -} - -int -ACE_ES_Subscription_Module::subscribe_all (ACE_ES_Consumer_Rep *) -{ - ACE_ERROR_RETURN ((LM_ERROR, "Consumer tried to register for all" - "events! This is not implemented.\n"), -1); -} - -int -ACE_ES_Subscription_Module::subscribe_source (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source) -{ - // Step through all Supplier Proxies looking for a match to - // -supplier-. Add the -consumer- to the correct supplier proxy. - Supplier_Iterator iter (all_suppliers_); - - int success = -1; - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - // Operator == checks if <proxy> is a proxy for <supplier>. - if ((**proxy) == source) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - - ACE_ES_Subscription_Info::Subscriber_Set &set = - (*proxy)->subscription_info ().source_subscribers_; - - // Insert the consumer to the supplier's subscription set for - // the type. - int insert_result = set.insert (consumer); - switch (insert_result) - { - case -1: - // Error. - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "Subscription Module::subscribe_source"), -1); - case 0: - default: - { - // Increment the consumer rep's reference count. - consumer->_duplicate (); - // Success. - // Add each of the supplier's dependency infos to the - // consumer's dependency list. - ACE_ES_Subscription_Info::Subscriber_Map_Iterator iter2 - ((*proxy)->subscription_info ().type_subscribers_); - - // Delete all type collections. - for (ACE_ES_Subscription_Info::Subscriber_Map_Entry *temp = 0; - iter2.next (temp) != 0; - iter2.advance ()) - { - ACE_TRY - { - ACE_Scheduler_Factory::server()->add_dependency - (consumer->dependency()->rt_info, - temp->int_id_->dependency_info_->rt_info, - temp->int_id_->dependency_info_->number_of_calls, - ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_DEBUG ((LM_DEBUG, - "%s - add_dependency (%d,%d,%d)\n", - "ACE_ES_Priority_Timer::subscribe_source", - consumer->dependency()->rt_info, - temp->int_id_->dependency_info_->rt_info, - temp->int_id_->dependency_info_->number_of_calls)); - } - ACE_CATCHANY - { - ACE_TRY_ENV.print_exception ("error adding dependency"); - return -1; - } - ACE_ENDTRY; - } - } - - case 1: - // Already there. - success = 0; - break; - } - } - } - - // Add the consumer to the global source subscribers list. - if (success == -1) - return ACE_ES_Subscription_Info::insert_or_allocate (source_subscribers_, - consumer, - source); - else - return success; -} - -// Step through all Supplier Proxies. For each proxy, if it generates -// <type>, add <consumer> to its subscription info. -int -ACE_ES_Subscription_Module::subscribe_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type) -{ - // First insert <consumer> into the global type collection set - // corresponding to <type>. The type collection will only be used - // when suppliers register late. - if (ACE_ES_Subscription_Info::insert_or_allocate (type_subscribers_, - consumer, type) == -1) - return -1; - - consumer->_duplicate (); - - Supplier_Iterator iter (all_suppliers_); - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - // Insert the consumer to the supplier's subscription set for - // the type. If the supplier does not publish this type, the - // operation will fail. If this succeeds, dependency_info will - // be added to the consumer. - RtecScheduler::Dependency_Info *dependency_info; - if (ACE_ES_Subscription_Info::insert_or_fail - ((*proxy)->subscription_info ().type_subscribers_, - consumer, type, dependency_info) == 0) - { - consumer->_duplicate (); - // Success. Add the supplier dependency info to the - // consumer's dependency list. - // @@ TODO handle exceptions. - ACE_TRY - { - ACE_Scheduler_Factory::server()->add_dependency - (consumer->dependency ()->rt_info, - dependency_info->rt_info, - dependency_info->number_of_calls, - ACE_TRY_ENV); - ACE_DEBUG ((LM_ERROR, "%s - add_dependency (%d,%d,%d)\n", - "ACE_ES_Priority_Timer::schedule_timer - ", - consumer->dependency ()->rt_info, - dependency_info->rt_info, - dependency_info->number_of_calls)); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "Subscription_Module::subscribe_type:" - " add_dependency failed.\n")); - return -1; - } - ACE_ENDTRY; - } - } - - return 0; -} - -int -ACE_ES_Subscription_Module::subscribe_source_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source, - RtecEventComm::EventType type) -{ - // Step through all Supplier Proxies looking for a match to - // <supplier>. Once we find one, find the correct set for the - // specified type. Add the <consumer> to that set. - Supplier_Iterator iter (all_suppliers_); - - int success = -1; - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - - if ((**proxy) == source) - { - // Insert the consumer to the supplier's subscription set for - // the type. - RtecScheduler::Dependency_Info *dependency_info; - int insert_result = ACE_ES_Subscription_Info::insert_or_fail - ((*proxy)->subscription_info().type_subscribers_, - consumer, type, dependency_info); - - switch (insert_result) - { - case -1: - // Error. - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "Subscription Module::subscribe_source_type"), -1); - case 0: - default: - { - // Success. - // Add the supplier to the consumer's dependency list. - // @@ TODO handle exceptions. - ACE_TRY - { - ACE_Scheduler_Factory::server()->add_dependency - (consumer->dependency ()->rt_info, - dependency_info->rt_info, - dependency_info->number_of_calls, - ACE_TRY_ENV); - ACE_DEBUG ((LM_ERROR, "%s - add_dependency (%d,%d,%d)\n", - "ACE_Subscription_Module::subscribe_source_type - ", - consumer->dependency ()->rt_info, - dependency_info->rt_info, - dependency_info->number_of_calls)); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, "Subscription_Module::subscribe_source_type:" - " add_dependency failed.\n"), - -1); - } - ACE_ENDTRY; - consumer->_duplicate (); - } - /* FALLTHROUGH */ - case 1: - success = 0; - - // Already there. - break; - } - - } - } - - if (success == -1) - // If we failed to find a source, insert this consumer in the - // global source subscriber list. - { - if (ACE_ES_Subscription_Info::insert_or_allocate (source_subscribers_, - consumer, - source) == 0) - { - consumer->_duplicate (); - return 0; - } - else - return -1; - } - else - return success; -} - -// <consumer> contains information for one type of subscription. -// Delegate to the appropriate method for subscription. -int -ACE_ES_Subscription_Module::subscribe (ACE_ES_Consumer_Rep *consumer) -{ - // We could have finer granularity by putting RGUARDs in some of the - // subscribe methods. - ACE_ES_WGUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Subscription_Module::subscribe"), -1); - - int result = 0; - RtecEventComm::Event &event = consumer->dependency ()->event_; - - if (event.source_ == 0) - // Not source-based subscription. - { - if (event.type_ == ACE_ES_EVENT_ANY) - result = this->subscribe_all (consumer); - else - result = this->subscribe_type (consumer, event.type_); - } - else - // Source-based subscription. - { - if (event.type_ == ACE_ES_EVENT_ANY) - result = this->subscribe_source (consumer, event.source_); - else - result = this->subscribe_source_type (consumer, event.source_, event.type_); - } - - return result; -} - -int -ACE_ES_Subscription_Module::unsubscribe (ACE_ES_Consumer_Rep *consumer) -{ - // We could have finer granularity by putting RGUARDs in some of the - // unsubscribe methods. - ACE_ES_WGUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Subscription_Module::unsubscribe"), -1); - - RtecEventComm::Event &event = consumer->dependency ()->event_; - - if (event.type_ != ACE_ES_EVENT_ANY) - { - // Remove the consumer from the global type-based subscription list. - if (ACE_ES_Subscription_Info::remove (type_subscribers_, - consumer, event.type_) == 0) - consumer->_release (); - } - else - // Remove the consumer from the global source-based subscription list. - if (ACE_ES_Subscription_Info::remove (source_subscribers_, - consumer, event.source_) == 0) - consumer->_release (); - - return 0; - - /* - - This old code manually removed the consumer from the subscription - lists. Now we do lazy removal. - - int result = 0; - - if (CORBA::is_nil (event.source_)) - { - if (event.type_ == ACE_ES_EVENT_ANY) - result = this->unsubscribe_all (consumer); - else - result = this->unsubscribe_type (consumer, event.type_); - } - else - { - if (event.type_ == ACE_ES_EVENT_ANY) - result = this->unsubscribe_source (consumer, event.source_); - else - result = this->unsubscribe_source_type (consumer, event.source_, event.type_); - } - return result; - */ -} - -int -ACE_ES_Subscription_Module::unsubscribe_all (ACE_ES_Consumer_Rep *) -{ - return 0; -} - -int -ACE_ES_Subscription_Module::unsubscribe_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type) -{ - // Step through all Supplier Proxies trying to remove the - // consumer-type pair. ACE_ES_Subscription_Info::remove will fail - // if the supplier does not generate <type>, but that's ok. - Supplier_Iterator iter (all_suppliers_); - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - - // This remove will be harmless if the supplier does not - // generate <type>. - ACE_ES_Subscription_Info::remove ((*proxy)->subscription_info ().type_subscribers_, - consumer, type); - } - - return 0; -} - -int -ACE_ES_Subscription_Module::unsubscribe_source (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source) -{ - Supplier_Iterator iter (all_suppliers_); - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - - if ((**proxy) == source) - { - ACE_ES_Subscription_Info::Subscriber_Set &set = - (*proxy)->subscription_info ().source_subscribers_; - if (set.remove (consumer) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "Subscription Module::unsubscribe_source"), -1); - } - } - - return 0; -} - -int -ACE_ES_Subscription_Module::unsubscribe_source_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source, - RtecEventComm::EventType type) - -{ - Supplier_Iterator iter (all_suppliers_); - - // Step through all supplier proxies looking for a match to the - // consumer's event.source_. This is the same as unsubscribe_type, - // only we can check the source first. - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - // If the proxy matches the source id we're looking for, try to - // remove <consumer> from the proxy's <event.type_> set. - if ((**proxy) == source) - { - ACE_ES_WGUARD mon ((*proxy)->subscription_info ().lock_); - - // Continue in spite of errors. - ACE_ES_Subscription_Info::remove ((*proxy)->subscription_info ().type_subscribers_, - consumer, type); - } - - return 0; -} - -void -ACE_ES_Subscription_Module::push (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event, - CORBA::Environment &) -{ - ACE_TIMEPROBE (" deliver to Subscription Module"); - // These are all inline function calls. - if (this->push_source (source, event) == -1) - return; - - ACE_TIMEPROBE (" begin push_source_type"); - - if (this->push_source_type (source, event) == -1) - return; - - ACE_TIMEPROBE (" end push_source_type"); -} - -void -ACE_ES_Subscription_Module::shutdown (void) -{ - ACE_ES_WGUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_ERROR ((LM_ERROR, "%p.\n", - "ACE_ES_Subscription_Module::unsubscribe")); - - // Remove all type_subscribers_ and source_subscribers_. - - ACE_ES_Subscription_Info::Subscriber_Map_Iterator type_iter (type_subscribers_); - for (ACE_ES_Subscription_Info::Subscriber_Map_Entry *entry; - type_iter.next (entry) != 0; - type_iter.advance ()) - { - ACE_ES_Subscription_Info::Subscriber_Set_Iterator ts_iter (entry->int_id_->consumers_); - - for (ACE_ES_Consumer_Rep **consumer = 0; - ts_iter.next (consumer) != 0; - ts_iter.advance ()) - (*consumer)->_release (); - - delete entry->int_id_; - } - - ACE_ES_Subscription_Info::SourceID_Map_Iterator source_iter (source_subscribers_); - - for (ACE_ES_Subscription_Info::SourceID_Map_Entry *entry2; - source_iter.next (entry2) != 0; - source_iter.advance ()) - { - ACE_ES_Subscription_Info::Subscriber_Set_Iterator ss_iter (*entry2->int_id_); - - for (ACE_ES_Consumer_Rep **consumer = 0; - ss_iter.next (consumer) != 0; - ss_iter.advance ()) - (*consumer)->_release (); - - delete entry2->int_id_; - } - - // We don't need to do anything to all_suppliers_ since the supplier - // module should have disconnected all suppliers. To be more - // independent from the supplier module, this method should iterate - // through all suppliers and call this->disconnecting. - up_->shutdown (); -} - -// ************************************************************ - -ACE_ES_Supplier_Module::ACE_ES_Supplier_Module (ACE_EventChannel *channel) : - all_suppliers_ (), - lock_ (), - me_ (this), - up_ (0), - channel_ (channel) -{ -} - -void -ACE_ES_Supplier_Module::open (ACE_ES_Subscription_Module *up) -{ - // There is the theory of the Mobius, a twist, in the fabric of - // space, where time becomes a loop, where time becomes a loop. - up_ = up; -} - -void -ACE_ES_Supplier_Module::connected (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &_env) -{ - channel_->report_connect (ACE_EventChannel::SUPPLIER); - up_->connected (supplier, _env); -} - -void -ACE_ES_Supplier_Module::disconnecting (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &_env) -{ - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - ACE_THROW (SYNC_ERROR); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Supplier_Module::disconnected")); - - if (all_suppliers_.remove (supplier) == -1) - ACE_THROW (SUBSCRIPTION_ERROR); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Supplier_Module remove failed")); - - up_->disconnecting (supplier, _env); - - if (all_suppliers_.size () <= 0) - { - ACE_DEBUG ((LM_DEBUG, "(%t) No more suppliers connected.\n")); - channel_->report_disconnect (ACE_EventChannel::SUPPLIER); - } - - // IMHO this release is broken: supplier is a parameter, we never - // actually increased its reference count, so we shouldn't decrease - // it. - // CORBA::release (supplier); -} - -void -ACE_ES_Supplier_Module::shutdown (void) -{ - Suppliers copy; - - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - return; - - copy = all_suppliers_; - } - - if (copy.size () > 0) - { - Supplier_Iterator iter (copy); - - CORBA::Environment env; - - for (ACE_Push_Supplier_Proxy **proxy = 0; - iter.next (proxy) != 0; - iter.advance ()) - { - (*proxy)->shutdown (); - this->disconnecting (*proxy, env); - } - } - - up_->shutdown (); -} - -RtecEventChannelAdmin::ProxyPushConsumer_ptr -ACE_ES_Supplier_Module::obtain_push_consumer (CORBA::Environment &_env) -{ - ACE_Push_Supplier_Proxy *new_supplier = new ACE_Push_Supplier_Proxy (this); - - if (new_supplier == 0) - ACE_THROW_RETURN (CORBA::NO_MEMORY (CORBA::COMPLETED_NO), 0); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, "ACE_ES_Supplier_Module::obtain_push_consumer")); - - { - ACE_ES_GUARD ace_mon (lock_); - if (ace_mon.locked () == 0) - { - delete new_supplier; - ACE_THROW_RETURN (SYNC_ERROR, 0); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, - // "ACE_ES_Supplier_Module::obtain_push_consumer"), 0); - } - - if (all_suppliers_.insert (new_supplier) == -1) - ACE_ERROR ((LM_ERROR, "ACE_ES_Supplier_Module insert failed.\n")); - } - - return new_supplier->get_ref (); -} - -void -ACE_ES_Supplier_Module::push (ACE_Push_Supplier_Proxy *proxy, - const RtecEventComm::EventSet &event, - CORBA::Environment &_env) -{ - ACE_TRY - { - for (CORBA::ULong i = 0; i < event.length(); ++i) - { - ACE_ES_Event_Container *temp = - new ACE_ES_Event_Container (event[i]); - //RtecEventComm::Event *temp = new RtecEventComm::Event (event); - - if (temp == 0) - ACE_THROW (CORBA::NO_MEMORY (CORBA::COMPLETED_NO)); - // @@ TODO Orbix parameters: - // (0, CORBA::COMPLETED_NO, - // "ACE_ES_Supplier_Module::obtain_push_consumer")); - - // This will guarantee that release gets called when we exit - // the scope. - ACE_ES_Event_Container_var event_copy (temp); - temp->_release (); - ACE_TIMEPROBE (" deliver to Supplier Module (thru Supplier Proxy)"); - up_->push (proxy, event_copy, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - } - ACE_CATCH (RtecEventComm::Disconnected, d) - { - ACE_ERROR ((LM_ERROR, "%p Disconnected.\n", - "ACE_ES_Supplier_Module::push")); - ACE_RETHROW; - } - ACE_CATCH (RtecEventChannelAdmin::TypeError, t) - { - ACE_ERROR ((LM_ERROR, "%p Type Error.\n", - "ACE_ES_Supplier_Module::push")); - ACE_RETHROW; - } - ACE_CATCH (CORBA::NO_MEMORY, e) - { - ACE_ERROR ((LM_ERROR, "%p No Memory.\n", - "ACE_ES_Supplier_Module::push")); - ACE_RETHROW; - } - ACE_CATCH (CORBA::SystemException, e) - { - ACE_ERROR ((LM_ERROR, "%p CORBA System Exception.\n", - "ACE_ES_Supplier_Module::push")); - ACE_RETHROW; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "ACE_ES_Supplier_Module::push: " - "Unknown exception.\n")); - ACE_RETHROW; - } - ACE_ENDTRY; -} - -// ************************************************************ - -ACE_ES_Priority_Timer::ACE_ES_Priority_Timer (void) -{ -} - -int -ACE_ES_Priority_Timer::connected (RtecScheduler::handle_t rt_info) -{ - RtecScheduler::OS_Priority thread_priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_priority; - - ACE_TRY - { - ACE_TIMEPROBE (" connected - priority requested"); - ACE_Scheduler_Factory::server ()->priority - (rt_info, thread_priority, - subpriority, preemption_priority, ACE_TRY_ENV); - ACE_CHECK_ENV; - ACE_TIMEPROBE (" connected - priority obtained"); -#if 0 - ACE_ERROR_RETURN ((LM_ERROR, "%p RtecScheduler::Scheduler::priority failed.\n", - "ACE_ES_Priority_Timer::connected"), -1); -#endif /* 0 */ - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "%p RtecScheduler::Scheduler::priority failed.\n", - "ACE_ES_Priority_Timer::connected"), -1); - } - ACE_ENDTRY; - - // Just make sure the ORB allocates resources for this priority. - if (ACE_Task_Manager::instance()->GetReactorTask (preemption_priority) == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", - "ACE_ES_Priority_Timer::connected"), -1); - - return 0; -} - -int -ACE_ES_Priority_Timer::handle_timeout (const ACE_Time_Value &, - const void *vp) -{ - ACE_ES_Timer_ACT *act = (ACE_ES_Timer_ACT *) vp; - - if (act == 0) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Priority_Timer::handle_timeout: " - "received act == 0!!!.\n"), 0); - - ACE_TIMEPROBE ("ES_Priority_Queue - start execute"); - - act->execute (); - - ACE_TIMEPROBE ("ES_Priority_Queue - end execute"); - - return 0; -} - -// ************************************************************ - -const char * -ACE_ES_Consumer_Name (const RtecEventChannelAdmin::ConsumerQOS &qos) -{ - // The first dependency should designate a correlation group. - - ACE_TRY - { - ACE_TIMEPROBE (" Consumer_Name - priority requested"); - RtecScheduler::RT_Info* rt_info = ACE_Scheduler_Factory::server ()->get - (qos.dependencies[1].rt_info, ACE_TRY_ENV); - ACE_CHECK_ENV; - ACE_TIMEPROBE (" Consumer_Name - priority obtained"); - - return rt_info->entry_point; - } - ACE_CATCHANY - { - return "no-name"; - } - ACE_ENDTRY; - ACE_NOTREACHED (return "no-name"); -} - -// ************************************************************ - -void -dump_event (const RtecEventComm::Event &event) -{ - ACE_DEBUG ((LM_DEBUG, "source_ = %d " - "type_ = %d " - "time_ = %u.\n", - (void*)event.source_, - event.type_, - // The divide-by-1 is for ACE_U_LongLong support. - event.creation_time_ / 1)); -} - -// ************************************************************ - -#if defined(ACE_ES_LACKS_ORB) -void -dump_sequence (const ACE_CORBA_Sequence<ACE_ES_Event> &seq) -{ - for (CORBA::ULong index=0; index < seq.length (); index++) - ::dump_event (seq[index]); -} -#endif /* ACE_ES_LACKS_ORB */ - -// ************************************************************ - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -#if defined (ACE_ES_LACKS_ORB) -//template class ACE_CORBA_Sequence<RtecEventComm::Event>; -// template class ACE_CORBA_Sequence<RtecEventComm::Event_var>; -template class ACE_CORBA_Sequence<RtecEventChannelAdmin::Dependency>; -template class ACE_CORBA_Sequence<ACE_ES_Publication>; -// For ACE_ES_Event_Container_var. -template class ACE_CORBA_var<ACE_ES_Event_Container>; - -// Used in Event_Channel.cpp. -template void operator+=(ACE_CORBA_Sequence<ACE_ES_Event> &, - ACE_ES_Event const &); -#endif /* ACE_ES_LACKS_ORB */ - -template class ACE_Atomic_Op<ACE_ES_MUTEX, int>; -template class ACE_Map_Entry<ACE_ES_Subscription_Info::EXT, ACE_ES_Subscription_Info::INT>; -template class ACE_Map_Entry<ACE_ES_Subscription_Info::sEXT, ACE_ES_Subscription_Info::sINT>; -template class ACE_Map_Iterator<ACE_ES_Subscription_Info::EXT, ACE_ES_Subscription_Info::INT, ACE_ES_Subscription_Info::SYNCH>; -template class ACE_Map_Iterator<ACE_ES_Subscription_Info::sEXT, ACE_ES_Subscription_Info::sINT, ACE_ES_Subscription_Info::SYNCH>; -template class ACE_Map_Manager<ACE_ES_Subscription_Info::EXT, ACE_ES_Subscription_Info::INT, ACE_ES_Subscription_Info::SYNCH>; -template class ACE_Map_Manager<ACE_ES_Subscription_Info::sEXT, ACE_ES_Subscription_Info::sINT, ACE_ES_Subscription_Info::SYNCH>; -template class ACE_Node<ACE_ES_Consumer_Rep *>; -template class ACE_Node<ACE_Push_Consumer_Proxy *>; -template class ACE_Node<ACE_Push_Supplier_Proxy *>; -template class ACE_Unbounded_Set<ACE_ES_Consumer_Rep *>; -template class ACE_Unbounded_Set<ACE_Push_Consumer_Proxy *>; -template class ACE_Unbounded_Set<ACE_Push_Supplier_Proxy *>; -template class ACE_Unbounded_Set_Iterator<ACE_ES_Consumer_Rep *>; -template class ACE_Unbounded_Set_Iterator<ACE_Push_Consumer_Proxy *>; -template class ACE_Unbounded_Set_Iterator<ACE_Push_Supplier_Proxy *>; - -// For ACE_ES_Event_Container_Allocator. -template class ACE_Cached_Allocator<ACE_ES_Event_Container_Chunk, ACE_Null_Mutex>; -template class ACE_Cached_Allocator<ACE_ES_Dispatch_Request_Chunk, ACE_Null_Mutex>; -template class ACE_Cached_Mem_Pool_Node<ACE_ES_Event_Container_Chunk>; -template class ACE_Cached_Mem_Pool_Node<ACE_ES_Dispatch_Request_Chunk>; -template class ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<ACE_ES_Event_Container_Chunk>, ACE_Null_Mutex>; -template class ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<ACE_ES_Dispatch_Request_Chunk>, ACE_Null_Mutex>; -template class ACE_Free_List<ACE_Cached_Mem_Pool_Node<ACE_ES_Event_Container_Chunk> >; -template class ACE_Free_List<ACE_Cached_Mem_Pool_Node<ACE_ES_Dispatch_Request_Chunk> >; - -template class ACE_ES_Array_Iterator<ACE_ES_Consumer_Rep *>; -template class ACE_ES_Simple_Array<ACE_ES_Consumer_Rep *, 100>; - -template class ACE_CORBA_var<ACE_ES_Event_Container>; - - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/bin/Event_Service/Event_Channel.h b/TAO/local/bin/Event_Service/Event_Channel.h deleted file mode 100644 index da26e4cf0e6..00000000000 --- a/TAO/local/bin/Event_Service/Event_Channel.h +++ /dev/null @@ -1,1312 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ace ORB -// -// = FILENAME -// Event_Channel -// -// = AUTHOR -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// TAO implementation of the Real Time Event Services. For more -// detailed information, see -// http://www.cs.wustl.edu/~schmidt/oopsla.ps.gz -// -// = NAMING CONVENTIONS -// Some of the naming might be confusing. For instance -// ACE_Push_Consumer_Proxy "is-a" ProxyPushSupplier. To the -// channel, ACE_Push_Consumer_Proxy is a proxy to push consumers. -// To a push consumer, ACE_Push_Consumer_Proxy is a proxy to push -// suppliers. I chose to name classes relative to the Event -// Channel. -// -// ============================================================================ - -#ifndef ACE_EVENT_CHANNEL_H -#define ACE_EVENT_CHANNEL_H - -#include "ace/Containers.h" -#include "ace/Map_Manager.h" - -#include "tao/Timeprobe.h" -#include "Local_ESTypes.h" -#include "CORBA_Utils_T.h" -#include "Task_Manager.h" -#include "ReactorTask.h" - -//ACE_INLINE void operator += (ACE_CORBA_Sequence<RtecEventComm::Event_var> &dest, -// RtecEventComm::Event *item); - -ACE_INLINE int operator == (const RtecEventComm::Event &event1, - const RtecEventComm::Event &event2); -// This operation could be part of the classes, but in order to stay -// CORBA compliant, we're adding them as global operators. - -// ************************************************************ - -class ACE_ES_Event_Container : public RtecEventComm_Event -// = TITLE -// Event Container -// -// = DESCRIPTION -// Basically an ACE_ES_Event with reference counting and -// thread-specific memory allocation. -{ -public: - ACE_ES_Event_Container (void); - // Default construction. - - ~ACE_ES_Event_Container (void); - // Destruction. - - ACE_ES_Event_Container (const ACE_ES_Event_Container &); - // Copy construction. - - ACE_ES_Event_Container (const RtecEventComm::Event &); - // Construction with an event. - - ACE_ES_Event_Container *_duplicate (void); - // Increments ref_count_ and returns this. - - void _release (void); - // Decrements ref_count_ and deletes if 0. - - int operator== (const ACE_ES_Event_Container &event); - // Returns 1 if the two are "equal," 0 otherwise. Determines - // equality using source_ and type_ only. A 0 source_ is a wildcard - // (always equal). A type_ of ACE_ES_EVENT_ANY is also a wildcard. - - void *operator new (size_t nbytes); - // Allocates memory from a thread-specific memory pool. - - void operator delete (void *); - // Returns memory to a thread-specific memory pool. - - void dump (void); - -private: - int ref_count_; -}; - -typedef ACE_CORBA_var<ACE_ES_Event_Container> ACE_ES_Event_Container_var; - -ACE_INLINE void operator += (ACE_CORBA_Sequence<ACE_ES_Event_Container_var> &dest, - ACE_ES_Event_Container *item); - -#if defined(ACE_ES_LACKS_ORB) -// Utility for debugging sequences. -ACE_Svc_Export void dump_sequence (const ACE_CORBA_Sequence<RtecEventComm::Event> &seq); -#endif /* ACE_ES_LACKS_ORB */ - -// Utility for debugging events. -void dump_event (const RtecEventComm::Event &event); - -// ************************************************************ - -class ACE_RTU_Manager -// = TITLE -// ACE RTU Manager -// -// = DESCRIPTION -{ -public: - ACE_RTU_Manager (int active); - // If <active> == 0, everything returns 0. If <active> != 0, RTUs - // galore. - - int should_preempt (void); - // Returns 1 if the current task should preempt itself. Otherwise, - // returns 0. Resets should_preempt to zero. - - void should_preempt (int s); - // Called by the dispatching module when the current task should - // preempt itself. - - void not_done (int nd); - // If <nd> != 0, the current running task will be enqueued at the - // head of its dispatch tail. - - int not_done (void); - // Returns 1 if the current task needs to be dispatched again. - // Resets not_done_ to 0; - - // = Get/set the priority of the current running task. - RtecScheduler::OS_Priority priority (void); - void priority (RtecScheduler::OS_Priority priority); - -private: - int active_; - int should_preempt_; - int not_done_; - RtecScheduler::OS_Priority priority_; -}; - -// ************************************************************ - -// Chesire cat. -class ACE_ES_Priority_Timer; -// Forward declarations. -class ACE_ES_Consumer_Module; -class ACE_ES_Correlation_Module; -class ACE_ES_Subscription_Module; -class ACE_ES_Supplier_Module; -// This forward decl and typedef allow us to remove inheritence later -// on without changing any code. -class ACE_ES_Dispatching_Base; -typedef ACE_ES_Dispatching_Base ACE_ES_Dispatching_Module; - -// ec.. -class ACE_EventChannel : public RtecEventChannelAdmin_EventChannelBOAImpl -// = TITLE -// ACE Event Channel. -// -// = DESCRIPTION -// Implementation of COSS Event Channel. For more detailed -// information, see http://www.cs.wustl.edu/~mda/event.html. -{ -public: - enum { INITIAL_STATE = 0, - CONSUMER = 1, SUPPLIER = 2, - SHUTDOWN = CONSUMER | SUPPLIER }; - - ACE_EventChannel (u_long type = ACE_DEFAULT_EVENT_CHANNEL_TYPE); - // Construction of the given <type>. Check the **_CHANNEL - // enumerations defined below. - - virtual ~ACE_EventChannel (void); - // Calls destroy. - - // = Accessor methods to Event Channel objects. The Event Channel - // acts as a sort of service repository of object references. All - // objects in the Event Service come to this interface to obtain - // object references during initialization. - - virtual RtecEventChannelAdmin::ConsumerAdmin_ptr for_consumers (CORBA::Environment &); - // Consumer administration factory method. - - virtual RtecEventChannelAdmin::SupplierAdmin_ptr for_suppliers (CORBA::Environment &); - // Supplier administration factory method. - - virtual void destroy (CORBA::Environment &); - // Explicitly shut down the channel. - - RtecEventChannelAdmin::EventChannel_ptr get_ref (void); - // Allow transformations to RtecEventChannelAdmin::EventChannel. - - ACE_RTU_Manager *rtu_manager (void); - // Returns a reference to the RTU manager. - - ACE_ES_Priority_Timer *timer (void); - // Timer accessor. - - // = These should be private. - ACE_ES_Consumer_Module *consumer_module_; - ACE_ES_Dispatching_Module *dispatching_module_; - ACE_ES_Correlation_Module *correlation_module_; - ACE_ES_Subscription_Module *subscription_module_; - ACE_ES_Supplier_Module *supplier_module_; - - ACE_ES_Priority_Timer *timer_; - - void report_connect (u_long); - // Consumer or supplier connected. - - void report_disconnect (u_long); - // Consumer or supplier disconnected. - - void shutdown (void); - // Do not call this. The last module has shut down. - -private: - ACE_RTU_Manager *rtu_manager_; - // The RTU manager dude! - - u_long type_; - // Can be any **_CHANNEL. (well, except NO_CHANNEL). - - u_long state_; - // Can be INITIAL_STATE, NO_CONSUMERS, NO_SUPPLIERS, or SHUTDOWN. - - ACE_ES_MUTEX lock_; - // Used to lock shared state. - - RtecEventChannelAdmin::EventChannel_ptr me_; - // CORBA reference to self. - - int destroyed_; - // Ensures this->destory is executed only once. -}; - -// ************************************************************ - -class ACE_ES_Dependency_Iterator -// = TITLE -// ConsumerQOS Iterator -// -// = DESCRIPTION -// This is used by the Event Channel to parse ConsumerDependency objects. -{ -public: - ACE_ES_Dependency_Iterator (RtecEventChannelAdmin::DependencySet &rep); - // Construct and iterator for <rep>. - - int advance_dependency (void); - // Returns 0 if the advance succeeded. Returns -1 if there are no - // more dependencies in the group. - - int parse (void); - // Cache values for n_** methods. - - int n_conjunctions (void); - // Returns the number of conjunction groups in the dependency set. - - int n_disjunctions (void); - // Returns the number of disjunction groups in the dependency set. - - int n_timeouts (void); - // Returns the number of timeouts registered. - - int n_events (void); - // Returns the number of events registered. - - RtecEventChannelAdmin::Dependency &operator *(void); - // Accessor to the current ConsumerDependency pointed to by the - // iterator. - - RtecScheduler::handle_t first_rt_info (void); - // Returns the first RT_Info in the dependencies. - -protected: - RtecScheduler::handle_t rt_info_; - // The first rt_info in the dependencies. - - RtecEventChannelAdmin::DependencySet &rep_; - // Reference to the dependency array. - - int index_; - // Index into rep_. - - RtecEventComm::EventType group_type_; - // The type of the current correlation group. - - int n_conjunctions_; - // Number of conjunction groups. - - int n_disjunctions_; - // Number of disjunction groups. - - int n_timeouts_; - // Number of timeouts registered. - - int n_events_; - // Number of events registered. -}; - -// ************************************************************ - -class ACE_ES_Timer_ACT -// = TITLE -// Timer Asynchronous Completion Token -// -// = DESCRIPTION -// Implements Command pattern with timers. -{ -public: - virtual void execute (void) = 0; -}; - -// ************************************************************ -// Forward decl. -class ACE_ES_Consumer_Rep_Timeout; - -class ACE_ES_Disjunction_Group -// = TITLE -// Disjunction Group -// -// = DESCRIPTION -// Represents a disjunction group, such as (A|B|C). -{ -public: - ACE_ES_Disjunction_Group (void); - // Default construction. - - void set_correlation_module (ACE_ES_Correlation_Module *cm); - // <cm> is needed for rescheduling deadlines. - - void reschedule_deadline (void); - // If deadline_timer_rep_ is set, it is cancelled and rescheduled. - - int set_deadline_timeout (ACE_ES_Consumer_Rep_Timeout *cr); - // Set the group's reference to the deadline timer. Returns 0 on - // success, -1 on failure. - - typedef ACE_CORBA_Sequence<ACE_ES_Event_Container_var> Event_Set; - - virtual void add_events (Event_Set *outbox, - Event_Set *pending_events, - u_long &pending_flags); - // Does nothing. This is the only virtual method in this little - // heirarchy with the conjunction group. - - void set_act (RtecEventComm::Event &act); - // Set the ACT for this group. - -protected: - ACE_ES_Event_Container_var act_; - // To be sent with this group. - -private: - ACE_ES_Consumer_Rep_Timeout *deadline_timer_rep_; - // The disjunction group keeps a reference to the deadline timer. - - ACE_ES_Correlation_Module *correlation_module_; - // Used for cancelling and scheduling deadline_timer_rep_. -}; - -// ************************************************************ - -class ACE_ES_Conjunction_Group : public ACE_ES_Disjunction_Group -// = TITLE -// Conjunction Group -// -// = DESCRIPTION -// Represents a conjunction group, such as (A+B+C). -{ -public: - ACE_ES_Conjunction_Group (void); - // Default construction. - - int add_type (int type_id); - // Set the <type_id>th bit in the forward_value_. - - int should_forward (u_long pending_flags); - // Returns 1 if this conjunction group's dependencies have been - // satisfied. Returns 0 otherwise. - - typedef ACE_CORBA_Sequence<ACE_ES_Event_Container_var> Event_Set; - - virtual void add_events (Event_Set *outbox, - Event_Set *pending_events, - u_long &pending_flags); - // For each bit set in forward_value_, the corresponding events in - // <pending_events> is added to <outbox>. Each bit set in - // <forward_value_> is cleared in <pending_flags>. If <oubox> == 0, - // then add_events just clears the pending events and flags. - -private: - u_long forward_value_; -}; - -// ************************************************************ - -// Forward decl. -class ACE_ES_Consumer_Correlation; - -class ACE_ES_Consumer_Rep : public ACE_ES_Timer_ACT -// = TITLE -// Consumer Representation. -// -// = DESCRIPTION -// These are stored in the subscription module. They store -// information that allows optimized correlations. It represents -// the consumer that will handle *one* type of event. This -// probably shouldn't inherit from ACE_ES_Timer_ACT since it's used -// only by ACE_ES_Consumer_Rep_Timeout. However, this allows me to -// minimize dynamic allocation. -{ -public: - ACE_ES_Consumer_Rep (void); - // Default construction. - - void init (ACE_ES_Consumer_Correlation *correlation, - RtecEventChannelAdmin::Dependency &dep); - // <dep> describes the event subscribed to and the method handling - // the event. <correlation> is the parent correlation object. - - virtual ~ACE_ES_Consumer_Rep (void); - // Virtual destruction. - - RtecEventChannelAdmin::Dependency *dependency (void); - // The event subscribed to and the method that will handle this - // event. - - int type_id (void); - // Get the correlation group index of this consumer rep's event - // type. - - void type_id (int); - // Set the correlation group index of this consumer rep's event - // type. - - enum Correlation_Type - { - NO_CORRELATION, - CORRELATE, - DEADLINE_TIMEOUT, - GLOBAL_DEADLINE - }; - - u_long correlation_type (void); - // If this returns 0, then the event associated with this consumer - // should be forwarded without running any correlations. - - void correlation_type (u_long ct); - // Set whether the event should be correlated. <ct> is a - // Correlation_Type. - - int add_disjunction_group (ACE_ES_Disjunction_Group &); - // Add a disjunction group. - - ACE_ES_Disjunction_Group *top_group (void); - // Returns the first disjunction group added via - // this->add_disjunction_group. - - void reschedule_deadlines (void); - // Calls reschedule_deadline on all disjunction groups added through - // this->add_disjunction_group. - - int receiving_events (void); - // Returns 1 if events should be sent to this consumer. Returns 0 - // if they should not (suspended or disconnected). - - void suspend (void); - // Stop forwarding events to the calling consumer. - - void resume (void); - // Resume forwarding events to the calling consumer. - - ACE_ES_Consumer_Correlation *correlation (void); - // Returns the Consumer_Correlation object for the target consumer. - - void disconnect (void); - // Schedules the consumer rep to be removed from all subscription - // lists. - - int disconnected (void); - // Returns 1 if the consumer rep should be removed from all - // subscription lists. - - void _duplicate (void); - // Increments ref_count_. - - void _release (void); - // Decrements ref_count_ and deletes this if 0. - -protected: - int disconnected_; - // Whether the rep should be removed from all subscription lists. - - virtual void execute (void); - // This is called when timeouts occur. This implementation prints - // out an error message (since it really shouldn't be implemented in - // this class). - - int suspended_; - // Whether events should be dropped or forwarded. - - u_long correlation_type_; - // Whether any correlating should be done for this event. - - RtecEventChannelAdmin::Dependency *dependency_; - // Event subscribed to. - - ACE_ES_Consumer_Correlation *correlation_; - // The target consumer of events. - - int type_id_; - // Correlation group index of event_->type_. - - ACE_ES_Disjunction_Group *disjunction_group_; - // This should be a set. We'll just have room for one now. - - ACE_Atomic_Op<ACE_ES_MUTEX, int> ref_count_; - // Lock for reference count. -}; - -class ACE_ES_Consumer_Rep_Timeout : public ACE_ES_Consumer_Rep -// = TITLE -// Consumer Representation. -// -// = DESCRIPTION -// These are stored in the subscription module. They store -// information that allows optimized correlations. It represents -// the consumer that will handle *one* type of event. -{ -public: - ACE_ES_Consumer_Rep_Timeout (void); - // Default construction. - - void init (ACE_ES_Consumer_Correlation *correlation, - RtecEventChannelAdmin::Dependency &dep); - // <dep> describes the event subscribed to and the method handling - // the event. <correlation> is the parent correlation object. - - // = Get/set timer returned from the reactor. - int timer_id (void); - void timer_id (int); - - // = Get/set preemption priority. - RtecScheduler::OS_Priority preemption_priority (void); - void preemption_priority (RtecScheduler::OS_Priority pp); - -protected: - virtual void execute (void); - // This is called when timeouts occur. Calls correlation_-> - - int timer_id_; - // For cancelling timers. - - RtecScheduler::OS_Priority preemption_priority_; - // Store the preemption priority so we can cancel the correct timer. - // The priority values may change during the life. - - ACE_ES_Event_Container_var timeout_event_; -}; - -// ************************************************************ - -class ACE_ES_Subscription_Info -// = TITLE -// Event Service Subscription Info -// -// = DESCRIPTION -// Contains information on all consumers subscribed to a supplier. -// Each Push_Supplier_Proxy has an instance of this class. This -// should really be defined in Channel_Modules.h, but I want to -// have an instance of it in each ACE_Push_Supplier_Proxy. This -// allows us to reduce the amount of dynamic memory allocation. -{ -public: - ~ACE_ES_Subscription_Info (void); - // Free up dynamic resources. - - typedef ACE_Unbounded_Set_Iterator<ACE_ES_Consumer_Rep *> Subscriber_Set_Iterator; - typedef ACE_Unbounded_Set<ACE_ES_Consumer_Rep *> Subscriber_Set; - - class Type_Subscribers - // = DESCRIPTION - // There is one of these for each event type generated by the - // supplier. It contains the subscribers and the - // dependency_info_ describing the method that generates this - // event type. - { - public: - Type_Subscribers (RtecScheduler::Dependency_Info *d) - : dependency_info_ (d) {} - // Construction requires a dependency info describing the method - // that generates events for the consumers_. We use a pointer so - // that a null can be passed in this->insert_or_allocate. - - // void operator= (const Subscriber_Set &); - // Copy. - - Subscriber_Set consumers_; - // All the consumers that have registered for this event. - - RtecScheduler::Dependency_Info *dependency_info_; - // Description of the method that generates this event. - }; - - typedef RtecEventComm::EventType EXT; - typedef Type_Subscribers *INT; - typedef ACE_Null_Mutex SYNCH; - typedef ACE_Map_Manager<EXT, INT, SYNCH> Subscriber_Map; - typedef ACE_Map_Iterator<EXT, INT, SYNCH> Subscriber_Map_Iterator; - typedef ACE_Map_Entry<EXT, INT> Subscriber_Map_Entry; - - Subscriber_Set source_subscribers_; - // Source-based subscribers. - - Subscriber_Map type_subscribers_; - // Type-based subscribers. - - // = These are just typedefs for source-based subscriptions. - typedef RtecEventComm::EventSourceID sEXT; - typedef Subscriber_Set *sINT; - typedef ACE_Map_Manager<sEXT, sINT, SYNCH> SourceID_Map; - typedef ACE_Map_Iterator<sEXT, sINT, SYNCH> SourceID_Map_Iterator; - typedef ACE_Map_Entry<sEXT, sINT> SourceID_Map_Entry; - - ACE_ES_RW_LOCK lock_; - // Serializes writes to source_subscribers_ and type_subscribers_. - - static int insert_or_allocate (SourceID_Map &source_subscribers, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID sid); - // <source_subscribers> contains a mapping of source id to consumer - // list. Insert <consumer> into the list of consumers subscribed to - // <sid>. Allocate a list for <sid> if necessary. - - static int insert_or_allocate (Subscriber_Map &type_subscribers, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type); - // Add <consumer> to the set of consumers bound to <type> in - // <type_subscribers>. If there is consumer set for <type>, one is - // allocated. Returns -1 on failure, 0 otherwise. - - static int insert_or_fail (Subscriber_Map &type_subscribers, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type, - RtecScheduler::Dependency_Info *&dependency); - // Add <consumer> to the set of consumers bound to <type> in - // <type_subscribers>. If there is consumer set for <type>, the - // operation fails. Returns -1 on failure, 0 otherwise. - - static int remove (Subscriber_Map &type_map, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type); - // Remove <consumer> from the consumer set in <type_map> set - // corresponding to <type>. - - static int remove (SourceID_Map &source_subscribers, - ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID sid); - // Remove <consumer> from the consumer set in the - // <source_subscribers> set corresponding to <sid>. - - static void append_subscribers (Subscriber_Set &dest, - Subscriber_Set &src); - // Insert all elements of <src> into <dest>. -}; - -// ************************************************************ - -// Forward declarations. -class ACE_ES_Dispatch_Request; -class ACE_Push_Consumer_Proxy; - -class ACE_ES_Consumer_Correlation : public RtecEventComm_PushSupplierBOAImpl -// = TITLE -// Event Service Consumer_Correlation -// -// = DESCRIPTION -// There is one Consumer Correlation object per call to -// connect_push_consumer. It handles all the consumer's -// correlation dependencies including timeouts. This is also a -// PushSupplier to support event forwarding. -{ -public: - ACE_ES_Consumer_Correlation (void); - // Default construction. - - virtual ~ACE_ES_Consumer_Correlation (void); - // Deletes lock_. - - int connected (ACE_Push_Consumer_Proxy *consumer, - ACE_ES_Correlation_Module *correlation_module); - // Initialization. <correlation_module> is stored for delegating - // channel operations. <consumer> is stored to access the consumers - // qos and filterin data. Returns 0 on success, -1 on failure. - - int disconnecting (void); - // Shutdown. - - ACE_ES_Dispatch_Request *push (ACE_ES_Consumer_Rep *consumer, - ACE_ES_Event_Container *event); - // Takes <event> and adds it to the correlation. Returns the - // dispatch request that should be forwarded. - - void suspend (void); - // Stop forwarding events to the calling consumer. - - void resume (void); - // Resume forwarding events to the calling consumer. - - ACE_ES_Correlation_Module *correlation_module_; - // Pointer back to the main correlation module. This is public so - // that ACE_ES_Consumer_Rep_Timeout::execute can access it. - - typedef ACE_CORBA_Sequence<ACE_ES_Event_Container_var> Event_Set; - -private: - virtual void disconnect_push_supplier (CORBA::Environment &); - // Called when the channel disconnects us. - - int allocate_correlation_resources (ACE_ES_Dependency_Iterator &iter); - // Dynamically allocates structures needed for correlations. 0 on - // success, -1 on failure. - - ACE_ES_Dispatch_Request * correlate (ACE_ES_Consumer_Rep *cr, - ACE_ES_Event_Container *event); - // Helper function for this->push. - - // = Registration helper functions. - int register_deadline_timeout (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int dgindex, - int &trep_index); - int register_interval_timeout (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int dgindex, - int &trep_index); - int register_event (RtecEventChannelAdmin::Dependency &dependency, - RtecEventComm::EventType group_type, - int cgindex, - int dgindex, - int &crep_index); - - ACE_ES_Consumer_Rep *get_consumer_rep (RtecEventChannelAdmin::Dependency &dependency, - int &crep_index); - int new_type_id (void); - - int type_id_index_; - - RtecEventChannelAdmin::ProxyPushConsumer_ptr channel_; - // For event forwarding. - - RtecEventChannelAdmin::SupplierQOS qos_; - // Supplier QOS specifications. - - // Events waiting to be forwarded. - Event_Set *pending_events_; - - // Used to synchronize pending_events_ and by the correlation module. - ACE_ES_MUTEX lock_; - // Used to lock shared state. - - ACE_Push_Consumer_Proxy *consumer_; - - u_long pending_flags_; - // A bit is set for each dependency satisfied. - - ACE_ES_Consumer_Rep **consumer_reps_; - // Array of consumer rep pointers. - int n_consumer_reps_; - ACE_ES_Consumer_Rep_Timeout *timer_reps_; - int n_timer_reps_; - - ACE_ES_Conjunction_Group *conjunction_groups_; - int n_conjunction_groups_; - ACE_ES_Disjunction_Group *disjunction_groups_; - int n_disjunction_groups_; - - int connected_; - // True when we're connected to the channel for forwarding. -}; - -// ************************************************************ - -class ACE_ES_ACT -// = TITLE -// Event Service ACT -// -// = DESCRIPTION -// -{ -public: - ACE_ES_ACT (void); - int has_act_; - RtecEventComm::Event act_; -}; - -// ************************************************************ - -// Forward declarations. -class ACE_ES_Dispatch_Request; - -class ACE_ES_Consumer_Module : public RtecEventChannelAdmin_ConsumerAdminBOAImpl -// = TITLE -// Event Service Consumer Module -// -// = DESCRIPTION -// ProxyPushSupplier factory. -{ -public: - ACE_ES_Consumer_Module (ACE_EventChannel *channel); - // Default construction. - - void open (ACE_ES_Dispatching_Module *down); - // Link to the next module. - - virtual RtecEventChannelAdmin::ProxyPushSupplier_ptr obtain_push_supplier (CORBA::Environment &); - // Factory method for push consumer proxies. - - void connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Register the consumer with the Event Service. This handles all - // the details regarding Correlation_Module and Subscription_Module. - - void disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Unregister the consumer from the Event Service. - - void push (const ACE_ES_Dispatch_Request *request, - CORBA::Environment &); - - RtecEventChannelAdmin::ConsumerAdmin_ptr get_ref (void); - // Allow transformations to RtecEventChannelAdmin::ConsumerAdmin. - - void shutdown_request (ACE_ES_Dispatch_Request *request); - // This is called by Shutdown_Consumer command objects when a - // consumer proxy is ready to be deleted. - - void shutdown (void); - // Actively disconnect from all consumers. - -private: - typedef ACE_Unbounded_Set_Iterator<ACE_Push_Consumer_Proxy *> Consumer_Iterator; - typedef ACE_Unbounded_Set<ACE_Push_Consumer_Proxy *> Consumers; - - ACE_ES_MUTEX lock_; - // Protects access to all_consumers_. - - Consumers all_consumers_; - - ACE_EventChannel *channel_; - // Used to test for shutdown. - - RtecEventChannelAdmin::ConsumerAdmin_ptr me_; - - ACE_ES_Dispatching_Module *down_; - // Next module down. -}; - -// ************************************************************ - -// Forward declaration. -class ACE_ES_Subscription_Module; - -class ACE_ES_Correlation_Module -// = TITLE -// Event Service Correlation Module -// -// = DESCRIPTION -// -{ -public: - ACE_ES_Correlation_Module (ACE_EventChannel *channel); - // Default construction. - - void open (ACE_ES_Dispatching_Module *up, - ACE_ES_Subscription_Module *down); - // Link to adjacent modules. - - void connected (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Create the consumers filter object. - - void disconnecting (ACE_Push_Consumer_Proxy *consumer, - CORBA::Environment &); - // Release the consumers filter object. - - void push (ACE_ES_Consumer_Rep *consumer, - ACE_ES_Event_Container *event, - CORBA::Environment &); - // Take in an event and its subscriber. Apply consumer-specific - // filters to each event and forward any dispatch requests to the - // Dispatching Module. - - // = These are called by ACE_ES_Consumer_Reps. - - int subscribe (ACE_ES_Consumer_Rep *consumer); - // Forwards to the subscription module. - - //int unsubscribe (ACE_ES_Consumer_Rep *consumer); - // Forwards to the subscription module. - - int schedule_timeout (ACE_ES_Consumer_Rep_Timeout *consumer); - // Schedule consumer timeout. Return 0 on success, -1 on failure. - - int cancel_timeout (ACE_ES_Consumer_Rep_Timeout *consumer); - // Cancel consumer timeout. Return 0 on success, -1 on failure. - - int reschedule_timeout (ACE_ES_Consumer_Rep_Timeout *consumer); - // Reschedule consumer timeout. Return 0 on success, -1 on failure. - - ACE_EventChannel *channel_; - // The master channel. This is public so that Consumer_Correlation - // objects can access it. - - void shutdown (void); - // Does nothing. - -private: - ACE_ES_Dispatching_Module *up_; - // Next module up. - - ACE_ES_Subscription_Module *subscription_module_; - // Next module down. -}; - -// ************************************************************ - -// Forward declaration. -class ACE_ES_Supplier_Module; -class ACE_Push_Supplier_Proxy; - -class ACE_ES_Subscription_Module -// = TITLE -// Event Service Subscription Module -// -// = DESCRIPTION -// -// = SYNCHRONIZATION -// This is currently implemented with very coarse-grain -// synchronization. Basically, there is a single readers/writer -// lock. All operations acquire the writer lock to change any -// subscription record. All operations acquire a reader lock to -// read any subscription record. This is fine for normal -// operations (which are *all* read operations). However, the -// initialization and shutdown periods might benefit from the -// potential increase in concurrency if we used finer grain locks -// (e.g., lock-per-source). -{ -public: - ACE_ES_Subscription_Module (ACE_EventChannel *channel); - // Default construction. - - void open (ACE_ES_Correlation_Module *up, - ACE_ES_Supplier_Module *down); - // Link to the adjacent modules. - - ~ACE_ES_Subscription_Module (void); - // Deletes the lock_. - - int subscribe (ACE_ES_Consumer_Rep *consumer); - // Register a new consumer. Calls into <consumer> to figure out the - // subscription options. Returns 0 on success, -1 on failure. - - int unsubscribe (ACE_ES_Consumer_Rep *consumer); - // Removes the -consumer- from any subscription lists. - - void connected (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &); - void disconnecting (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &); - - void push (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event, - CORBA::Environment &); - // Takes in a set of events and pushes subscriber sets to the - // Correlation Module. - - // void push (ACE_Push_Supplier_Proxy *source, - // const RtecEventComm::Event event); - // This doesn't need one of these since it will never be called. - - void shutdown (void); - // Unsubscribes all consumers from the suppliers. - -private: - void reregister_consumers (RtecEventComm::EventSourceID source_id); - // Reregister any consumers that registered for <source_id> before - // it actually connected to the channel. - - ACE_EventChannel *channel_; - // The channel of all channels. - - /* - typedef ACE_ES_Subscription_Info::Subscriber_Set INT; - typedef ACE_Null_Mutex SYNCH; - typedef ACE_Map_Manager<EXT, INT, SYNCH> Source_Collection; - typedef ACE_Map_Iterator<EXT, INT, SYNCH> Source_Collection_Iterator; - typedef ACE_Map_Entry<EXT, INT> Source_Collection_Entry; - Source_Collection source_subscription_info_; - // Source-only subscribers. - */ - - // = Subscribe helper methods. Returns 0 on success, -1 on failure. - - int subscribe_all (ACE_ES_Consumer_Rep *consumer); - - int subscribe_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type); - - int subscribe_source (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source); - - int subscribe_source_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source, - RtecEventComm::EventType type); - - int unsubscribe_all (ACE_ES_Consumer_Rep *consumer); - - int unsubscribe_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventType type); - - int unsubscribe_source (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source); - - int unsubscribe_source_type (ACE_ES_Consumer_Rep *consumer, - RtecEventComm::EventSourceID source, - RtecEventComm::EventType type); - - // = Push helper methods. - - int push_source (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event); - // Push <event> to all consumers subscribed to all events from - // <source>. Returns 0 on success, -1 on failure. - - int push_source_type (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event); - // Push <event> to all consumers subscribed to <event>.type_ from - // <source>. Returns 0 on success, -1 on failure. - - void push_all (ACE_ES_Event_Container *event, - CORBA::Environment &); - // Push <event> to all_suppliers_. - - ACE_ES_Correlation_Module *up_; - // Next module up stream. - - ACE_ES_Supplier_Module *down_; - // Next module down stream. - - typedef ACE_Unbounded_Set_Iterator<ACE_Push_Supplier_Proxy *> Supplier_Iterator; - typedef ACE_Unbounded_Set<ACE_Push_Supplier_Proxy *> Suppliers; - - Suppliers all_suppliers_; - // All suppliers. - - ACE_ES_Subscription_Info::Subscriber_Map type_subscribers_; - // Type-based subscribers. - - ACE_ES_Subscription_Info::SourceID_Map source_subscribers_; - // Source-based subscribers. - - ACE_ES_RW_LOCK lock_; - // Protects access to all_suppliers_ and type_suppliers_; -}; - -// ************************************************************ - -class ACE_ES_Supplier_Module : public RtecEventChannelAdmin_SupplierAdminBOAImpl -// = TITLE -// Event Service Supplier Proxy Module -// -// = DESCRIPTION -// ProxyPushConsumer factory. -{ -public: - ACE_ES_Supplier_Module (ACE_EventChannel *channel); - // Default construction. - - void open (ACE_ES_Subscription_Module *up); - // Associate the module to a channel. - - virtual RtecEventChannelAdmin::ProxyPushConsumer_ptr obtain_push_consumer (CORBA::Environment &); - // Factory method for push supplier proxies. - - void push (ACE_Push_Supplier_Proxy *proxy, - const RtecEventComm::EventSet &event, - CORBA::Environment &); - // The supplier module acts on behalf of the supplier proxy to - // forward events through the channel. - - void connected (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &); - // Register the consumer with the Event Service. This handles all - // the details regarding Correlation_Module and Subscription_Module. - - void disconnecting (ACE_Push_Supplier_Proxy *supplier, - CORBA::Environment &); - // Unregister the consumer from the Event Service. - - RtecEventChannelAdmin::SupplierAdmin_ptr get_ref (void); - // Allow transformations to RtecEventComm::PushConsumer. - - void shutdown (void); - // Actively disconnect from all suppliers. - -private: - typedef ACE_Unbounded_Set_Iterator<ACE_Push_Supplier_Proxy *> Supplier_Iterator; - typedef ACE_Unbounded_Set<ACE_Push_Supplier_Proxy *> Suppliers; - - Suppliers all_suppliers_; - // All suppliers. - - ACE_ES_MUTEX lock_; - // Protects access to all_suppliers_ and type_suppliers_; - - RtecEventChannelAdmin::SupplierAdmin_ptr me_; - - ACE_ES_Subscription_Module *up_; - - ACE_EventChannel *channel_; - // Used to test for shutdown. -}; - -// ************************************************************ - -// Forward declarations. -class ACE_EventChannel; - -// = Event Channel interfaces. - -class ACE_Push_Supplier_Proxy : public RtecEventChannelAdmin_ProxyPushConsumerBOAImpl -// = TITLE -// Push Supplier Proxy. -// -// = DESCRIPTION -// To the channel, this is a proxy to suppliers. To suppliers, it -// exports a PushConsumer interface. It is a -// RtecEventChannelAdmin::ProxyPushConsumer. Suppliers use this -// interface to connect to the channel, push events to consumers, -// and to disconnect from the channel. -{ -public: - ACE_Push_Supplier_Proxy (ACE_ES_Supplier_Module *supplier_module); - // Must be created with an owning supplier admin. - - // = Operations public to suppliers. - - virtual void connect_push_supplier (RtecEventComm::PushSupplier_ptr push_supplier, - const RtecEventChannelAdmin::SupplierQOS& qos, - CORBA::Environment &); - // Suppliers connect via this interface. <push_supplier> is a - // reference to the supplier. <qos> represents the publish types of - // the supplier. - - virtual void push (const RtecEventComm::EventSet &event, - CORBA::Environment &); - // Data arriving from a PushSupplier that must be sent to - // consumers. This is the entry point of all events. - - virtual void disconnect_push_consumer (CORBA::Environment &); - // Disconnect the supplier from the channel. - - // = Operations for the Event Channel. - - RtecEventChannelAdmin::ProxyPushConsumer_ptr get_ref (void); - // Allow transformations to RtecEventChannelAdmin::ProxyPushConsumer. - - int connected (void); - // Returns 1 if the proxy has been connected to a "remote" client. - - void shutdown (void); - // Actively disconnect from the supplier. - - // This is a hook so that the Subscription Module can associate - // state with supplier proxies. - ACE_ES_Subscription_Info &subscription_info (void); - - RtecEventChannelAdmin::SupplierQOS &qos (void); - // Filtering criteria. - - int operator== (const RtecEventComm::EventSourceID rhs); - // Is this object a proxy for -rhs-. Simple pointer comparison for now. - - RtecEventComm::EventSourceID source_id (void); - // Returns underlying supplier object ref. - -private: - RtecEventChannelAdmin::SupplierQOS qos_; - // Reference to the supplier's qos params. - - ACE_ES_Subscription_Info subscription_info_; - - ACE_ES_Supplier_Module *supplier_module_; - - RtecEventComm::EventSourceID source_id_; - // We keep a proxy of the Supplier source_id_; - - RtecEventChannelAdmin::ProxyPushConsumer_ptr me_; - // CORBA reference to self. - - RtecEventComm::PushSupplier_ptr push_supplier_; - // CORBA reference to remote push supplier. -}; - -// ************************************************************ - -class ACE_Push_Consumer_Proxy : public RtecEventChannelAdmin_ProxyPushSupplierBOAImpl -// = TITLE -// Push Consumer Proxy. -// -// = DESCRIPTION -// This is the channels proxy to a push consumer. It implements -// the RtecEventChannelAdmin::ProxyPushSupplier IDL interface. -// Consumers use this interface to connect and disconnect from the -// channel. -{ -public: - ACE_Push_Consumer_Proxy (ACE_ES_Consumer_Module *cm); - // Must be created with an consumer admin. - - virtual ~ACE_Push_Consumer_Proxy (void); - // Default destruction - - // = Interfaces exported to consumers. - - virtual void connect_push_consumer (RtecEventComm::PushConsumer_ptr push_consumer, - const RtecEventChannelAdmin::ConsumerQOS& qos, - CORBA::Environment &); - // A push consumer is connecting. <push_consumer> is a reference to - // the consumer. <qos> is the subscription types for the consumer. - - virtual void disconnect_push_supplier (CORBA::Environment &); - // The consumer is disconnecting. - - virtual void suspend (CORBA::Environment &); - // Stop forwarding events to the calling consumer. - - virtual void resume (CORBA::Environment &); - // Resume forwarding events to the calling consumer. - - // = Event Channel operations. - - void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // Push <events> to push_consumer_. - - int connected (void); - // Returns 1 if the proxy has been connected to a "remote" client. - - void shutdown (void); - // Actively disconnect from the consumer. - - RtecEventChannelAdmin::ProxyPushSupplier_ptr get_ref (void); - // Allow transformations to RtecEventChannelAdmin::ProxyPushSupplier. - - ACE_ES_Consumer_Correlation &correlation (void); - // Access the consumer-specific Consumer_Correlation. - - RtecEventChannelAdmin::ConsumerQOS &qos (void); - // Filtering criteria. - -private: - RtecEventChannelAdmin::ConsumerQOS qos_; - // A reference to the consumers Quality of Service parameters. - - ACE_ES_Consumer_Correlation correlation_; - // A hook so that the Correlation Module can associate correlation - // information with the consumer. - - RtecEventChannelAdmin::ProxyPushSupplier_ptr me_; - // CORBA reference to self. - - RtecEventComm::PushConsumer_ptr push_consumer_; - // Reference to our push consumer. - - ACE_ES_Consumer_Module *consumer_module_; - // TODO: Maybe this should be a _var or _duplicate/_release should - // be used -}; - -// ************************************************************ - -// Helper function that returns -// qos.dependencies_[0].rt_info_->entry_point or "no-name". -const char * -ACE_ES_Consumer_Name (const RtecEventChannelAdmin::ConsumerQOS &qos); - -// ************************************************************ - -typedef ACE_ES_Simple_Array <ACE_ES_Consumer_Rep *, - ACE_ES_MAX_CONSUMERS_PER_SUPPLIER> ACE_ES_CRSet; - -typedef ACE_ES_Array_Iterator <ACE_ES_Consumer_Rep *> ACE_ES_CRSet_Iterator; - -#if defined (__ACE_INLINE__) -#include "Event_Channel.i" -#endif /* __ACE_INLINE__ */ -#endif /* ACE_EVENT_CHANNEL_H */ - diff --git a/TAO/local/bin/Event_Service/Event_Channel.i b/TAO/local/bin/Event_Service/Event_Channel.i deleted file mode 100644 index 304a8e321d9..00000000000 --- a/TAO/local/bin/Event_Service/Event_Channel.i +++ /dev/null @@ -1,890 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -const unsigned int ACE_INT2BIT[32] = -{ - 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, - 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, - 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, - 268435456, 536870912, 1073741824, 2147483648, -}; - -// ************************************************** - -ACE_INLINE RtecEventChannelAdmin::ProxyPushConsumer_ptr -ACE_Push_Supplier_Proxy::get_ref (void) -{ - return RtecEventChannelAdmin::ProxyPushConsumer::_duplicate(me_); -} - -ACE_INLINE int -ACE_Push_Supplier_Proxy::connected (void) -{ - return !CORBA::is_nil((CORBA::Object*) push_supplier_); -} - -ACE_INLINE ACE_ES_Subscription_Info & -ACE_Push_Supplier_Proxy::subscription_info (void) -{ - return subscription_info_; -} - -ACE_INLINE RtecEventChannelAdmin::SupplierQOS & -ACE_Push_Supplier_Proxy::qos (void) -{ - return qos_; -} - -ACE_INLINE int -ACE_Push_Supplier_Proxy::operator== (const RtecEventComm::EventSourceID rhs) -{ - // Pointer comparison is fine for now. - return (source_id_ == rhs); -} - -ACE_INLINE RtecEventComm::EventSourceID -ACE_Push_Supplier_Proxy::source_id (void) -{ - return source_id_; -} - -// ************************************************** - -ACE_INLINE RtecEventChannelAdmin::ProxyPushSupplier_ptr -ACE_Push_Consumer_Proxy::get_ref (void) -{ - return RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(me_); -} - -ACE_INLINE RtecEventChannelAdmin::ConsumerQOS & -ACE_Push_Consumer_Proxy::qos (void) -{ - return qos_; -} - -ACE_INLINE int -ACE_Push_Consumer_Proxy::connected (void) -{ - return !CORBA::is_nil(push_consumer_); -} - -ACE_INLINE void -ACE_Push_Consumer_Proxy::push (const RtecEventComm::EventSet &events, - CORBA::Environment &_env) -{ - ACE_TIMEPROBE (" deliver event to consumer proxy"); - - if (push_consumer_ == 0) - { - ACE_DEBUG ((LM_DEBUG, "Push to disconnected consumer %s: ", - ::ACE_ES_Consumer_Name (this->qos ()))); - // ACE_ES_DEBUG_ST (::dump_sequence (events)); - return; - } - - ACE_TRY - { - push_consumer_->push (events, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCH (RtecEventComm::Disconnected, d) - { - ACE_ERROR ((LM_ERROR, "consumer disconnected.\n")); - ACE_RETHROW; - } - ACE_CATCH (CORBA::SystemException, se) - { - ACE_ERROR ((LM_ERROR, "system exception.\n")); - ACE_RETHROW; - } - ACE_ENDTRY; -} - -ACE_INLINE ACE_ES_Consumer_Correlation & -ACE_Push_Consumer_Proxy::correlation (void) -{ - return correlation_; -} - -ACE_INLINE RtecEventChannelAdmin::ConsumerAdmin_ptr -ACE_ES_Consumer_Module::get_ref (void) -{ - return RtecEventChannelAdmin::ConsumerAdmin::_duplicate(me_); -} - -ACE_INLINE RtecEventChannelAdmin::SupplierAdmin_ptr -ACE_ES_Supplier_Module::get_ref (void) -{ - return RtecEventChannelAdmin::SupplierAdmin::_duplicate(me_); -} - -// ************************************************** - -ACE_INLINE RtecEventChannelAdmin::EventChannel_ptr -ACE_EventChannel::get_ref (void) -{ - return RtecEventChannelAdmin::EventChannel::_duplicate(me_); -} - -ACE_INLINE RtecEventChannelAdmin::SupplierAdmin_ptr -ACE_EventChannel::for_suppliers (CORBA::Environment &) -{ - return supplier_module_->get_ref (); -} - -ACE_INLINE RtecEventChannelAdmin::ConsumerAdmin_ptr -ACE_EventChannel::for_consumers (CORBA::Environment &) -{ - return consumer_module_->get_ref (); -} - -ACE_INLINE ACE_ES_Priority_Timer * -ACE_EventChannel::timer (void) -{ - return timer_; -} - -// ************************************************************ - -// Makes a temporary Event_var and appends it to the <dest>. -ACE_INLINE void -operator += (ACE_CORBA_Sequence<ACE_ES_Event_Container_var> &dest, - ACE_ES_Event_Container *item) -{ - int length = dest.length (); - dest.length (length + 1); - dest[length] = item; -} - -/* -// Makes a temporary Event_var and appends it to the <dest>. -ACE_INLINE void -operator += (ACE_CORBA_Sequence<RtecEventComm::Event_var> &dest, - RtecEventComm::Event *item) -{ - // RtecEventComm::Event_var event (item); - int length = dest.length (); - dest.length (length + 1); - dest[length] = item; -} -*/ - -ACE_INLINE int -operator == (const RtecEventComm::Event &event1, - const RtecEventComm::Event &event2) -{ - // Check if the sources are equal. 0 is a wildcard. - if ((event1.source_ != 0) && (event2.source_ != 0) - && (event1.source_ != event2.source_)) - return 0; - - // Check if the types are equal. ACE_ES_EVENT_ANY is a wildcard. - if ((event1.type_ != ACE_ES_EVENT_ANY) && - (event2.type_ != ACE_ES_EVENT_ANY) && - (event1.type_ != event2.type_)) - return 0; - - return 1; -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_ACT::ACE_ES_ACT (void) - : has_act_ (0) -{ -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Disjunction_Group::ACE_ES_Disjunction_Group (void) : - act_ (), - deadline_timer_rep_ (0), - correlation_module_ (0) -{ -} - -ACE_INLINE void -ACE_ES_Disjunction_Group::set_correlation_module (ACE_ES_Correlation_Module *cm) -{ - correlation_module_ = cm; -} - -ACE_INLINE void -ACE_ES_Disjunction_Group::reschedule_deadline (void) -{ - if (deadline_timer_rep_ != 0) - { - if (correlation_module_->reschedule_timeout (deadline_timer_rep_) == -1) - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Disjunction_Group::reschedule_deadline")); - } -} - -ACE_INLINE int -ACE_ES_Disjunction_Group::set_deadline_timeout (ACE_ES_Consumer_Rep_Timeout *cr) -{ - deadline_timer_rep_ = cr; - // Schedule the timeout. - if (correlation_module_->schedule_timeout (deadline_timer_rep_) == -1) - return -1; - else - return 0; -} - -ACE_INLINE void -ACE_ES_Disjunction_Group::add_events (Event_Set *outbox, - Event_Set *pending_events, - u_long &pending_flags) -{ - ACE_UNUSED_ARG (pending_events); - ACE_UNUSED_ARG (pending_flags); - - // Append the act. - if (act_ != 0) - *outbox += act_; -} - -ACE_INLINE void -ACE_ES_Disjunction_Group::set_act (RtecEventComm::Event &act) -{ - ACE_ES_Event_Container *temp = new ACE_ES_Event_Container (act); - if (temp == 0) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Disjunction_Group::set_act")); - return; - } - - act_ = temp; - temp->_release (); -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Consumer_Rep::ACE_ES_Consumer_Rep (void) : - disconnected_ (0), - suspended_ (0), - correlation_type_ (ACE_ES_Consumer_Rep::NO_CORRELATION), - dependency_ (0), - correlation_ (0), - type_id_ (0), - disjunction_group_ (0), - ref_count_ (1) -{ -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::init (ACE_ES_Consumer_Correlation *correlation, - RtecEventChannelAdmin::Dependency& dependency) -{ - dependency_ = &dependency; - correlation_ = correlation; -} - -ACE_INLINE RtecEventChannelAdmin::Dependency* -ACE_ES_Consumer_Rep::dependency (void) -{ - return dependency_; -} - -ACE_INLINE int -ACE_ES_Consumer_Rep::type_id (void) -{ - return type_id_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::type_id (int id) -{ - type_id_ = id; -} - -ACE_INLINE ACE_ES_Consumer_Correlation * -ACE_ES_Consumer_Rep::correlation (void) -{ - return correlation_; -} - -ACE_INLINE u_long -ACE_ES_Consumer_Rep::correlation_type (void) -{ - return correlation_type_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::correlation_type (u_long ct) -{ - correlation_type_ = ct; -} - -ACE_INLINE int -ACE_ES_Consumer_Rep::add_disjunction_group (ACE_ES_Disjunction_Group &dg) -{ - if (disjunction_group_ != 0) - ACE_ERROR ((LM_ERROR, "ACE_ES_Consumer_Rep::add_disjunction_group: " - "disjunction_group already set!\n")); - disjunction_group_ = &dg; - return 0; -} - -ACE_INLINE ACE_ES_Disjunction_Group * -ACE_ES_Consumer_Rep::top_group (void) -{ - return disjunction_group_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::reschedule_deadlines (void) -{ - if (disjunction_group_ != 0) - disjunction_group_->reschedule_deadline (); -} - -ACE_INLINE int -ACE_ES_Consumer_Rep::receiving_events (void) -{ - return suspended_ == 0 && disconnected_ == 0; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::suspend (void) -{ - suspended_ = 1; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::resume (void) -{ - suspended_ = 0; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::_duplicate (void) -{ - // This is atomic. - ref_count_++; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::_release (void) -{ - // This is atomic. rc is because we want to avoid Atomic_Op's - // operator==. Don't change this code unless you think you're more - // studly than ACE_Atomic_Op. - int rc = --ref_count_; - - if (rc == 0) - delete this; -} - -ACE_INLINE int -ACE_ES_Consumer_Rep::disconnected (void) -{ - return disconnected_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep::disconnect (void) -{ - disconnected_ = 1; -} - -// ************************************************************ - -// Forward <events> to all consumers subscribed to <source> only. -ACE_INLINE int -ACE_ES_Subscription_Module::push_source (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event) -{ - ACE_TIMEPROBE (" enter ACE_ES_Subscription_Module::push"); - // If there are now source-based subscribers for this supplier, - // return. - if (source->subscription_info ().source_subscribers_.size () == 0) - return 0; - - ACE_ES_Subscription_Info::Subscriber_Set &set = - source->subscription_info ().source_subscribers_; - - // List of consumers that need to be disconnected. - ACE_ES_CRSet disconnect_list; - - { - // Acquire a read lock. - ACE_ES_RGUARD ace_mon (source->subscription_info ().lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscription_Module::push_source.\n"), -1); - - ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (set); - - ACE_TRY - { - // Iterate through all subscribers. - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - { - // Only push the event if the consumer is not suspended - // and not disconnected. - if ((*consumer)->receiving_events ()) - { - up_->push (*consumer, event, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - // If the consumer has disconnected, schedule it for - // disconnection. We can not modify our list now. It - // would mess up the iterator. - if ((*consumer)->disconnected ()) - disconnect_list.insert (*consumer); - } - } - ACE_CATCHANY - { - return -1; - } - ACE_ENDTRY; - - // Release the read lock. - } - - // If there are consumers scheduled for disconnect, acquire a write - // lock and disconnect them. - if (disconnect_list.size () != 0) - { - ACE_ES_WGUARD ace_mon (source->subscription_info ().lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscription_Module::push_source.\n"), -1); - - ACE_ES_CRSet_Iterator iter (disconnect_list.data (), disconnect_list.size ()); - - // Iterate through the disconnecting consumers. - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - { - // Remove the consumer from subscriber list. - if (set.remove (*consumer) == -1) - ACE_ERROR ((LM_ERROR, "%p remove failed.\n", - "ACE_ES_Subscription_Module::push_source.\n")); - else - // Decrement the consumer rep's reference count. - (*consumer)->_release (); - } - } - - return 0; -} - -// 1. figure out why we're going through the subscription module, -// instead of just passing through. -// 2. where is lock_? Is there only one per module!? - -ACE_INLINE int -ACE_ES_Subscription_Module::push_source_type (ACE_Push_Supplier_Proxy *source, - ACE_ES_Event_Container *event) -{ - // Step through each event in the set. For each event type, find - // the corresponding set in the type collection. Push the single - // event to each consumer in the set. - - ACE_ES_Subscription_Info::Subscriber_Map &supplier_map = - source->subscription_info ().type_subscribers_; - - ACE_ES_CRSet disconnect_list; - - ACE_ES_Subscription_Info::Subscriber_Set *set; - - { - ACE_ES_RGUARD ace_mon (source->subscription_info ().lock_); - if (ace_mon.locked () == 0) - { - ACE_TIMEPROBE (" push_source_type"); - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscription_Module::push_source_type.\n"), -1); - } - - ACE_ES_Subscription_Info::Type_Subscribers *subscribers; - - if (supplier_map.current_size () == 0) - { - ACE_TIMEPROBE (" push_source_type"); - return 0; - } - - if (supplier_map.find (event->type_, subscribers) == -1) - { - ACE_DEBUG ((LM_ERROR, "ACE_ES_Subscription_Module::push_source_type" - " Warning: event type %d not registered.\n", event->type_)); - ACE_TIMEPROBE (" push_source_type"); - return 0; // continue anyway - } - - if (subscribers->consumers_.size () == 0) - { - ACE_TIMEPROBE (" push_source_type"); - return 0; - } - - set = &subscribers->consumers_; - - // We've found the set of consumers subscribed to this type - // of event from this supplier. Forward the event to each. - ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (*set); - - ACE_TRY - { - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - { - if ((*consumer)->receiving_events ()) - { - up_->push (*consumer, event, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - if ((*consumer)->disconnected ()) - disconnect_list.insert (*consumer); - } - } - ACE_CATCHANY - { - ACE_TIMEPROBE (" push_source_type"); - return -1; - } - ACE_ENDTRY; - } - - if (disconnect_list.size () != 0) - // Acquire a write lock and remove all disconnected consumers. - { - ACE_ES_WGUARD ace_mon (source->subscription_info ().lock_); - if (ace_mon.locked () == 0) - ACE_ERROR_RETURN ((LM_ERROR, "ACE_ES_Subscription_Module::push_source.\n"), -1); - - ACE_ES_CRSet_Iterator iter (disconnect_list.data (), disconnect_list.size ()); - - for (ACE_ES_Consumer_Rep **consumer = 0; - iter.next (consumer) != 0; - iter.advance ()) - { - if (set->remove (*consumer) == -1) - ACE_ERROR ((LM_ERROR, "%p remove failed.\n", - "ACE_ES_Subscription_Module::push_source.\n")); - else - (*consumer)->_release (); - } - } - - ACE_TIMEPROBE (" push_source_type"); - return 0; -} - -// ************************************************************ - -ACE_INLINE ACE_RTU_Manager * -ACE_EventChannel::rtu_manager (void) -{ - return rtu_manager_; -} - -ACE_INLINE -ACE_RTU_Manager::ACE_RTU_Manager (int active) - : active_ (active), - should_preempt_ (0), - not_done_ (0), - priority_ (ACE_Scheduler_MIN_PREEMPTION_PRIORITY) -{ -} - -ACE_INLINE int -ACE_RTU_Manager::should_preempt (void) -{ - if (!active_) - return 0; - else - { - // Expire any timers. Am I evil for putting this here? - ACE_Time_Value tv; - if (ACE_Task_Manager::instance ()-> - GetReactorTask (0)->get_reactor ().handle_events (&tv) == -1) - ACE_ERROR ((LM_ERROR, "%p.\n", - "ACE_RTU_Manager::should_preempt")); - - int should_preempt = should_preempt_; - should_preempt_ = 0; - return should_preempt; - } -} - -ACE_INLINE void -ACE_RTU_Manager::should_preempt (int s) -{ - should_preempt_ = s; -} - -ACE_INLINE int -ACE_RTU_Manager::not_done (void) -{ - int not_done = not_done_; - not_done_ = 0; - return not_done; -} - -ACE_INLINE void -ACE_RTU_Manager::not_done (int nd) -{ - not_done_ = nd; -} - -ACE_INLINE RtecScheduler::OS_Priority -ACE_RTU_Manager::priority (void) -{ - return priority_; -} - -ACE_INLINE void -ACE_RTU_Manager::priority (RtecScheduler::OS_Priority p) -{ - priority_ = p; -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Consumer_Rep_Timeout::ACE_ES_Consumer_Rep_Timeout (void) : - timer_id_ (0), - preemption_priority_ (ACE_Scheduler_MIN_PREEMPTION_PRIORITY), - timeout_event_ () -{ -} - -ACE_INLINE void -ACE_ES_Consumer_Rep_Timeout::init (ACE_ES_Consumer_Correlation *correlation, - RtecEventChannelAdmin::Dependency &dep) -{ - ACE_ES_Event_Container *temp = new ACE_ES_Event_Container (dep.event_); - if (temp == 0) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Rep_Timeout::init")); - return; - } - - timeout_event_ = temp; - temp->_release (); - - ACE_ES_Consumer_Rep::init (correlation, dep); -} - -ACE_INLINE int -ACE_ES_Consumer_Rep_Timeout::timer_id (void) -{ - return timer_id_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep_Timeout::timer_id (int id) -{ - timer_id_ = id; -} - -ACE_INLINE RtecScheduler::OS_Priority -ACE_ES_Consumer_Rep_Timeout::preemption_priority (void) -{ - return preemption_priority_; -} - -ACE_INLINE void -ACE_ES_Consumer_Rep_Timeout::preemption_priority (RtecScheduler::OS_Priority p) -{ - preemption_priority_ = p; -} - -// ************************************************************ - -ACE_INLINE void -ACE_ES_Consumer_Correlation::suspend (void) -{ - for (int x=0; x < n_timer_reps_; x++) - timer_reps_[x].suspend (); - - for (int y=0; y < n_consumer_reps_; y++) - consumer_reps_[y]->suspend (); -} - -ACE_INLINE void -ACE_ES_Consumer_Correlation::resume (void) -{ - for (int x=0; x < n_timer_reps_; x++) - timer_reps_[x].resume (); - - for (int y=0; y < n_consumer_reps_; y++) - consumer_reps_[y]->resume (); -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Dependency_Iterator::ACE_ES_Dependency_Iterator (RtecEventChannelAdmin::DependencySet &rep) : - rt_info_ (0), - rep_ (rep), - index_ (-1), - n_conjunctions_ (0), - n_disjunctions_ (0), - n_timeouts_ (0), - n_events_ (0) -{ -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::advance_dependency (void) -{ - index_++; - if ((CORBA::ULong) index_ >= rep_.length ()) - return -1; - else - return 0; -} - -ACE_INLINE RtecEventChannelAdmin::Dependency & -ACE_ES_Dependency_Iterator::operator *(void) -{ - return rep_[index_]; -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::parse (void) -{ - for (CORBA::ULong x = 0; x < rep_.length (); x++) - { - if (rt_info_ == 0) - rt_info_ = rep_[x].rt_info; - - switch (rep_[x].event_.type_) - { - case ACE_ES_CONJUNCTION_DESIGNATOR: - n_conjunctions_++; - break; - - case ACE_ES_DISJUNCTION_DESIGNATOR: - n_disjunctions_++; - break; - - case ACE_ES_EVENT_TIMEOUT: - case ACE_ES_EVENT_INTERVAL_TIMEOUT: - case ACE_ES_EVENT_DEADLINE_TIMEOUT: - n_timeouts_++; - break; - - default: - n_events_++; - break; - } - } - - return 0; -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::n_conjunctions (void) -{ - return n_conjunctions_; -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::n_disjunctions (void) -{ - return n_disjunctions_; -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::n_timeouts (void) -{ - return n_timeouts_; -} - -ACE_INLINE int -ACE_ES_Dependency_Iterator::n_events (void) -{ - return n_events_; -} - -ACE_INLINE RtecScheduler::handle_t -ACE_ES_Dependency_Iterator::first_rt_info (void) -{ - return rt_info_; -} - -// ************************************************************ - -ACE_INLINE -ACE_ES_Conjunction_Group::ACE_ES_Conjunction_Group (void) : - forward_value_ (0) -{ -} - -ACE_INLINE int -ACE_ES_Conjunction_Group::add_type (int type_id) -{ - ACE_SET_BITS (forward_value_, ACE_INT2BIT[type_id]); - return 0; -} - -/* - // Set length bits. - for (int x=0; x < length; x++) - { - forward_value_ <<= 1; - forward_value_ |= 1; - } - */ - -ACE_INLINE int -ACE_ES_Conjunction_Group::should_forward (u_long pending_flags) -{ - if ((forward_value_ & pending_flags) == forward_value_) - return 1; - else - return 0; -} - -ACE_INLINE void -ACE_ES_Conjunction_Group::add_events (Event_Set *outbox, - Event_Set *pending_events, - u_long &pending_flags) -{ - // Append the act first. - if (act_ != 0) - *outbox += act_; - - u_long fv = forward_value_; - int x = 0; - while (fv > 0) - { - // If this type_id is part of the correlation, then append each - // event pending to the outbox. - if (ACE_BIT_ENABLED (forward_value_, ACE_INT2BIT[x])) - { - // Step through each of the pending events. - Event_Set &pending = pending_events[x]; - for (CORBA::ULong y=0; y < pending.length (); y++) - { - // Add the pending event to the outbox. - if (outbox != 0) - *outbox += pending[y]; - // Remove the event from the pending events array. - pending[y] = 0; - } - - // Reset the array length. - pending.length (0); - // Since we just emptied the events for this type, clear the - // x^th bit in pending flags. - ACE_CLR_BITS (pending_flags, ACE_INT2BIT[x]); - // Clear the x^th bit in fv. - ACE_CLR_BITS (fv, ACE_INT2BIT[x]); - } - - x++; - } -} - -// ************************************************************ diff --git a/TAO/local/bin/Event_Service/Event_Service.cpp b/TAO/local/bin/Event_Service/Event_Service.cpp deleted file mode 100644 index 7e58a65ea7a..00000000000 --- a/TAO/local/bin/Event_Service/Event_Service.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// -// $Id$ -// - -#include "ace/Get_Opt.h" -#include "tao/corba.h" - -#include "CosNamingC.h" -#include "Scheduler_Factory.h" -#include "Event_Channel.h" -#include "Event_Utilities.h" - - - -int main (int argc, char *argv[]) -{ - ACE_TRY - { - // Initialize ORB. - CORBA::ORB_ptr orb = - CORBA::ORB_init (argc, argv, "internet", ACE_TRY_ENV); - ACE_CHECK_ENV; - - CORBA::POA_ptr poa = - orb->POA_init(argc, argv, "POA"); - if (poa == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to initialize the POA.\n"), - 1); - } - - CORBA::Object_ptr objref = - orb->resolve_initial_references ("NameService"); - ACE_CHECK_ENV; - - CosNaming::NamingContext_var naming_context = - CosNaming::NamingContext::_narrow (objref, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_DEBUG ((LM_DEBUG, "got reference to NameService\n")); - - ACE_Scheduler_Factory::use_config (naming_context.ptr ()); - - // Register Event_Service with Naming Service. - ACE_EventChannel* ec; - ACE_NEW_RETURN (ec, ACE_EventChannel, -1); - CORBA::Object::_duplicate(ec); - ACE_CHECK_ENV; - - CORBA::String str = - orb->object_to_string (ec, ACE_TRY_ENV); - ACE_OS::puts ((char *) str); - - CosNaming::Name channel_name (1); - channel_name[0].id = CORBA::string_dup ("EventService"); - channel_name.length (1); - naming_context->bind (channel_name, ec, ACE_TRY_ENV); - ACE_CHECK_ENV; - - orb->run (); - - CORBA::release (ec); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_TRY_ENV.print_exception ("EC"); - } - ACE_ENDTRY; - - - return 0; -} diff --git a/TAO/local/bin/Event_Service/Fast_Reactor.h b/TAO/local/bin/Event_Service/Fast_Reactor.h deleted file mode 100644 index d8af39b4f1d..00000000000 --- a/TAO/local/bin/Event_Service/Fast_Reactor.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// $Id$ -// -#if !defined (FAST_REACTOR_H) -#define FAST_REACTOR_H - -#if defined (ACE_OLD_STYLE_REACTOR) -# if defined (ACE_WIN32) -# include "ace/ReactorEx.h" -# define ACE_ES_FAST_REACTOR_BASE ACE_ReactorEx -# else -# include "ace/Reactor.h" -# define ACE_ES_FAST_REACTOR_BASE ACE_Reactor -# endif /* ACE_WIN32 */ -#else -# if defined (ACE_WIN32) -# include "ace/WFMO_Reactor.h" -# define ACE_ES_FAST_REACTOR_BASE ACE_WFMO_Reactor -# else -# include "ace/Select_Reactor.h" -# define ACE_ES_FAST_REACTOR_BASE ACE_Select_Reactor -# endif /* ACE_WIN32 */ -#endif /* ACE_OLD_STYLE_REACTOR */ -//## end module.includes - -class ACE_ES_Fast_Reactor : public ACE_ES_FAST_REACTOR_BASE -{ -public: - virtual int handle_events (ACE_Time_Value *max_wait_time = 0) - { - ACE_Time_Value timer_buf (0) ; - ACE_Time_Value *this_timeout = &timer_buf ; - - if (this->timer_queue_->calculate_timeout (max_wait_time, - this_timeout) == 0) - { - ACE_Time_Value t (0, 500000); - ACE_OS::select (0, 0, 0, 0, &t); - } - else - { - ACE_OS::select (0, 0, 0, 0, this_timeout); - } - - return this->timer_queue_->expire () == -1 ? -1 : 0; - } -}; - -#endif /* FAST_REACTOR_H */ diff --git a/TAO/local/bin/Event_Service/GPlot_File.cpp b/TAO/local/bin/Event_Service/GPlot_File.cpp deleted file mode 100644 index 2f985e5d47c..00000000000 --- a/TAO/local/bin/Event_Service/GPlot_File.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = FILENAME -// GPlot_File.cpp -// -// = AUTHOR -// Tim Harrison -// -// ============================================================================ - -#include "GPlot_File.h" - -#if !defined (__ACE_INLINE__) -#include "GPlot_File.i" -#endif /* __ACE_INLINE__ */ - -int -ACE_GPlot_File::open (const char *filename) -{ - ACE_OS::strcpy (filename_, filename); - - FILE *read_file = ACE_OS::fopen (filename_, "r"); - - long entry; - char *value; - ACE_NEW_RETURN (value, char [32], -1); - - if (read_file > 0) - { - int result; - do - { - result = fscanf (read_file, - "%ld\t%s\n", - &entry, - value); - - //if ((result == -1) && (ACE_OS::last_error () != 0)) - //ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_GPlot_File::open"), -1); - - if (result > 0) - // Success. - map_.bind (entry, value); - else if (result != EOF) - // Error. - { - ACE_OS::fclose (read_file); - ACE_ERROR_RETURN - ((LM_ERROR, "Error reading GPlot file %s.\n", filename_), -1); - } - } while (result != EOF); - - fclose (read_file); - } - - write_file_ = ACE_OS::fopen (filename_, "w"); - if (write_file_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p: can't open\n", filename_), -1); - - closed_ = 0; - - return 0; -} - - -void -ACE_GPlot_File::close (void) -{ - if (closed_ == 0) - { - closed_ = 1; - GPLOT_ITERATOR iterator ((GPLOT_MAP &) map_); - for (GPLOT_ENTRY *entry; iterator.next (entry); iterator.advance ()) - { - ACE_OS::fprintf (write_file_, "%ld\t%s\n", - entry->ext_id_, entry->int_id_); - delete [] entry->int_id_; - } - - ACE_OS::fclose (write_file_); - } -} - - -void -ACE_GPlot_File::dump (void) -{ - GPLOT_ITERATOR iterator ((GPLOT_MAP &) map_); - for (GPLOT_ENTRY *entry; iterator.next (entry); iterator.advance ()) - { - if (entry->int_id_ != 0) - ACE_DEBUG ((LM_DEBUG, "%d\t%s\n", entry->ext_id_, entry->int_id_)); - else - { - ACE_ERROR ((LM_ERROR, "Value for entry %d is null.\n", - entry->ext_id_)); - return; - } - } -} - - -int -ACE_GPlot_File::get (long entry, long &value) -{ - char *val; - - if (map_.find (entry, val) == -1) - return -1; - else - { - ::sscanf (val, "%ld", &value); - return 0; - } -} - - -int -ACE_GPlot_File::get (long entry, float &value) -{ - char *val; - - if (map_.find (entry, val) == -1) - return -1; - else - { - ::sscanf (val, "%f", &value); - return 0; - } -} - - -void -ACE_GPlot_File::set (long entry, long value) -{ - long old_entry; - char *val; - char *old_value; - - ACE_NEW (val, char [32]); - - ::sprintf (val, "%ld", value); - map_.rebind (entry, val, old_entry, old_value); - - delete [] old_value; -} - - -void -ACE_GPlot_File::set (long entry, float value) -{ - long old_entry; - char *val; - char *old_value; - - ACE_NEW (val, char [32]); - - ::sprintf (val, "%f", value); - map_.rebind (entry, val, old_entry, old_value); - - delete [] old_value; -} - - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Map_Entry<long, char *>; -template class ACE_Map_Iterator<long, char *, ACE_Null_Mutex>; -template class ACE_Map_Manager<long, char *, ACE_Null_Mutex>; -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/bin/Event_Service/GPlot_File.h b/TAO/local/bin/Event_Service/GPlot_File.h deleted file mode 100644 index dc6040d0ed7..00000000000 --- a/TAO/local/bin/Event_Service/GPlot_File.h +++ /dev/null @@ -1,96 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = FILENAME -// GPlot_File.h -// -// = AUTHOR -// Tim Harrison -// -// ============================================================================ - -#if !defined (ACE_GPlot_File_H) -#define ACE_GPlot_File_H - -#include "ace/Map_Manager.h" -#include "ace/Synch.h" - -class ACE_GPlot_File -// = TITLE -// Reads and writes files in GPlot format. -// -// = DESCRIPTION -// Gplot formats are as follows: -// entry value -// entry value -// entry value -// ... -// They represent x,y pairs to be graphed by GPlot. entry's are -// type long. value's are type long or float. -{ -public: - ACE_GPlot_File (void); - // Construction. - - ~ACE_GPlot_File (void); - // Destruction. Calls this->close. - - int open (const char *filename); - // If the file does not exist, create it. If the file exists open - // the file and read all the entries into map_. Returns 0 on - // success, -1 on failure. - - void close (void); - // Close the file and sync all the contents. - - int get (long entry, long &value); - // Get the entry at this value. Returns 0 if a value was found. - // Returns -1 if no value has been set for <entry>. - - int get (long entry, float &value); - // Get the entry at this value. Returns 0 if a value was found. - // Returns -1 if no value has been set for <entry>. - - void set (long entry, long value); - // Set the entry at this value. - - void set (long entry, float value); - // Set the entry at this value. - - void set_greatest (long entry, long value); - // Compare <value> with the value at <entry>. Store the largest. - - void set_greatest (long entry, float value); - // Compare <value> with the value at <entry>. Store the largest. - - void set_least (long entry, long value); - // Compare <value> with the value at <entry>. Store the smallest. - - void set_least (long entry, float value); - // Compare <value> with the value at <entry>. Store the smallest. - - void dump (void); - // Dump state of the object. - -private: - // = map_ stores all values. It is sync'ed to file when this->close - // is called. - typedef ACE_Map_Entry <long, char *> GPLOT_ENTRY; - typedef ACE_Map_Iterator <long, char *, ACE_Null_Mutex> GPLOT_ITERATOR; - typedef ACE_Map_Manager<long, char *, ACE_Null_Mutex> GPLOT_MAP; - GPLOT_MAP map_; - - char filename_[BUFSIZ]; - FILE *write_file_; - - int closed_; - // Only close once. -}; - -#if defined (__ACE_INLINE__) -#include "GPlot_File.i" -#endif /* __ACE_INLINE__ */ - - -#endif /* ACE_GPlot_File_H */ diff --git a/TAO/local/bin/Event_Service/GPlot_File.i b/TAO/local/bin/Event_Service/GPlot_File.i deleted file mode 100644 index ab9f235dc39..00000000000 --- a/TAO/local/bin/Event_Service/GPlot_File.i +++ /dev/null @@ -1,70 +0,0 @@ -// $Id$ - -ACE_INLINE -ACE_GPlot_File::ACE_GPlot_File (void) - : closed_ (1) -{ -} - - -ACE_INLINE -ACE_GPlot_File::~ACE_GPlot_File (void) -{ - this->close (); -} - - -ACE_INLINE -void -ACE_GPlot_File::set_greatest (long entry, long value) -{ - long old_value; - - // If there was no previous value, or the <value> is greater than - // the previous value, set a new value. - if (this->get (entry, old_value) == -1 || - value > old_value) - this->set (entry, value); -} - - -ACE_INLINE -void -ACE_GPlot_File::set_greatest (long entry, float value) -{ - float old_value; - - // If there was no previous value, or the <value> is greater than - // the previous value, set a new value. - if (this->get (entry, old_value) == -1 || - value > old_value) - this->set (entry, value); -} - - -ACE_INLINE -void -ACE_GPlot_File::set_least (long entry, long value) -{ - long old_value; - - // If there was no previous value, or the <value> is less than - // the previous value, set a new value. - if (this->get (entry, old_value) == -1 || - value < old_value) - this->set (entry, value); -} - - -ACE_INLINE -void -ACE_GPlot_File::set_least (long entry, float value) -{ - float old_value; - - // If there was no previous value, or the <value> is less than - // the previous value, set a new value. - if (this->get (entry, old_value) == -1 || - value < old_value) - this->set (entry, value); -} diff --git a/TAO/local/bin/Event_Service/Local_ESTypes.cpp b/TAO/local/bin/Event_Service/Local_ESTypes.cpp deleted file mode 100644 index ebfd367dc9a..00000000000 --- a/TAO/local/bin/Event_Service/Local_ESTypes.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// $Id$ -// - -#include "Local_ESTypes.h" - -#if !defined (__ACE_INLINE__) -#include "Local_ESTypes.i" -#endif /* __ACE_INLINE__ */ diff --git a/TAO/local/bin/Event_Service/Local_ESTypes.h b/TAO/local/bin/Event_Service/Local_ESTypes.h deleted file mode 100644 index 3acea23d8d7..00000000000 --- a/TAO/local/bin/Event_Service/Local_ESTypes.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ORB Services -// -// = FILENAME -// Local_ESTypes.h -// -// = AUTHOR -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// Manual types that would otherwise be defined/implemented via an -// IDL compiler. -// NOTE: the file is obsolecent, we have TAO now, but we keep it -// to speed up the porting. -// -// ============================================================================ - -#ifndef ACE_LOCAL_ESTYPES_H -#define ACE_LOCAL_ESTYPES_H - -#include <tao/corba.h> - -#include "Event_Service_Constants.h" - -#include "CosNamingC.h" -#include "RtecSchedulerC.h" -#include "RtecSchedulerS.h" -#include "RtecEventCommC.h" -#include "RtecEventCommS.h" -#include "RtecEventChannelAdminC.h" -#include "RtecEventChannelAdminS.h" - -#define ACE_DEFAULT_EVENT_CHANNEL_TYPE 0 - -// These are to help MSVC++ 4.2 deal with inheritence of nested types. -// Not needed for Sun C++ or MSVC++ 5.0. - -// @@ NOTE: TAO uses the POA mapping instead of the old BOA, but all the -// code still uses the BOA name for the skeleton classes, to speed up -// porting we keep to old names. - -typedef RtecEventComm::Event RtecEventComm_Event; -typedef POA_RtecScheduler::Scheduler RtecScheduler_SchedulerBOAImpl; -typedef POA_RtecEventChannelAdmin::EventChannel RtecEventChannelAdmin_EventChannelBOAImpl; -typedef POA_RtecEventComm::PushSupplier RtecEventComm_PushSupplierBOAImpl; -typedef POA_RtecEventChannelAdmin::ConsumerAdmin RtecEventChannelAdmin_ConsumerAdminBOAImpl; -typedef POA_RtecEventChannelAdmin::SupplierAdmin RtecEventChannelAdmin_SupplierAdminBOAImpl; -typedef POA_RtecEventChannelAdmin::ProxyPushConsumer RtecEventChannelAdmin_ProxyPushConsumerBOAImpl; -typedef POA_RtecEventChannelAdmin::ProxyPushSupplier RtecEventChannelAdmin_ProxyPushSupplierBOAImpl; -typedef POA_RtecEventComm::PushConsumer RtecEventComm_PushConsumerBOAImpl; -typedef POA_RtecEventComm::PushSupplier RtecEventComm_PushSupplierBOAImpl; - -#if defined (__ACE_INLINE__) -#include "Local_ESTypes.i" -#endif /* __ACE_INLINE__ */ - -#endif /* ACE_LOCAL_ESTYPES_H */ diff --git a/TAO/local/bin/Event_Service/Local_ESTypes.i b/TAO/local/bin/Event_Service/Local_ESTypes.i deleted file mode 100644 index 8f8ef4cfe2d..00000000000 --- a/TAO/local/bin/Event_Service/Local_ESTypes.i +++ /dev/null @@ -1,5 +0,0 @@ -/* -*- C++ -*- */ -// -// $Id$ -// - diff --git a/TAO/local/bin/Event_Service/Makefile b/TAO/local/bin/Event_Service/Makefile deleted file mode 100644 index 443ce8d62ef..00000000000 --- a/TAO/local/bin/Event_Service/Makefile +++ /dev/null @@ -1,1229 +0,0 @@ -# -# $Id$ -# - -BIN = Event_Service -BUILD = $(BIN) - -LSRC = \ - Event_Service.cpp \ - BCU.cpp \ - CORBA_Utils_T.cpp \ - Dispatching_Modules.cpp \ - Event_Channel.cpp \ - GPlot_File.cpp \ - Local_ESTypes.cpp \ - Memory_Pools.cpp \ - RT_Task.cpp \ - ReactorTask.cpp \ - Task_Manager.cpp \ - -ES_OBJS=$(LSRC:.cpp=.o) - -LDLIBS = -lorbsvcs -lTAO - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(ACE_ROOT)/include/makeinclude/macros.GNU -include $(ACE_ROOT)/include/makeinclude/rules.common.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU -#include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU -include $(ACE_ROOT)/include/makeinclude/rules.local.GNU - -ifndef TAO_ROOT -TAO_ROOT = $(ACE_ROOT)/TAO -endif -TSS_ORB_FLAG = #-DTAO_HAS_TSS_ORBCORE -DCFLAGS = -g -LDFLAGS += -L$(TAO_ROOT)/orbsvcs/lib -L$(TAO_ROOT)/tao -CPPFLAGS += -I$(TAO_ROOT)/orbsvcs/lib -I$(TAO_ROOT) -I$(TAO_ROOT)/tao/compat $(TSS_ORB_FLAG)#-H - -ifeq ($(probe),1) - CCFLAGS += -DACE_ENABLE_TIMEPROBES -endif # probe - - -Event_Service: $(addprefix $(VDIR),$(ES_OBJS)) - $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/Event_Service.o .shobj/Event_Service.: Event_Service.cpp \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i \ - Event_Channel.h \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i CORBA_Utils_T.h CORBA_Utils_T.i Task_Manager.h \ - RT_Task.h RT_Task.i Task_Manager.i ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Event_Channel.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.i -.obj/BCU.o .shobj/BCU.: BCU.cpp BCU.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i -.obj/CORBA_Utils_T.o .shobj/CORBA_Utils_T.: CORBA_Utils_T.cpp CORBA_Utils_T.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - CORBA_Utils_T.i -.obj/Dispatching_Modules.o .shobj/Dispatching_Modules.: Dispatching_Modules.cpp \ - $(ACE_ROOT)/ace/Sched_Params.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Sched_Params.i \ - Memory_Pools.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - Event_Channel.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i CORBA_Utils_T.h CORBA_Utils_T.i Task_Manager.h \ - RT_Task.h RT_Task.i Task_Manager.i ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Event_Channel.i Dispatching_Modules.h Dispatching_Modules.i \ - Memory_Pools.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i -.obj/Event_Channel.o .shobj/Event_Channel.: Event_Channel.cpp \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - Dispatching_Modules.h \ - ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i RT_Task.h RT_Task.i Event_Channel.h CORBA_Utils_T.h \ - CORBA_Utils_T.i Task_Manager.h Task_Manager.i Event_Channel.i \ - Dispatching_Modules.i Memory_Pools.h Memory_Pools.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.i -.obj/GPlot_File.o .shobj/GPlot_File.: GPlot_File.cpp GPlot_File.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - GPlot_File.i -.obj/Local_ESTypes.o .shobj/Local_ESTypes.: Local_ESTypes.cpp Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i -.obj/Memory_Pools.o .shobj/Memory_Pools.: Memory_Pools.cpp Memory_Pools.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - Event_Channel.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i CORBA_Utils_T.h CORBA_Utils_T.i Task_Manager.h \ - RT_Task.h RT_Task.i Task_Manager.i ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Event_Channel.i Dispatching_Modules.h Dispatching_Modules.i \ - Memory_Pools.i -.obj/RT_Task.o .shobj/RT_Task.: RT_Task.cpp RT_Task.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - RT_Task.i Debug_Macros.h Event_Channel.h \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i CORBA_Utils_T.h CORBA_Utils_T.i Task_Manager.h \ - Task_Manager.i ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Event_Channel.i Memory_Pools.h Dispatching_Modules.h \ - Dispatching_Modules.i Memory_Pools.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i -.obj/ReactorTask.o .shobj/ReactorTask.: ReactorTask.cpp \ - $(ACE_ROOT)/ace/High_Res_Timer.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/High_Res_Timer.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i \ - ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i RT_Task.h RT_Task.i -.obj/Task_Manager.o .shobj/Task_Manager.: Task_Manager.cpp Task_Manager.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - RT_Task.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - RT_Task.i Task_Manager.i ReactorTask.h Fast_Reactor.h \ - $(ACE_ROOT)/ace/Select_Reactor.h \ - $(ACE_ROOT)/ace/Token.h \ - $(ACE_ROOT)/ace/Token.i \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(ACE_ROOT)/ace/Select_Reactor.i \ - $(ACE_ROOT)/ace/Timer_Heap.h \ - $(ACE_ROOT)/ace/Timer_Heap_T.h \ - $(ACE_ROOT)/ace/Timer_List.h \ - $(ACE_ROOT)/ace/Timer_List_T.h \ - Local_ESTypes.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminS.i \ - Local_ESTypes.i - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/local/bin/Event_Service/Memory_Pools.cpp b/TAO/local/bin/Event_Service/Memory_Pools.cpp deleted file mode 100644 index 3cbcd71d8b5..00000000000 --- a/TAO/local/bin/Event_Service/Memory_Pools.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// $Id$ - -#include "Memory_Pools.h" -#include "Event_Channel.h" - -#if !defined (__ACE_INLINE__) -#include "Memory_Pools.i" -#endif /* __ACE_INLINE__ */ - -ACE_TSS<ACE_ES_Dispatch_Request_Allocator> ACE_ES_Memory_Pools::Dispatch_Request_; -ACE_TSS<ACE_ES_Event_Container_Allocator> ACE_ES_Memory_Pools::Event_Container_; -ACE_TSS<ACE_ES_Event_Allocator> ACE_ES_Memory_Pools::Event_; - -// ************************************************************ - -int -ACE_ES_Memory_Pools::thr_init (void) -{ - // Allocate the memory pool for this thread. - Event_Container_.ts_object (); - Dispatch_Request_.ts_object (); - Event_.ts_object (); - return 0; -} - -// ************************************************************ - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -// For ACE_ES_Memory_Pools. -template class ACE_TSS<ACE_ES_Event_Container_Allocator>; -template class ACE_TSS<ACE_ES_Dispatch_Request_Allocator>; -template class ACE_TSS<ACE_Malloc<ACE_Local_Memory_Pool, ACE_Local_Memory_Pool_Options, ACE_MEMORY_POOL_MUTEX> >; -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/bin/Event_Service/Memory_Pools.h b/TAO/local/bin/Event_Service/Memory_Pools.h deleted file mode 100644 index cc8a23f6767..00000000000 --- a/TAO/local/bin/Event_Service/Memory_Pools.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ORB Services -// -// = FILENAME -// Memory_Pools -// -// = AUTHOR -// Tim Harrison (harrison@cs.wustl.edu) -// -// ============================================================================ - -#ifndef ACE_MEMORY_POOLS_H -#define ACE_MEMORY_POOLS_H - -#include "ace/Synch.h" -#include "Event_Channel.h" -#include "Dispatching_Modules.h" - -// ************************************************************ - -#if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || defined (ACE_HAS_TSS_EMULATION) - typedef ACE_Null_Mutex ACE_MEMORY_POOL_MUTEX; -#else - // Use the same object for each thread. Therefore, we have to use - // real synchronization. - typedef ACE_Thread_Mutex ACE_MEMORY_POOL_MUTEX; -#endif /* ACE_HAS_THREAD_SPECIFIC_STORAGE || ACE_HAS_TSS_EMULATION */ - -typedef char ACE_ES_Dispatch_Request_Chunk[sizeof (ACE_ES_Dispatch_Request)]; - -typedef ACE_Cached_Allocator<ACE_ES_Dispatch_Request_Chunk, ACE_MEMORY_POOL_MUTEX> _ACE_Dispatch_Request_Allocator; - -class ACE_ES_Dispatch_Request_Allocator : public _ACE_Dispatch_Request_Allocator -// = TITLE -// Dispatch Request Allocator -// -// = DESCRIPTION -// This just sets the size of the Event Container memory pool. -{ -public: - ACE_ES_Dispatch_Request_Allocator (void) : - _ACE_Dispatch_Request_Allocator (ACE_ES_DISPATCH_REQUEST_MEMORY_POOL) {} -}; - -// ************************************************************ - -typedef char ACE_ES_Event_Container_Chunk[sizeof (ACE_ES_Event_Container)]; - -typedef ACE_Cached_Allocator<ACE_ES_Event_Container_Chunk, ACE_MEMORY_POOL_MUTEX> _ACE_Event_Container_Allocator; - -class ACE_ES_Event_Container_Allocator : public _ACE_Event_Container_Allocator -// = TITLE -// Event Container Allocator -// -// = DESCRIPTION -// This just sets the size of the Event Container memory pool. -{ -public: - ACE_ES_Event_Container_Allocator (void) : - _ACE_Event_Container_Allocator (ACE_ES_EVENT_CONTAINER_MEMORY_POOL) {} -}; - -// ************************************************************ - -typedef char ACE_ES_Event_Chunk[sizeof (RtecEventComm::Event)]; - -typedef ACE_Malloc<ACE_LOCAL_MEMORY_POOL, ACE_MEMORY_POOL_MUTEX> ACE_ES_Event_Allocator; -//typedef ACE_Cached_Allocator<ACE_ES_Event_Chunk, ACE_MEMORY_POOL_MUTEX> _ACE_Event_Allocator; - -class ACE_ES_Memory_Pools -// = TITLE -// Event Service Memory Pools. -// -// = DESCRIPTION -// These have to be static in order to be accessed by operator -// news, right? -{ -public: - static int thr_init (void); - // This can be called by every thread that will access these memory - // pools to preallocate the thread specific allocators. It is not - // mandatory. - - static void *new_Event_Container (void); - static void delete_Event_Container (void *); - static void *new_Dispatch_Request (void); - static void delete_Dispatch_Request (void *); - static void *new_Event (size_t); - static void delete_Event (void *); - - static ACE_TSS<ACE_ES_Dispatch_Request_Allocator> Dispatch_Request_; - static ACE_TSS<ACE_ES_Event_Container_Allocator> Event_Container_; - static ACE_TSS<ACE_ES_Event_Allocator> Event_; -}; - -#if defined (__ACE_INLINE__) -#include "Memory_Pools.i" -#endif /* __ACE_INLINE__ */ -#endif /* ACE_MEMORY_POOLS_H */ diff --git a/TAO/local/bin/Event_Service/Memory_Pools.i b/TAO/local/bin/Event_Service/Memory_Pools.i deleted file mode 100644 index 3f6e3b26223..00000000000 --- a/TAO/local/bin/Event_Service/Memory_Pools.i +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -ACE_INLINE void * -ACE_ES_Memory_Pools::new_Event_Container (void) -{ - return Event_Container_->malloc (sizeof (ACE_ES_Event_Container)); -} - -ACE_INLINE void -ACE_ES_Memory_Pools::delete_Event_Container (void *mem) -{ - Event_Container_->free (mem); -} - -ACE_INLINE void * -ACE_ES_Memory_Pools::new_Dispatch_Request (void) -{ - return Dispatch_Request_->malloc (sizeof (ACE_ES_Dispatch_Request)); -} - -ACE_INLINE void -ACE_ES_Memory_Pools::delete_Dispatch_Request (void *mem) -{ - Dispatch_Request_->free (mem); -} - -#define USE_MEM_POOLS 1 - -ACE_INLINE void * -ACE_ES_Memory_Pools::new_Event (size_t len) -{ -#if USE_MEM_POOLS - const u_int ev_size = sizeof (RtecEventComm::Event); - const u_int size = (ev_size % ACE_MALLOC_ALIGN) ? - ((ev_size / ACE_MALLOC_ALIGN) + 1) * ACE_MALLOC_ALIGN : ev_size; - - char *const addr = (char *) Event_->malloc (len * size); -#else - char *const addr = new char[len * sizeof (ACE_ES_Event)]; -#endif - - return addr; -} - -ACE_INLINE void -ACE_ES_Memory_Pools::delete_Event (void *mem) -{ -#if USE_MEM_POOLS - Event_->free (mem); -#else - delete [] mem; -#endif -} diff --git a/TAO/local/bin/Event_Service/RT_Task.cpp b/TAO/local/bin/Event_Service/RT_Task.cpp deleted file mode 100644 index 29add869322..00000000000 --- a/TAO/local/bin/Event_Service/RT_Task.cpp +++ /dev/null @@ -1,363 +0,0 @@ -// $Id$ - -#include "RT_Task.h" -#include "Debug_Macros.h" -#include "Event_Channel.h" -#include "Memory_Pools.h" -#include "Scheduler_Factory.h" - -#if !defined (__ACE_INLINE__) -#include "RT_Task.i" -#endif /* __ACE_INLINE__ */ - -class ACE_RT_Task_Shutdown : public ACE_RT_Task_Command -// = TITLE -// Flush Queue Command. -// -// = DESCRIPTION -// This command object will call close on task_. This is used by -// single-threaded tasks to flush any queued messages. -{ -public: - ACE_RT_Task_Shutdown (ACE_ES_TASK *task) - : task_ (task) {} - - virtual int execute (u_long &command_action); - - ACE_ES_TASK *task_; -}; - -int -ACE_RT_Task_Shutdown::execute (u_long &command_action) -{ - ACE_UNUSED_ARG (command_action); - - if (task_ == 0) - return 1; - else - { - task_->close (0); - return 0; - } -} - -// ************************************************************ -// ************************************************************ - -ACE_RT_Task::ACE_RT_Task (void) - : closed_ (0) -{ -} - -ACE_RT_Task::~ACE_RT_Task (void) -{ - msg_queue_->deactivate (); -} - -int -ACE_RT_Task::svc (void) -{ - int done = 0; - - ACE_hthread_t self; - ACE_OS::thr_self (self); - - int priority; - if (ACE_OS::thr_getprio (self, priority) == 0) - ACE_DEBUG ((LM_DEBUG, "(%t) new thread priority = %d.\n", priority)); - - // Initialize channel thread-specific data. - ACE_ES_Memory_Pools::thr_init (); - - done = this->svc_hook (priority); - - while (!done) - { - done = this->svc_one (); - } - - ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n")); - return 0; -} - -int -ACE_RT_Task::svc_hook (RtecScheduler::OS_Priority) -{ - return 0; -} - -int -ACE_RT_Task::svc_one (void) -{ - // Dequeue the command. - ACE_Message_Block *mb; - - if (this->getq (mb) == -1) - { - if (ACE_OS::last_error () == ESHUTDOWN) - return 1; - else - // We'll continue in spite of this error. - ACE_ERROR ((LM_ERROR, "%p (%t) getq error.\n", "ACE_RT_Task::svc_one")); - } - - // Execute the command. - ACE_RT_Task_Command *command = (ACE_RT_Task_Command *) mb; - - int result; - u_long command_action = ACE_RT_Task_Command::RELEASE; - - ACE_TIMEPROBE (" RT_Task - start execute"); - - // @@ Put exception handling around this! - result = command->execute (command_action); - - ACE_TIMEPROBE (" RT_Task - end execute"); - - switch (command_action) - { - case ACE_RT_Task_Command::RELEASE: - // Free the message block. - if (ACE_RT_Task_Command::release (command) != 0) - ACE_ERROR ((LM_ERROR, "ACE_RT_Task::svc_one: " - "ACE_RT_Task_Command::release returned != 0!\n")); - break; - - case ACE_RT_Task_Command::UNGETQ: - this->ungetq (command); - break; - } - - return result; -} - -// A thread has exited. -int -ACE_RT_Task::close (u_long) -{ - // If we're the last one out, call threads_closed. - if (thr_count_ == 0) - this->threads_closed (); - - return 0; -} - -// All threads have exited. -void -ACE_RT_Task::threads_closed (void) -{ -} - -int -ACE_RT_Task::open_task (const char* name) -{ - const char *tempname = name; - char tempbuffer[64]; - if (tempname == 0) - { - ACE_OS::sprintf (tempbuffer, "unnamed task %d", (long) this); - tempname = tempbuffer; - } - - ACE_TRY - { - rt_info_ = - ACE_Scheduler_Factory::server()->create (tempname, - ACE_TRY_ENV); - ACE_CHECK_ENV; - // @@ TODO: We do no initialization of the new rt_info, the - // caller does, this is (IMnsHO) very error prone. - } - ACE_CATCH (RtecScheduler::DUPLICATE_NAME, dn_ex) - { - // @@ TODO: Its already registered, IMHO this should at least - // report a warning, but I'll stick to the previous code. - // ACE_ERROR_RETURN ((LM_WARNING, - // "RT_Info for %s was already createn", - // tempname), 0); - return 0; - } - ACE_ENDTRY; - - return 0; -} - -int -ACE_RT_Task::try_put (ACE_Message_Block *mb) -{ - if (!closed_) - { - return this->msg_queue ()->enqueue_prio (mb); - } - else - { - errno = EPIPE; - return -1; - } -} - -// The point of this method is to spawn or shutdown threads depending -// on any differences between the task's RT_Info::threads_ and how -// many threads are actually running. -int -ACE_RT_Task::synch_threads (size_t threads) -{ - if (threads > this->thr_count ()) - // Add threads. - { - RtecScheduler::OS_Priority thread_priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_priority; - - ACE_TRY - { - // @@ TODO handle exceptions - ACE_TIMEPROBE (" synch_threads - priority requested"); - ACE_Scheduler_Factory::server ()->priority - (rt_info_, - thread_priority, - subpriority, - preemption_priority, ACE_TRY_ENV); - ACE_CHECK_ENV; - ACE_TIMEPROBE (" synch_threads - priority obtained"); - - ACE_DEBUG ((LM_DEBUG, "(%t) spawning %d threads at os thread" - " priority %d.\n", - threads - this->thr_count (), - thread_priority)); - - // This is here so that the constructor does not call it. The - // ORB has an instance of one of these. - this->thr_mgr (ACE_Task_Manager::instance ()->ThrMgr ()); - - // Add the difference. - if (this->activate (THR_BOUND, - threads - this->thr_count (), - 1, // Force it to spawn more threads - thread_priority) == -1) - { - ACE_DEBUG ((LM_ERROR, - "(%t) thread spawn FAILED, errno is %d!!!!\n", - errno)); - } - - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, "priority failed\n"), -1); - } - ACE_ENDTRY; - - } - else - // Remove threads. - { - // kill_threads has to be off the stack in case the last thread - // deletes this RT_Task. - int kill_threads = this->thr_count () - threads; - - for (int x = kill_threads ; x > 0; x--) - { - // Create a new shutdown command with a task pointer of 0. - ACE_RT_Task_Shutdown *te = new ACE_RT_Task_Shutdown (0); - - if (te == 0) - return -1; - - ACE_DEBUG ((LM_DEBUG, "(%t) enqueueing thread exit.\n")); - if (this->putq (te) == -1) - { - ACE_ERROR ((LM_ERROR, "%p putq failed.\n", - "ACE_RT_Task::synch_threads")); - if (ACE_RT_Task_Shutdown::release (te) != 0) - ACE_ERROR ((LM_ERROR, "ACE_RT_Task::synch_threads: " - "ACE_RT_Task_Shutdown::release returned != 0!\n")); - return -1; - } - } - } - - return 0; -} - - -// If we are not active, we will flush the queue and then call -// this->close. Otherwise, we will send shutdown messages to each -// thread. ~ACE_Task_Exit will call this->close when each thread -// exits. -int -ACE_RT_Task::shutdown_task (void) -{ - // Be sure to only execute this once, and only if we're active. - if (closed_) - return 0; - - // This will keep any messages from entering the queue. - closed_ = 1; - - if (thr_count_ > 0) - return this->synch_threads (0); - else - { - // Create a new flush queue command. We're passive, so pass in - // a reference to the task for which close will be called. - ACE_RT_Task_Shutdown *fq = new ACE_RT_Task_Shutdown (this); - - if (fq == 0) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_RT_Task::shutdown_threads")); - return -1; - } - - // Enqueue the command. - ACE_DEBUG ((LM_DEBUG, "(%t) enqueueing task shutdown.\n")); - if (this->putq (fq) == -1) - { - ACE_ERROR ((LM_ERROR, "%p putq failed.\n", - "ACE_RT_Task::shutdown_task")); - if (ACE_RT_Task_Shutdown::release (fq) != 0) - ACE_ERROR ((LM_ERROR, "ACE_RT_Task::shutdown_task: " - "ACE_RT_Task_Shutdown::release returned != 0!\n")); - return -1; - } - } - - return 0; -} - -// ************************************************************ - -ACE_RT_Thread_Manager::ACE_RT_Thread_Manager (void) - : flags_ (0) -{ -} - -void -ACE_RT_Thread_Manager::suspend_spawns (void) -{ - flags_ |= THR_SUSPENDED; -} - -void -ACE_RT_Thread_Manager::unsuspend_spawns (void) -{ - flags_ = 0; - this->resume_all (); -} - -int -ACE_RT_Thread_Manager::spawn_i (ACE_THR_FUNC func, - void *args, - long flags, - ACE_thread_t *t_id, - ACE_hthread_t *t_handle, - long priority, - int grp_id, - void *stack, - size_t stack_size, - ACE_Task_Base *task) -{ - flags |= flags_; - return ACE_Thread_Manager::spawn_i (func, args, flags, t_id, t_handle, - priority, grp_id, stack, stack_size, task); -} diff --git a/TAO/local/bin/Event_Service/RT_Task.h b/TAO/local/bin/Event_Service/RT_Task.h deleted file mode 100644 index c4b11907e5d..00000000000 --- a/TAO/local/bin/Event_Service/RT_Task.h +++ /dev/null @@ -1,179 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ace -// -// = FILENAME -// RT_Task -// -// = AUTHOR -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// Wrapper on top of ACE Task that integrates an Active Object with -// the Event Service. -// -// ============================================================================ - -#ifndef ACE_RT_TASK_H -#define ACE_RT_TASK_H - -#include "ace/Task.h" - -#include "RtecSchedulerC.h" - -class ACE_RT_Thread_Manager : public ACE_Thread_Manager -// = TITLE -// -// = DESCRIPTION -{ -public: - ACE_RT_Thread_Manager (void); - // Default construction. - - void suspend_spawns (void); - // Any threads spawned will be suspended until unsuspend_spawns is - // called. - - void unsuspend_spawns (void); - // Resumes all threads. - -protected: - virtual int spawn_i (ACE_THR_FUNC func, - void *args, - long flags, - ACE_thread_t * = 0, - ACE_hthread_t *t_handle = 0, - long priority = 0, - int grp_id = -1, - void *stack = 0, - size_t stack_size = 0, - ACE_Task_Base *task = 0); - - int flags_; -}; - -// ************************************************************ - -class ACE_RT_Task_Command : public ACE_Message_Block -// = TITLE -// -// = DESCRIPTION -{ -public: - virtual ~ACE_RT_Task_Command (void) {} - // Guarantees that derived destructors get called. - - enum { RELEASE, UNGETQ }; - - virtual int execute (u_long &command_action) = 0; - // Execute the command. Returning 1 will make the calling thread - // exit. Returning 0 will allow the thread to continue dispatching - // commands. If <command_action> returns as RELEASE, the command - // will be released. If <command_action> == UNGETQ, then the - // command will be requeued and dispatched again. -}; - -// ************************************************************ - -// In Synch_T.h: -// #define ACE_MT_SYNCH ACE_Thread_Mutex,ACE_Condition_Thread_Mutex - -typedef ACE_Task<ACE_MT_SYNCH> ACE_ES_TASK; -typedef ACE_Message_Queue<ACE_MT_SYNCH> ACE_ES_QUEUE; - -class ACE_RT_Task : public ACE_ES_TASK -// = TITLE -// ACE Real-Time Task -// -// = DESCRIPTION -// Real-Time Active Object that integrates with a global scheduler -// and Event Service. For now, none of the management methods are -// synchronized. If it turns out that multiple threads will be -// calling the management methods, then we can add -// synchronization. For the most part, RT_Task threads should be -// dequeueing commands from the message queue. Only one thread -// should be calling any management methods. -{ - friend ACE_RT_Thread_Manager; -public: - ACE_RT_Task (void); - // Default construction. - - ~ACE_RT_Task (void); - // Deactivates the queue. - - // = Management methods. - - int open_task (const char* name = 0); - // <name> is used to look up our qos info from the scheduler. If - // <name> == 0, then we create a "unique" name and ask the scheduler - // for a new qos structure. If we find an existing qos structure, - // calls this->synch_threads and returns 1. If a qos structure is not - // found, but created returns 0 and does not call synch_threads. - // Returns -1 on failure. - - int try_put (ACE_Message_Block *mb); - // Enqueue a request. Returns 0 on success, -1 on failure. If the - // task is shutdown, -1 is returned with errno == EPIPE. - - int shutdown_task (void); - // If active, shutdown all running thread. Since this is - // accomplished via queued shutdown messages, this has the effect of - // flushing the queue. Once all threads exit, threads_closed will - // be called. If this is a passive object, then the queue will be - // flushed and threads_closed will be called. - - int synch_threads (size_t threads); - // Compare <threads> with what is actually running. If there are - // any differences, update this RT_Task. This may involve spawning - // more threads or changing thread priorities, etc. This can be - // used to close all threads by sending a 0. - - RtecScheduler::handle_t rt_info (void); - // QOS accessor. The behavior of the task can be changed by setting - // this and then calling this->synch_threads. - - virtual void threads_closed (void); - // Called when every thread has exited. This hook allows - // applications to specify semantics when all threads have exited. - // For instance, the Dispatching Module uses this hook to delete - // itself when an application is shutting down. - - virtual int svc_hook (RtecScheduler::OS_Priority priority); - // This is called the first time the thread is spawned. <priority> - // is the priority of the current thread. If this returns != 1 - // (e.g., 0), the event loop will execute (calling this->svc_one). - // If this returns 1, the event loop will not execute. - - virtual int svc_one (void); - // Call this->getq once and execute the command. Returns the result - // of command->execute (). - -protected: - RtecScheduler::handle_t rt_info_; - // Scheduling characteristics of this active object. - - int closed_; - // Set to 1 when this->shutdown_threads or this->close_queue is - // called. Keeps us from enqueuing more that one shutdown message. - - virtual int svc (void); - // Run by each thread spawned. Each thread dequeues - // ACE_RT_Task_Commands and executes them. - - virtual int close (u_long flags = 0); - // Called each time a thread exits. - - void close_all_threads (void); - // Enqueues shutdown message for every thread in the task. -}; - -#if defined (__ACE_INLINE__) -#include "RT_Task.i" -#endif /* __ACE_INLINE__ */ - -#endif /* ACE_RT_TASK_H */ diff --git a/TAO/local/bin/Event_Service/RT_Task.i b/TAO/local/bin/Event_Service/RT_Task.i deleted file mode 100644 index b6b21d50494..00000000000 --- a/TAO/local/bin/Event_Service/RT_Task.i +++ /dev/null @@ -1,8 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -ACE_INLINE RtecScheduler::handle_t -ACE_RT_Task::rt_info (void) -{ - return rt_info_; -} diff --git a/TAO/local/bin/Event_Service/ReactorTask.cpp b/TAO/local/bin/Event_Service/ReactorTask.cpp deleted file mode 100644 index 11cb8751a8a..00000000000 --- a/TAO/local/bin/Event_Service/ReactorTask.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// -// $Id$ -// -#include "ace/High_Res_Timer.h" -#include "tao/Timeprobe.h" - -#include "Scheduler_Factory.h" -#include "ReactorTask.h" - -ACE_ES_Reactor_Task::ACE_ES_Reactor_Task() : - // reactor_ (0, &timer_queue_), - done_ (0) -{ - // Change the timer mechanism used by the reactor and the timer - // queue. -#if defined (VXWORKS) - timer_queue_.gettimeofday (ACE_OS::gettimeofday); -#else - timer_queue_.gettimeofday (ACE_High_Res_Timer::gettimeofday); -#endif /* VXWORKS */ -} - -ACE_ES_Reactor_Task::~ACE_ES_Reactor_Task (void) -{ -} - -int -ACE_ES_Reactor_Task::svc_hook(RtecScheduler::OS_Priority) -{ - // Make ourselves owner of the reactor. - reactor_.owner (ACE_Thread::self()); - return 0; -} - -int -ACE_ES_Reactor_Task::open_reactor (RtecScheduler::Period &period) -{ - // Create a name for ourself using the priority. - char temp[64]; - ACE_OS::sprintf (temp, "Reactor_Task-%u", period); - - // Open the task. This will query the scheduler for our qos - // structure. - int result = this->open_task (temp); - - switch (result) - { - case -1: - // Error. - ACE_ERROR ((LM_ERROR, "(%t) Scheduler could not find operation %s.\n", - temp)); - return -1; - - case 0: - // @@ TODO handle exceptions - { - ACE_TRY - { - ACE_Scheduler_Factory::server()->set(rt_info_, - 0, 0, 0, period, - RtecScheduler::VERY_LOW, - RtecScheduler::NO_QUANTUM, - 1, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, "set failed\n"), -1); - } - ACE_ENDTRY; - } - break; - - case 1: - // Found. - break; - } - - return this->synch_threads (1); -} - -int ACE_ES_Reactor_Task::svc_one() -{ - ACE_TIMEPROBE (" Reactor_Task - waiting for events"); - if (reactor_.handle_events() == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p.\n", "ACE_ES_Reactor_Task::svc")); - ACE_TIMEPROBE (" Reactor_Task - events handled"); - - if (done_) - ACE_DEBUG ((LM_DEBUG, "(%t) Timer Task is done.\n")); - - return done_; -} - -void ACE_ES_Reactor_Task::threads_closed() -{ - delete this; -} - -void ACE_ES_Reactor_Task::shutdown_task() -{ - done_ = 1; - reactor_.notify(); -} - -ACE_ES_Reactor_Task::Reactor& -ACE_ES_Reactor_Task::get_reactor() -{ - return reactor_; -} diff --git a/TAO/local/bin/Event_Service/ReactorTask.h b/TAO/local/bin/Event_Service/ReactorTask.h deleted file mode 100644 index 973d6f82f97..00000000000 --- a/TAO/local/bin/Event_Service/ReactorTask.h +++ /dev/null @@ -1,76 +0,0 @@ -// $Id$ - -#if !defined ACE_ReactorTask_H -#define ACE_ReactorTask_H - -// BBM, moved this here from UPSingleProcessorOrb.h -//## begin module.includes preserve=yes -#include "Fast_Reactor.h" -#if defined (ACE_OLD_STYLE_REACTOR) -# define ACE_ORB_REACTOR ACE_ES_Fast_Reactor -#endif /* ACE_OLD_STYLE_REACTOR */ -//## end module.includes - -// Added these. -#include "ace/Timer_Heap.h" -#include "ace/Timer_List.h" - -#include "Local_ESTypes.h" -#include "RT_Task.h" - -class ACE_ES_Reactor_Task : public ACE_RT_Task -// = TITLE -// Event Service Timer Task -// -// = DESCRIPTION -// An active object that dispatches timers from its own ReactorEx. -{ -public: - // BBM, added this. -#if defined (ACE_OLD_STYLE_REACTOR) - typedef ACE_ORB_REACTOR Reactor; -#else - typedef ACE_Reactor Reactor; -#endif /* ACE_OLD_STYLE_REACTOR */ - - ACE_ES_Reactor_Task(); - // Default construction. - - ~ACE_ES_Reactor_Task(); - // Destruction. - - virtual int svc_hook(RtecScheduler::OS_Priority); - // Assume ownership of the reactor_. - - int open_reactor (RtecScheduler::Period &period); - // This is a hack for now. - - virtual int svc_one(); - // Calls reactor_.handle_events until done_ is set. - - void shutdown_task(); - // Sets done_ and notifies the reactor_. - - Reactor &get_reactor(); - // ReactorEx accessor. - - virtual void threads_closed(); - // Deletes this. - -private: - ACE_Timer_List timer_queue_; - // The timer storage mechanism used by reactor_. - -#if !defined (ACE_OLD_STYLE_REACTOR) - ACE_ES_Fast_Reactor fast_reactor_; - // The timer dispatch mechanism. -#endif /* ! ACE_OLD_STYLE_REACTOR */ - - Reactor reactor_; - // "Public" handle to fast_reactor_. - - sig_atomic_t done_; - // When set, end the event loop. -}; - -#endif /* ACE_ReactorTask_H */ diff --git a/TAO/local/bin/Event_Service/Task_Manager.cpp b/TAO/local/bin/Event_Service/Task_Manager.cpp deleted file mode 100644 index e90ee3682da..00000000000 --- a/TAO/local/bin/Event_Service/Task_Manager.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// $Id$ - -#include "Task_Manager.h" -#include "ReactorTask.h" - -#if ! defined (__ACE_INLINE__) -#include "Task_Manager.i" -#endif /* __ACE_INLINE__ */ - -ACE_Task_Manager::ACE_Task_Manager() -{ - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - { - reactorTasks[x] = 0; - } -} - -void ACE_Task_Manager::initialize() -{ - for (int x=0; x < ACE_Scheduler_MAX_PRIORITIES; x++) - { - RtecScheduler::Period tv = ACE_Scheduler_Rates[x]; - reactorTasks[x] = new ReactorTask; - if (reactorTasks[x] == 0 || - reactorTasks[x]->open_reactor (tv) == -1) - { - ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ORB::initialize_reactors")); - return; - } - } -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Singleton<ACE_Task_Manager,ACE_SYNCH_MUTEX>; -#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate class ACE_Singleton<ACE_Task_Manager,ACE_SYNCH_MUTEX> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/bin/Event_Service/Task_Manager.h b/TAO/local/bin/Event_Service/Task_Manager.h deleted file mode 100644 index d87693d024b..00000000000 --- a/TAO/local/bin/Event_Service/Task_Manager.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- C++ -*- */ -// -// $Id$ -// - -#if !defined(TASK_MANAGER_H) -#define TASK_MANAGER_H - -#include <ace/ACE.h> -#include <ace/Singleton.h> -#include "Event_Service_Constants.h" -#include "RT_Task.h" - -class ACE_ES_Reactor_Task; - -class ACE_Task_Manager -// = TITLE -// Singleton class for the pool of ACE_ReactorTask. -// -// = DESCRIPTION -// The EventChannel uses a pool of ACE_ReactorTask to handle the -// dispatching of Events. In real-time multi-threaded enviroments -// this maps to a different thread per priority. -// This class offers a centralized access point to those tasks and -// some related services. -// -{ -public: - typedef ACE_ES_Reactor_Task ReactorTask; - - static ACE_Task_Manager* instance(); - // Returns the singleton. - - ReactorTask* GetReactorTask(RtecScheduler::OS_Priority priority); - // Obtain the ReactorTask for the given priority. - // The Task must have been created already. - - ACE_RT_Thread_Manager* ThrMgr(); - // Returns a global ThreadManager for the Task pool. - -private: - friend class ACE_Singleton<ACE_Task_Manager,ACE_SYNCH_MUTEX>; - ACE_Task_Manager(); - - void initialize(); - -private: - ReactorTask *reactorTasks[ACE_Scheduler_MAX_PRIORITIES]; - ACE_RT_Thread_Manager thr_mgr; -}; - -#if defined (__ACE_INLINE__) -#include "Task_Manager.i" -#endif /* __ACE_INLINE__ */ - -#endif /* TASK_MANAGER_H */ diff --git a/TAO/local/bin/Event_Service/Task_Manager.i b/TAO/local/bin/Event_Service/Task_Manager.i deleted file mode 100644 index 35abcc0268c..00000000000 --- a/TAO/local/bin/Event_Service/Task_Manager.i +++ /dev/null @@ -1,30 +0,0 @@ -// -// $Id$ -// - -ACE_INLINE ACE_Task_Manager::ReactorTask* -ACE_Task_Manager::GetReactorTask(RtecScheduler::OS_Priority priority) -{ - if (reactorTasks[priority] == 0) - { - initialize(); - //ACE_ERROR_RETURN ((LM_ERROR, - //"%p no reactor task for priority %d.\n", - //"ACE_Task_Manager::GetReactor", - //priority), 0); - } - - return reactorTasks[priority]; -} - -ACE_INLINE ACE_RT_Thread_Manager* ACE_Task_Manager::ThrMgr() -{ - return &thr_mgr; -} - -ACE_INLINE ACE_Task_Manager* ACE_Task_Manager::instance() -{ - return ACE_Singleton<ACE_Task_Manager,ACE_SYNCH_MUTEX>::instance(); -} - - diff --git a/TAO/local/bin/Event_Service/svc.conf b/TAO/local/bin/Event_Service/svc.conf deleted file mode 100644 index 43c6a486c92..00000000000 --- a/TAO/local/bin/Event_Service/svc.conf +++ /dev/null @@ -1,49 +0,0 @@ -# $Id$ -# -# This file contains a sample ACE_Service_Config configuration -# file specifying the strategy factories utilized by an application -# using TAO. There are currently only two possible factories: -# Client_Strategy_Factory and Server_Strategy_Factory. These names -# must be used as the second argument to their corresponding line, -# because that's what the ORB uses to find the desired factory. -# -# Note that there are two unordinary characteristics of the way *this* -# file is set up: -# - both client and server strategies are specified in the same -# file, which would only make sense for co-located clients & servers -# - both of the factories are actually sourced out of libTAO.so -# (TAO.DLL on Win32), and they would normally be in a separate -# dll from the TAO ORB Core. -# -# The options which can be passed to the Resource Factory are: -# -# -ORBresources <which> -# where <which> can be 'global' to specify globally-held resources, -# or 'tss' to specify thread-specific resources. -# -# The options which can be passed to the Client are: -# <none currently> -# -# The options which can be passed to the Server are: -# -# -ORBconcurrency <which> -# where <which> can be 'thread-per-connection' to specify -# use of the ACE_Threaded_Strategy concurrency strategy, -# or 'reactive' to specify use of the ACE_Reactive_Strategy -# concurrency strategy. -# -# -ORBthreadflags <flags> -# specifies the default thread flags to use, where <flags> is a -# logical OR'ing of the flags THR_DETACHED, THR_BOUND, THR_NEW_LWP, -# THR_SUSPENDED, or THR_DAEMON. Note that not every flag may be valid -# on every platform. -# -# -ORBdemuxstrategy <which> -# where <which> can be one of 'dynamic', 'linear', 'active', or 'user', -# and specifies the type of object lookup strategy used internally. -# -ORBtablesize <unsigned> -# specifies the size of the object table -# -dynamic Resource_Factory Service_Object * TAO:_make_TAO_Resource_Factory() "-ORBresources global" -dynamic Client_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Client_Strategy_Factory() -dynamic Server_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Server_Strategy_Factory() "-ORBconcurrency reactive -ORBdemuxstrategy dynamic -ORBtablesize 128" diff --git a/TAO/local/bin/Makefile b/TAO/local/bin/Makefile deleted file mode 100644 index 08a276608b0..00000000000 --- a/TAO/local/bin/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -#---------------------------------------------------------------------------- -# -# $Id$ -# -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -DIRS = Event_Service \ - Scheduling_Service - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(ACE_ROOT)/include/makeinclude/macros.GNU -include $(ACE_ROOT)/include/makeinclude/rules.common.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nested.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/TAO/local/bin/Scheduling_Service/.cvsignore b/TAO/local/bin/Scheduling_Service/.cvsignore deleted file mode 100644 index ffbc428cd7f..00000000000 --- a/TAO/local/bin/Scheduling_Service/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -schedule_service -dump_schedule - diff --git a/TAO/local/bin/Scheduling_Service/Config_Scheduler.cpp b/TAO/local/bin/Scheduling_Service/Config_Scheduler.cpp deleted file mode 100644 index fa07ecc113f..00000000000 --- a/TAO/local/bin/Scheduling_Service/Config_Scheduler.cpp +++ /dev/null @@ -1,260 +0,0 @@ -// ============================================================================ -// -// $Id$ -// -// ============================================================================ - -#include "Scheduler_Factory.h" -#include "Scheduler_Internal.h" -#include "Config_Scheduler.h" - -#if defined (__ACE_INLINE__) -#include "Config_Scheduler.i" -#endif /* __ACE_INLINE__ */ - -ACE_Config_Scheduler::ACE_Config_Scheduler (void) - : POA_RtecScheduler::Scheduler ("Scheduler_Internal"), - impl(new Scheduler_Internal) -{ - impl->output_level (10); -} - -ACE_Config_Scheduler::~ACE_Config_Scheduler (void) -{ - delete impl; -} - -RtecScheduler::handle_t -ACE_Config_Scheduler::create (const char * entry_point, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::DUPLICATE_NAME)) -{ - typedef RtecScheduler::RT_Info* RT_Info_ptr; - - RtecScheduler::RT_Info** rt_info; - ACE_NEW_RETURN (rt_info, RT_Info_ptr[1], -1); - - ACE_NEW_RETURN (rt_info[0], RtecScheduler::RT_Info, -1); - - rt_info[0]->entry_point = CORBA::string_dup(entry_point); - rt_info[0]->handle = -1; - rt_info[0]->worst_case_execution_time = 0; - rt_info[0]->typical_execution_time = 0; - rt_info[0]->cached_execution_time = 0; - rt_info[0]->period = 0; - rt_info[0]->importance = RtecScheduler::VERY_LOW; - rt_info[0]->quantum = RtecScheduler::NO_QUANTUM; - rt_info[0]->threads = 0; - rt_info[0]->priority = 0; - rt_info[0]->subpriority = 0; - rt_info[0]->preemption_priority = 0; - - RtecScheduler::handle_t handle = -1; - switch (impl->register_task (rt_info, 1, handle)) - { - case ACE_Scheduler::SUCCEEDED: - break; - case ACE_Scheduler::ST_VIRTUAL_MEMORY_EXHAUSTED: - case ACE_Scheduler::ST_TASK_ALREADY_REGISTERED: - default: - delete rt_info[0]; - delete[] rt_info; - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::create - register_task failed\n")); - // TODO: throw something. - break; - } - return handle; -} - -RtecScheduler::handle_t -ACE_Config_Scheduler::lookup (const char * entry_point, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException)) -{ - RtecScheduler::RT_Info* rt_info = 0; - switch (impl->get_rt_info (entry_point, rt_info)) - { - case ACE_Scheduler::SUCCEEDED: - return rt_info->handle; - break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: - default: - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::lookup - get_rt_info failed\n")); - // TODO: throw something. - break; - } - return -1; -} - -RtecScheduler::RT_Info* -ACE_Config_Scheduler::get (RtecScheduler::handle_t handle, - CORBA::Environment &_env) - ACE_THROW_SPEC((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK)) -{ - RtecScheduler::RT_Info* rt_info = 0; - switch (impl->lookup_rt_info (handle, rt_info)) - { - case ACE_Scheduler::SUCCEEDED: - { - // IDL memory managment semantics require the we return a copy - RtecScheduler::RT_Info* copy; - ACE_NEW_RETURN (copy, RtecScheduler::RT_Info (*rt_info), 0); - return copy; - } - break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: - default: - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::get - lookup_rt_info failed\n")); - // TODO: throw something. - break; - } - return 0; -} - -void ACE_Config_Scheduler::set (RtecScheduler::handle_t handle, - RtecScheduler::Time time, - RtecScheduler::Time typical_time, - RtecScheduler::Time cached_time, - RtecScheduler::Period period, - RtecScheduler::Importance importance, - RtecScheduler::Quantum quantum, - CORBA::Long threads, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK)) -{ - RtecScheduler::RT_Info* rt_info = 0; - switch (impl->lookup_rt_info (handle, rt_info)) - { - case ACE_Scheduler::SUCCEEDED: - rt_info->worst_case_execution_time = time; - rt_info->typical_execution_time = typical_time; - rt_info->cached_execution_time = cached_time; - rt_info->period = period; - rt_info->importance = importance; - rt_info->quantum = quantum; - rt_info->threads = threads; - break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: - default: - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::set - lookup_rt_info failed\n")); - // TODO: throw something. - break; - } -} - -void ACE_Config_Scheduler::priority (RtecScheduler::handle_t handle, - RtecScheduler::OS_Priority& priority, - RtecScheduler::Sub_Priority& subpriority, - RtecScheduler::Preemption_Priority& p_priority, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK, - RtecScheduler::NOT_SCHEDULED)) -{ - if (impl->priority (handle, priority, subpriority, p_priority) == -1) - { - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::priority - priority failed\n")); - // TODO: throw something. - } -} - -void ACE_Config_Scheduler::entry_point_priority (const char * entry_point, - RtecScheduler::OS_Priority& priority, - RtecScheduler::Sub_Priority& subpriority, - RtecScheduler::Preemption_Priority& p_priority, - CORBA::Environment &_env) - ACE_THROW_SPEC((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK, - RtecScheduler::NOT_SCHEDULED)) -{ - this->priority (lookup (entry_point, _env), - priority, subpriority, p_priority, - _env); -} - -void ACE_Config_Scheduler::add_dependency (RtecScheduler::handle_t handle, - RtecScheduler::handle_t dependency, - CORBA::Long number_of_calls, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK)) -{ - RtecScheduler::RT_Info* rt_info = 0; - switch (impl->lookup_rt_info (handle, rt_info)) - { - case ACE_Scheduler::SUCCEEDED: - { - RtecScheduler::Dependency_Info dep; - dep.rt_info = dependency; - dep.number_of_calls = number_of_calls; - ACE_Scheduler::add_dependency(rt_info, dep); - } - break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: - default: - ACE_ERROR ((LM_ERROR, - "cannot find %d to add dependency", handle)); - // TODO: throw something. - break; - } -} - -void ACE_Config_Scheduler::compute_scheduling (CORBA::Long minimum_priority, - CORBA::Long maximum_priority, - RtecScheduler::RT_Info_Set_out infos, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UTILIZATION_BOUND_EXCEEDED, - RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS, - RtecScheduler::TASK_COUNT_MISMATCH)) -{ - impl->init (minimum_priority, maximum_priority); - if (impl->schedule () != ACE_Scheduler::SUCCEEDED) - { - // TODO: throw something. - ACE_ERROR ((LM_ERROR, "schedule failed\n")); - return; - } - if (infos == 0) - { - infos = new RtecScheduler::RT_Info_Set(impl->tasks ()); - } - infos->length (impl->tasks ()); - for (RtecScheduler::handle_t handle = 1; - handle <= impl->tasks (); - ++handle) - { - RtecScheduler::RT_Info* rt_info = 0; - switch (impl->lookup_rt_info (handle, rt_info)) - { - case ACE_Scheduler::SUCCEEDED: - // We know that handles start at 1. - infos[handle - 1] = *rt_info; - break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: - default: - ACE_ERROR ((LM_ERROR, - "Config_Scheduler::schedule - lookup_rt_info failed\n")); - // TODO: throw something. - break; - } - } - ACE_DEBUG ((LM_DEBUG, "schedule prepared\n")); - - ACE_DEBUG ((LM_DEBUG, "dumping to stdout\n")); - ACE_Scheduler_Factory::dump_schedule (*infos, 0); - ACE_DEBUG ((LM_DEBUG, "dump done\n")); -} diff --git a/TAO/local/bin/Scheduling_Service/Config_Scheduler.h b/TAO/local/bin/Scheduling_Service/Config_Scheduler.h deleted file mode 100644 index 7da2739d2ec..00000000000 --- a/TAO/local/bin/Scheduling_Service/Config_Scheduler.h +++ /dev/null @@ -1,94 +0,0 @@ -// ============================================================================ -// -// $Id$ -// -// ============================================================================ - -#ifndef ACE_CONFIG_SCHEDULER_H -#define ACE_CONFIG_SCHEDULER_H - -#include <ace/OS.h> - -#include "RtecSchedulerS.h" -#include "Event_Service_Constants.h" - -class ACE_Config_Scheduler -: public POA_RtecScheduler::Scheduler - // = TITLE - // A (local) implementation for the RtecScheduler::Scheduler service. - // - // = DESCRIPTION - // This class implements a servant for the - // RtecScheduler::Scheduler service, using the Scheduler classes - // distributed with the EC. -{ -public: - ACE_Config_Scheduler (void); - virtual ~ACE_Config_Scheduler (void); - - virtual RtecScheduler::handle_t create (const char * entry_point, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::DUPLICATE_NAME)); - - virtual RtecScheduler::handle_t lookup (const char * entry_point, - CORBA::Environment &_env) - ACE_THROW_SPEC((CORBA::SystemException)); - - virtual RtecScheduler::RT_Info* get (RtecScheduler::handle_t handle, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::UNKNOWN_TASK)); - - virtual void set (RtecScheduler::handle_t handle, - RtecScheduler::Time time, - RtecScheduler::Time typical_time, - RtecScheduler::Time cached_time, - RtecScheduler::Period period, - RtecScheduler::Importance importance, - RtecScheduler::Quantum quantum, - CORBA::Long threads, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::UNKNOWN_TASK)); - - virtual void priority (RtecScheduler::handle_t handle, - RtecScheduler::OS_Priority& priority, - RtecScheduler::Sub_Priority& subpriority, - RtecScheduler::Preemption_Priority& p_priority, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK, - RtecScheduler::NOT_SCHEDULED)); - - virtual void entry_point_priority (const char * entry_point, - RtecScheduler::OS_Priority& priority, - RtecScheduler::Sub_Priority& subpriority, - RtecScheduler::Preemption_Priority& p_priority, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK, - RtecScheduler::NOT_SCHEDULED)); - - virtual void add_dependency (RtecScheduler::handle_t handle, - RtecScheduler::handle_t dependency, - CORBA::Long number_of_calls, - CORBA::Environment &_env) - ACE_THROW_SPEC ((CORBA::SystemException, - RtecScheduler::UNKNOWN_TASK)); - - virtual void compute_scheduling (CORBA::Long minimum_priority, - CORBA::Long maximum_priority, - RtecScheduler::RT_Info_Set_out infos, - CORBA::Environment &_env) - ACE_THROW_SPEC((CORBA::SystemException, - RtecScheduler::UTILIZATION_BOUND_EXCEEDED, - RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS, - RtecScheduler::TASK_COUNT_MISMATCH)); - -private: - class ACE_Scheduler* impl; -}; - -#if defined (__ACE_INLINE__) -#include "Config_Scheduler.i" -#endif /* __ACE_INLINE__ */ - -#endif /* ACE_CONFIG_SCHEDULER_H */ diff --git a/TAO/local/bin/Scheduling_Service/Config_Scheduler.i b/TAO/local/bin/Scheduling_Service/Config_Scheduler.i deleted file mode 100644 index a21ea7f9897..00000000000 --- a/TAO/local/bin/Scheduling_Service/Config_Scheduler.i +++ /dev/null @@ -1,5 +0,0 @@ -// ============================================================================ -// -// $Id$ -// -// ============================================================================ diff --git a/TAO/local/bin/Scheduling_Service/Makefile b/TAO/local/bin/Scheduling_Service/Makefile deleted file mode 100644 index d5f61ab1eb4..00000000000 --- a/TAO/local/bin/Scheduling_Service/Makefile +++ /dev/null @@ -1,752 +0,0 @@ -# -# $Id$ -# - -BIN = schedule_service dump_schedule -BUILD = $(BIN) - -SCHEDULE_SRCS = \ - schedule_service.cpp \ - Config_Scheduler.cpp \ - Scheduler.cpp \ - Scheduler_Internal.cpp -DUMP_SRCS = \ - dump_schedule.cpp - -LSRC = $(SCHEDULE_SRCS) \ - $(DUMP_SRCS) - -SCHEDULE_OBJS=$(SCHEDULE_SRCS:.cpp=.o) -DUMP_OBJS=$(DUMP_SRCS:.cpp=.o) - -LDLIBS = -lorbsvcs -lTAO -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(ACE_ROOT)/include/makeinclude/macros.GNU -include $(ACE_ROOT)/include/makeinclude/rules.common.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU -#include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU -include $(ACE_ROOT)/include/makeinclude/rules.local.GNU - -ifndef TAO_ROOT -TAO_ROOT = $(ACE_ROOT)/TAO -endif -TSS_ORB_FLAG = #-DTAO_HAS_TSS_ORBCORE -DCFLAGS = -g -LDFLAGS += -L$(TAO_ROOT)/orbsvcs/lib -L$(TAO_ROOT)/tao -CPPFLAGS += -I$(TAO_ROOT)/orbsvcs/lib -I$(TAO_ROOT) -I$(TAO_ROOT)/tao/compat $(TSS_ORB_FLAG)#-H - -schedule_service: $(addprefix $(VDIR),$(SCHEDULE_OBJS)) - $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) - -dump_schedule: $(addprefix $(VDIR),$(DUMP_OBJS)) - $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) - - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/schedule_service.o .shobj/schedule_service.: schedule_service.cpp \ - $(ACE_ROOT)/ace/CORBA_Handler.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Pipe.h \ - $(ACE_ROOT)/ace/Pipe.i \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/tao_internals.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - Config_Scheduler.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - Config_Scheduler.i -.obj/Config_Scheduler.o .shobj/Config_Scheduler.: Config_Scheduler.cpp Scheduler_Internal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Containers.i \ - Scheduler.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/tao_internals.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - Scheduler.i Scheduler_Internal.i Config_Scheduler.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerS.i \ - Config_Scheduler.i -.obj/Scheduler.o .shobj/Scheduler.: Scheduler.cpp \ - $(ACE_ROOT)/ace/Sched_Params.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Sched_Params.i \ - Scheduler_Internal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - Scheduler.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/tao_internals.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - Scheduler.i Scheduler_Internal.i -.obj/Scheduler_Internal.o .shobj/Scheduler_Internal.: Scheduler_Internal.cpp \ - \ - \ - $(ACE_ROOT)/ace/Sched_Params.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Sched_Params.i \ - Scheduler_Internal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - Scheduler.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/tao_internals.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - Scheduler.i Scheduler_Internal.i -.obj/dump_schedule.o .shobj/dump_schedule.: dump_schedule.cpp \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/local/bin/Scheduling_Service/Scheduler.cpp b/TAO/local/bin/Scheduling_Service/Scheduler.cpp deleted file mode 100644 index b71e0679469..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler.cpp +++ /dev/null @@ -1,291 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler.cpp -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#include "ace/Sched_Params.h" -#include "Scheduler.h" - -#if ! defined (__ACE_INLINE__) -#include "Scheduler.i" -#endif /* __ACE_INLINE__ */ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class Scheduler static members -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -const ACE_Scheduler::mode_t ACE_Scheduler::CURRENT_MODE = 0xFFFFFFFF; - -ACE_Scheduler *ACE_Scheduler::instance_ = 0; - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class ACE_Scheduler static functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -void -ACE_Scheduler::output (FILE *file, const status_t status) -{ - switch (status) - { - case NOT_SCHEDULED : - ACE_OS::fprintf (file, "NOT_SCHEDULED"); - break; - case SUCCEEDED : - ACE_OS::fprintf (file, "SUCCEEDED"); - break; - case ST_TASK_ALREADY_REGISTERED : - ACE_OS::fprintf (file, "TASK_ALREADY_REGISTERED"); - break; - case ST_VIRTUAL_MEMORY_EXHAUSTED : - ACE_OS::fprintf (file, "VIRTUAL_MEMORY_EXHAUSTED"); - break; - case ST_UNKNOWN_TASK : - ACE_OS::fprintf (file, "UNKNOWN_TASK"); - break; - case INVALID_MODE : - ACE_OS::fprintf (file, "INVALID_MODE"); - break; - case MODE_COUNT_MISMATCH : - ACE_OS::fprintf (file, "MODE_COUNT_MISMATCH"); - break; - case TASK_COUNT_MISMATCH : - ACE_OS::fprintf (file, "TASK_COUNT_MISMATCH"); - break; - case INVALID_PRIORITY : - ACE_OS::fprintf (file, "INVALID_PRIORITY"); - break; - - // The following are only used during scheduling (in the case of - // off-line scheduling, they are only used prior to runtime). - // To save a little code space (280 bytes on g++ 2.7.2/Solaris 2.5.1), - // we could conditionally compile them so that they're not in the - // runtime version. - case ST_UTILIZATION_BOUND_EXCEEDED : - ACE_OS::fprintf (file, "UTILIZATION_BOUND_EXCEEDED"); - break; - case ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS : - ACE_OS::fprintf (file, "INSUFFICIENT_THREAD_PRIORITY_LEVELS"); - break; - case ST_CYCLE_IN_DEPENDENCIES : - ACE_OS::fprintf (file, "CYCLE_IN_DEPENDENCIES"); - break; - case UNABLE_TO_OPEN_SCHEDULE_FILE : - ACE_OS::fprintf (file, "UNABLE_TO_OPEN_SCHEDULE_FILE"); - break; - case UNABLE_TO_WRITE_SCHEDULE_FILE : - ACE_OS::fprintf (file, "UNABLE_TO_WRITE_SCHEDULE_FILE"); - break; - // End of config-only status values. - - default: - ACE_OS::fprintf (file, "UNKNOWN STATUS: %d", status); - } -} - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class ACE_Scheduler member functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -ACE_Scheduler::ACE_Scheduler () : - minimum_priority_queue_ (0), // Could initialize this to -1, but it's - // unsigned and we don't really need to - // distinguish between no queues and one - // queue. - modes_ (0), - tasks_ (0), - threads_ (0), - mode_ (0), - status_ (NOT_SCHEDULED), - output_level_ (0) -{ -} - - -ACE_Scheduler::~ACE_Scheduler () -{ -} - - -// ************************************************************ - -ACE_Scheduler::status_t -ACE_Scheduler::get_rt_info (Object_Name name, - RT_Info* &rtinfo) -{ - handle_t handle; - - // This makes a copy. We can optimize this with our own string - // class. - ACE_CString lookup (name); - // Search the map for the <name>. If found, return the RT_Info. - RT_Info **info_array = 0; - if (info_collection_.find (lookup, info_array) >= 0) - { - rtinfo = info_array[0]; - // If we find it, return. - return SUCCEEDED; - } - else - // Otherwise, make one, bind it, and register it. - { - rtinfo = new RT_Info; - rtinfo->entry_point = name; - // Create and array (size one) of RT_Info* - info_array = new RT_Info*[1]; - info_array[0] = rtinfo; - // Bind the rtinfo to the name. - if (info_collection_.bind (lookup, info_array) != 0) - { - delete rtinfo; - delete info_array; - rtinfo = 0; - return FAILED; // Error! - } - else - { - // Register the array. - status_t result = this->register_task (info_array, 1, handle); - if (result == SUCCEEDED) - { - rtinfo->handle = handle; - return ST_UNKNOWN_TASK; // Didn't find it, but made one! - } - else - { - rtinfo->handle = 0; - return FAILED; - } - } - } -} - - - -int ACE_Scheduler::number_of_dependencies(RT_Info* rt_info) -{ - return rt_info->dependencies.length(); -} - -int ACE_Scheduler::number_of_dependencies(RT_Info& rt_info) -{ - return rt_info.dependencies.length(); -} - -int ACE_Scheduler::add_dependency(RT_Info* rt_info, - const Dependency_Info& d) -{ - ACE_DEBUG ((LM_DEBUG, "adding dependecy to: %s\n", - (const char*)rt_info->entry_point)); - RtecScheduler::Dependency_Set& set = rt_info->dependencies; - int l = set.length(); - set.length(l + 1); - set[l] = d; - return 0; -} - -void ACE_Scheduler::export(RT_Info* info, FILE* file) -{ - export(*info, file); -} - -void ACE_Scheduler::export(RT_Info& info, FILE* file) -{ - // The divide-by-1 is for ACE_U_LongLong support. - (void) ACE_OS::fprintf (file, - "%s\n%d\n%ld\n%ld\n%ld\n%ld\n%d\n%ld\n%u\n" - "# begin dependencies\n%d\n", - (const char*)info.entry_point, - info.handle, - info.worst_case_execution_time / 1, - info.typical_execution_time / 1, - info.cached_execution_time / 1, - info.period, - info.importance, - info.quantum / 1, - info.threads, - number_of_dependencies(info)); - - for (int i = 0; i < number_of_dependencies(info); ++i) - { - RT_Info tmp; - // TODO: info.dependencies [i].rt_info >>= &tmp; - (void) ACE_OS::fprintf (file, "%s, %d\n", - (const char*)tmp.entry_point, - info.dependencies[i].number_of_calls); - - } - - (void) ACE_OS::fprintf (file, "# end dependencies\n%d\n%d\n\n", - info.priority, - info.subpriority); - - -} - - - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Lock_Adapter<ACE_Null_Mutex>; -template class ACE_Map_Entry<ACE_CString, ACE_Scheduler::RT_Info **>; - -#if defined (ACE_HAS_THREADS) - template class ACE_Lock_Adapter<ACE_RW_Thread_Mutex>; - template class ACE_Lock_Adapter<ACE_Thread_Mutex>; - template class ACE_Map_Manager<ACE_CString, - ACE_Scheduler::RT_Info **, - ACE_Thread_Mutex>; - template class ACE_Map_Iterator<ACE_CString, ACE_Scheduler::RT_Info **, - ACE_Thread_Mutex>; - template class ACE_Read_Guard<ACE_Thread_Mutex>; - template class ACE_Write_Guard<ACE_Thread_Mutex>; -#else - template class ACE_Map_Manager<ACE_CString, RT_Info **, - ACE_Null_Mutex>; - template class ACE_Map_Iterator<ACE_CString, RT_Info **, - ACE_Null_Mutex>; - template class ACE_Read_Guard<ACE_Null_Mutex>; - template class ACE_Write_Guard<ACE_Null_Mutex>; -#endif /* ACE_HAS_THREADS */ -#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate class ACE_Lock_Adapter<ACE_Null_Mutex> -#pragma instantiate class ACE_Map_Entry<ACE_CString, RT_Info **> -#pragma instantiate class ACE_Singleton<ACE_Scheduler::TaskManager> - -#if defined (ACE_HAS_THREADS) -#pragma instantiate class ACE_Lock_Adapter<ACE_RW_Thread_Mutex> -#pragma instantiate class ACE_Lock_Adapter<ACE_Thread_Mutex> -#pragma instantiate class ACE_Map_Manager<ACE_CString, RT_Info **, ACE_Thread_Mutex> -#pragma instantiate class ACE_Map_Iterator<ACE_CString, RT_Info **, ACE_Thread_Mutex> -#pragma instantiate class ACE_Read_Guard<ACE_Thread_Mutex> -#pragma instantiate class ACE_Write_Guard<ACE_Thread_Mutex> -#else -#pragma instantiate class ACE_Map_Manager<ACE_CString, RT_Info **, ACE_Null_Mutex> -#pragma instantiate class ACE_Map_Iterator<ACE_CString, RT_Info **, ACE_Null_Mutex> -#pragma instantiate class ACE_Read_Guard<ACE_Null_Mutex> -#pragma instantiate class ACE_Write_Guard<ACE_Null_Mutex> -#endif /* ACE_HAS_THREADS */ - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler.h b/TAO/local/bin/Scheduling_Service/Scheduler.h deleted file mode 100644 index c24d9f91f44..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler.h +++ /dev/null @@ -1,278 +0,0 @@ -/* -*- C++ -*- */ -// -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler.h -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#if ! defined (SCHEDULER_H) -#define SCHEDULER_H - -#include "ace/ACE.h" -#include "ace/Map_Manager.h" -#include "ace/Message_Block.h" -#include "ace/Synch.h" -#include "ace/SString.h" - -#include "RtecSchedulerC.h" -#include "Event_Service_Constants.h" - -class ACE_Scheduler - // = TITLE - // Thread scheduler interface. - // - // = DESCRIPTION - // This virtual base class is the interface to either an off-line - // scheduler, or to the necessary on-line component of the Scheduler. -{ -public: - typedef u_int mode_t; - - typedef RtecScheduler::handle_t handle_t; - typedef RtecScheduler::Dependency_Info Dependency_Info; - typedef RtecScheduler::Preemption_Priority Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Thread_Priority; - typedef RtecScheduler::Sub_Priority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - // Map some types to simplify re-use. - - typedef const char *Object_Name; - // Objects are named by unique strings. - - static const mode_t CURRENT_MODE; - - enum status_t { - // The following are used both by the runtime Scheduler and during - // scheduling. - NOT_SCHEDULED = -1 // the schedule () method has not been called yet - , FAILED = -1 - , SUCCEEDED - , ST_UNKNOWN_TASK - , ST_TASK_ALREADY_REGISTERED - , ST_VIRTUAL_MEMORY_EXHAUSTED - - // The following are only used by the runtime Scheduler. - , INVALID_MODE - , MODE_COUNT_MISMATCH // only used by schedule () - , TASK_COUNT_MISMATCH // only used by schedule () - , INVALID_PRIORITY // only used by schedule (): mismatch of - // (off-line, maybe) Scheduler output to - // the runtime Scheduler component. - - // The following are only used during scheduling (in the case of - // off-line scheduling, they are only used prior to runtime). - , ST_UTILIZATION_BOUND_EXCEEDED - , ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS - , ST_CYCLE_IN_DEPENDENCIES - , UNABLE_TO_OPEN_SCHEDULE_FILE - , UNABLE_TO_WRITE_SCHEDULE_FILE - }; - - virtual ~ACE_Scheduler (); - - // = Utility function for outputting the textual representation of a - // status_t value to a FILE. - static void output (FILE *, const status_t); - - // = Initialize the scheduler. - virtual void init (const int minimum_priority, - const int maximum_priority, - const char *runtime_filename = 0, - const char *rt_info_filename = 0, - const char *timeline_filename = 0) = 0; - // The minimum and maximum priority are the OS-specific priorities that - // are used when creating the schedule (assigning priorities). The - // minimum_priority is the priority value of the lowest priority. - // It may be numerically higher than the maximum_priority, on OS's such - // as VxWorks that use lower values to indicate higher priorities. - // - // When Scheduler::schedule is called, the schedule is output to the - // file named by "runtime_filename" if it is non-zero. - // This file is compilable; it is linked into the runtime executable - // to provide priorities to the runtime scheduling component. - // If the "rt_info_filename" is non-zero, the RT_Info for - // every task is exported to it. It is not used at runtime. - // If the "timeline_filename" is non-zero, the timeline output - // file is created. It is not used at runtime. - // - // The runtime scheduling component ignores these filenames. It just - // uses the priorities that were linked in to the executable, after - // converting them to platform-specific values. - - // = Registers a task. - virtual status_t register_task (RT_Info *[], - const u_int number_of_modes, - handle_t &handle) = 0; - // If the Task registration succeeds, this function returns SUCCEEDED - // and sets "handle" to a unique identifier for the task. - // Otherwise, it returns either VIRTUAL_MEMORY_EXHAUSTED or - // TASK_ALREADY_REGISTERED sets the handle to 0. (A task may - // only be registered once.) - // The RT_Info * array is indexed by mode; there must be one element for - // each mode, as specified by number_of_modes. If a task does not - // run in a mode, then its entry in the array for that mode must - // be 0. - - virtual status_t get_rt_info (Object_Name name, - RT_Info* &rtinfo); - // Tries to find the RT_Info corresponding to <name> in the RT_Info - // database. Returns SUCCEEDED if <name> was found and <rtinfo> was - // set. Returns UNKNOWN_TASK if <name> was not found, but <rtinfo> - // was set to a newly allocated RT_Info. In this UNKNOWN_TASK case, - // the task must call RT_Info::set to fill in execution properties. - // In the SUCCEEDED and UNKNOWN_TASK cases, this->register_task - // (rtinfo, 0, handle) is called. Returns FAILED if an error - // occurs. - // - // One motivation for allocating RT_Info's from within the Scheduler - // is to allow RT_Infos to persist after the tasks that use them. - // For instance, we may want to call this->schedule right before the - // application exits a configuration run. If the tasks have been - // deleted (deleting their RT_Infos with them), this->schedule will - // fail. - - virtual status_t lookup_rt_info (handle_t handle, - RT_Info* &rtinfo) = 0; - // Obtains an RT_Info based on its "handle". - - // = Computes the schedule. - virtual status_t schedule (void) = 0; - // This actually generates the files. - - // = Access a thread priority. - virtual int priority (const handle_t handle, - OS_Thread_Priority &priority, - Sub_Priority &subpriority, - Preemption_Priority &preemption_prio, - const mode_t = CURRENT_MODE) const = 0; - // Defines "priority" as the priority that was assigned to the Task that - // was assigned "handle", for the specified mode. Defines "subpriority" - // as the relative ordering (due to dependencies) within the priority. - // Returns 0 on success, or -1 if an invalid mode or handle are supplied. - // Queue numbers are platform-independent priority values, ranging from - // a highest priority value of 0 to the lowest priority value, which is - // returned by "minimum_priority_queue ()". - - // = Access the platform-independent priority value of the lowest-priority - // thread. - u_int minimum_priority_queue () const { return minimum_priority_queue_; } - // This is intended for use by the Event Channel, so it can determine the - // number of priority dispatch queues to create. - - // = Access the number of modes. - u_int modes () const { return modes_; } - - // = Access the number of tasks. - u_int tasks () const { return tasks_; } - - // = Access the number of threads. - u_int threads () const { return threads_; } - - // = Access the current mode. - mode_t mode () const { return mode_; } - - // = Set the current mode. - void mode (const mode_t mode) { mode_ = mode; } - - // = Access the current scheduler status. - status_t status () const { return status_; } - - // = Access the current output (debugging) level. - u_int output_level () const { return output_level_; } - // Default is 0; set to 1 to print out schedule, by task. Set - // to higher than one for debugging info. - - // = Set the scheduler output (debugging) level. - void output_level (const u_int level) { output_level_ = level; } - // the only supported levels are 0 (quiet), 1 (verbose) and 2 - // (debug) - - static int add_dependency(RT_Info* rt_info, - const Dependency_Info& d); - - static int number_of_dependencies(RT_Info* rt_info); - static int number_of_dependencies(RT_Info& rt_info); - - static void export(RT_Info*, FILE* file); - static void export(RT_Info&, FILE* file); - -protected: - ACE_Scheduler (); - - // = Set the minimum priority value. - void minimum_priority_queue (const u_int minimum_priority_queue_number) - { minimum_priority_queue_ = minimum_priority_queue_number; } - - // = Set the number of modes. - void modes (const u_int modes) { modes_ = modes; } - - // = Set the number of tasks. - void tasks (const u_int tasks) { tasks_ = tasks; } - - // = Set the number of threads. - void threads (const u_int threads) { threads_ = threads; } - - // = Set the current scheduler status. - void status (const status_t new_status) { status_ = new_status; } - -private: - typedef ACE_CString EXT; - typedef RT_Info **INT; - -#if defined (ACE_HAS_THREADS) - typedef ACE_Thread_Mutex SYNCH; -#else - typedef ACE_Null_Mutex SYNCH; -#endif /* ACE_HAS_THREADS */ - - typedef ACE_Map_Manager<EXT, INT, SYNCH> Info_Collection; - typedef ACE_Map_Iterator<EXT, INT, SYNCH> Info_Collection_Iterator; - typedef ACE_Map_Entry<EXT, INT> Info_Collection_Entry; - - Info_Collection info_collection_; - // A binding of name to rt_info. This is the mapping for every - // rt_info in the process. - - static ACE_Scheduler *instance_; - - u_int minimum_priority_queue_; - // The platform-independent priority value of the Event Channel's - // minimum priority dispatch queue. The value of the maximum priority - // dispatch queue is always 0. - - u_int modes_; - u_int tasks_; - u_int threads_; - - mode_t mode_; - status_t status_; - u_int output_level_; - - // the following functions are not implememented - ACE_UNIMPLEMENTED_FUNC(ACE_Scheduler (const ACE_Scheduler &)) - ACE_UNIMPLEMENTED_FUNC(ACE_Scheduler &operator= (const ACE_Scheduler &)) -}; - -typedef ACE_Scheduler Scheduler; - -#if defined (__ACE_INLINE__) -#include "Scheduler.i" -#endif /* __ACE_INLINE__ */ - -#endif /* SCHEDULER_H */ - - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler.i b/TAO/local/bin/Scheduling_Service/Scheduler.i deleted file mode 100644 index 57875ae26d1..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler.i +++ /dev/null @@ -1,20 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler.i -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -// EOF - diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.cpp b/TAO/local/bin/Scheduling_Service/Scheduler_Generic.cpp deleted file mode 100644 index 67f87d30cba..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.cpp +++ /dev/null @@ -1,528 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Generic.cpp -// -// = CREATION DATE -// 19 November 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#include "ace/Sched_Params.h" - -#include "Scheduler_Generic.h" - -#if ! defined (__ACE_INLINE__) -#include "Scheduler_Generic.i" -#endif /* __ACE_INLINE__ */ - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// static functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Structure for storing the RT_Info information for each task, per mode. -struct Mode_Entry -{ - RtecScheduler::RT_Info *rt_info_; - u_long start_time_; // microseconds - u_long stop_time_; // microseconds - - Mode_Entry() : - rt_info_ (0), - start_time_ (0), - stop_time_ (0) - { - } - - Mode_Entry(RtecScheduler::RT_Info *const rt_info, - const u_long start_time = 0, - const u_long stop_time = 0) : - rt_info_ (rt_info), - start_time_ (start_time), - stop_time_ (stop_time) - { - } - - ~Mode_Entry () {} - - Mode_Entry &operator= (const Mode_Entry &entry) - { - if (this != &entry) - { - rt_info_ = entry.rt_info_; - start_time_ = entry.start_time_; - stop_time_ = entry.stop_time_; - } - - return *this; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class Scheduler_Generic member functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -Scheduler_Generic::Scheduler_Generic () : - Scheduler (), - handles_ (0), - // Set the minimum priority to that for the current platform. This - // shouldn't be necessary, but UPSingleProcessorOrb::initialize_reactors - // creates threads before the Event Channel calls Scheduler::init (). - minimum_priority_ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_THREAD)), - increasing_priority_ (-1), - task_entries_ () -{ -} - - -Scheduler_Generic::~Scheduler_Generic () -{ - reset (); -} - - -void -Scheduler_Generic::reset () -{ -} - -Scheduler::status_t -Scheduler_Generic::lookup_rt_info (handle_t handle, - RT_Info*& rtinfo) -{ - if (handle < 0 || (size_t) handle > task_entries_.size ()) - { - return ST_UNKNOWN_TASK; - } - RT_Info*** entry; - ACE_Unbounded_Set_Iterator <RT_Info **> i (task_entries_); - while (i.next (entry) != 0) - { - i.advance (); - RT_Info** array = *entry; - if (array[0]->handle == handle) - { - rtinfo = array[0]; - return SUCCEEDED; - } - } - - return ST_UNKNOWN_TASK; -} - - -Scheduler::status_t -Scheduler_Generic::register_task (RT_Info *rt_info [], - const u_int number_of_modes, - handle_t &handle) -{ - status_t ret; - - // try to store the new task's information . . . - switch (task_entries_.insert (rt_info)) - { - case 0 : // successfully inserted - { - rt_info [0]->handle = (handle = ++handles_); - - // assigned the same handle to the RT_Info for each of its modes - for (u_int i = 1; i < number_of_modes; ++i) - { - if (rt_info [i] != 0) - rt_info [i]->handle = handle; - } - - if (number_of_modes > modes ()) - { - modes (number_of_modes); - } - - ret = SUCCEEDED; - - if (output_level () >= 5) - { - ACE_OS::printf ("registered task \"%s\" with RT_Info starting " - "at %X\n", - (const char*)rt_info[0]->entry_point, - (void *) rt_info[0]); - } - } - break; - - case 1 : // the entry had already been inserted - handle = 0; - ret = ST_TASK_ALREADY_REGISTERED; - break; - - default : - // case -1 : insert failed, probably because virtual memory exhaused - handle = 0; - ret = ST_VIRTUAL_MEMORY_EXHAUSTED; - break; - } - - return ret; -} - - -void -Scheduler_Generic::init (const int minimum_priority, - const int maximum_priority, - const char *runtime_filename, - const char *rt_info_filename, - const char *timeline_filename) -{ - minimum_priority_ = minimum_priority; - maximum_priority_ = maximum_priority; - runtime_filename_ = runtime_filename; - rt_info_filename_ = rt_info_filename; - timeline_filename_ = timeline_filename; -} - - -Scheduler::status_t -Scheduler_Generic::schedule (void) -{ - ACE_Guard<LOCK> ace_mon (lock_); - - // here goes . . . - - increasing_priority_ = maximum_priority_ >= minimum_priority_; - - status_t status = NOT_SCHEDULED; - - // store number of tasks, based on registrations - tasks (task_entries_.size ()); - - if (output_level () > 0) - { - print_schedule (); - } - - if (runtime_filename_ != 0 && - (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED)) - { - status = store_schedule (runtime_filename_); - } - - if ((status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED) && rt_info_filename_) - { - status = store_rt_info (rt_info_filename_); - } - - // If there was a failure, (try to) remove the output files. - if (! (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED)) - { - if (runtime_filename_ && unlink ((char *) runtime_filename_) - && errno != ENOENT) - { - ACE_OS::perror ("Scheduler_Generic::schedule (); " - "unable to remove schedule file"); - } - if (rt_info_filename_ && unlink ((char *) rt_info_filename_) && - errno != ENOENT) - { - ACE_OS::perror ("Scheduler_Generic::schedule (); " - "unable to remove rt_info file"); - } - } - - return status; -} - - -int -Scheduler_Generic::priority (const handle_t handle, - OS_Thread_Priority &priority, - Sub_Priority &subpriority, - Preemption_Priority &preemption_prio, - const mode_t requested_mode) const -{ - ACE_UNUSED_ARG (handle); - ACE_UNUSED_ARG (requested_mode); - - priority = minimum_priority_; - subpriority = ACE_Scheduler_MIN_SUB_PRIORITY; - preemption_prio = ACE_Scheduler_MAX_PREEMPTION_PRIORITY; - - if (output_level () >= 3) - { - ACE_OS::printf ("preemption_prio %d: min %d, pri %d, min_pri %d\n", - preemption_prio, minimum_priority_queue (), - priority, minimum_priority_); - } - - return 0; -} - - -void -Scheduler_Generic::print_schedule () -{ -} - - -Scheduler::status_t -Scheduler_Generic::store_schedule (const char *filename) -{ - u_int i; - RT_Info ***entry; - FILE *const file = ACE_OS::fopen (filename, "w"); - - if (file) - { - ACE_OS::fprintf (file, "\ -// Automatically generated \"%s\"\n\ -\n\ -#include \"Scheduler_Runtime.h\"\n\ -\n\ -static const unsigned int MODES = %u;\n\ -static const unsigned int TASKS = %u;\n\ -static const unsigned int THREADS = %u;\n\ -static const unsigned int MINIMUM_PRIORITY_QUEUE = %u;\n\ -\n\ -int\n\ -Scheduler_Runtime_registered_tasks_ [TASKS] = { 0 };\n\ -\n\ -const char *\n\ -Scheduler_Runtime_task_names_ [TASKS] =\n\ - {\n\ -", filename, - modes (), - tasks (), - threads (), - minimum_priority_queue ()); - - ACE_Unbounded_Set_Iterator <RT_Info **> - task_entries_i (task_entries_); - i = 0; - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - ACE_OS::fprintf (file, " \"%s\"%s\n", - (const char*) (*entry) [0]->entry_point, - ++i == tasks () ? "" : ","); - } - - ACE_OS::fprintf (file, "\ - };\n\ -\n\ -int\n\ -Scheduler_Runtime_priorities_ [MODES][TASKS][3] =\n\ - {\n\ -"); - - for (i = 0; i < modes (); ++i) - { - ACE_OS::fprintf (file, " { /* mode %u */\n", i); - - ACE_Unbounded_Set_Iterator <RT_Info **> - task_entries_i (task_entries_); - u_int j = 0; - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - - RtecScheduler::OS_Priority priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_prio; - this->priority (0, priority, subpriority, preemption_prio, j); - - ACE_OS::fprintf (file, " \"%s\"%s\n", - (const char*) (*entry) [0]->entry_point, - j + 1 == tasks () ? "" : ","); - - ACE_OS::fprintf (file, " { %d, %d, %u }%s\n", - priority, - subpriority, - preemption_prio, - ++j == tasks () ? "" : ","); - } - ACE_OS::fprintf (file, " }%s /* end mode %u */\n", - i == modes () - 1 ? "" : ",", i); - } - - ACE_OS::fprintf (file, "\ - };\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::modes ()\n\ -{\n\ - return MODES;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::tasks ()\n\ -{\n\ - return TASKS;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::threads ()\n\ -{\n\ - return THREADS;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::minimum_priority_queue ()\n\ -{\n\ - return MINIMUM_PRIORITY_QUEUE;\n\ -}\n\ -\n\ -const char *\n\ -Scheduler_Runtime::task_name (const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_task_names_ [handle - 1];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::priority (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][0];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::subpriority (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][1];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::preemption_prio (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][2];\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::config ()\n\ -{\n\ - return 0;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::find (const char *operation_name)\n\ -{\n\ - for (unsigned int i = 0; i < TASKS; ++i)\n\ - if (! ACE_OS::strcmp (operation_name,\n\ - Scheduler_Runtime_task_names_ [i]))\n\ - return i + 1;\n\ -\n\ - return 0;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::register_task (const unsigned int task)\n\ -{\n\ - if (Scheduler_Runtime_registered_tasks_ [task - 1] == 1)\n\ - {\n\ - return 0;\n\ - }\n\ - else\n\ - {\n\ - Scheduler_Runtime_registered_tasks_ [task - 1] = 1;\n\ - return task;\n\ - }\n\ -}\n\ -\n\ -"); - - if (ACE_OS::fprintf (file, "// EOF\n") > 0 && - ACE_OS::fclose (file) == 0) - { - return SUCCEEDED; - } - else - { - return UNABLE_TO_WRITE_SCHEDULE_FILE; - } - } - else - { - return UNABLE_TO_OPEN_SCHEDULE_FILE; - } -} - - -Scheduler::status_t -Scheduler_Generic::store_rt_info (const char *filename) -{ - FILE *file = ACE_OS::fopen (filename, "w"); - if (file) - { - const time_t now = ACE_OS::time (0); - - (void) ACE_OS::fprintf (file, - "# RT_Info provided for \"%s\" %s" - "# Version 1.1\n" - "# Format for each entry:\n" - "# entry name\n" - "# handle\n" - "# worst case execution time\n" - "# typical execution time\n" - "# cached execution time\n" - "# period\n" - "# importance\n" - "# quantum\n" - "# begin dependencies\n" - "# number of dependencies\n" - "# entry name, number of calls " - "(one of these lines per dependency, if any)\n" - "# end dependencies\n" - "# priority\n" - "# order within priority\n\n" - "%u modes\n%u operations\n\n", - filename, ACE_OS::ctime (&now), - modes (), tasks ()); - - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> - task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - export ((*entry) [0], file); - } - } - else - { - return UNABLE_TO_OPEN_SCHEDULE_FILE; - } - - if (ACE_OS::fprintf (file, "\n# end of file\n", 1) > 0 && - ACE_OS::fclose (file) == 0) - { - return SUCCEEDED; - } - else - { - return UNABLE_TO_WRITE_SCHEDULE_FILE; - } -} - - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Node<RtecScheduler::RT_Info **>; -template class ACE_Unbounded_Set<RtecScheduler::RT_Info **>; -template class ACE_Unbounded_Set_Iterator<RtecScheduler::RT_Info **>; -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.h b/TAO/local/bin/Scheduling_Service/Scheduler_Generic.h deleted file mode 100644 index 37c09f6b12d..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Generic.h -// -// = CREATION DATE -// 19 November 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#if ! defined (SCHEDULER_INTERNAL_H) -#define SCHEDULER_INTERNAL_H - -#include "Scheduler.h" - -class Scheduler_Generic : public ACE_Scheduler - // = TITLE - // Implementation of an off-line scheduler. - // - // = DESCRIPTION - // Schedules tasks, assigning the same priority to all of them. -{ -public: - Scheduler_Generic (); - virtual ~Scheduler_Generic (); - - // = Initialize the scheduler. - virtual void init (const int minimum_priority, - const int maximum_priority, - const char *runtime_filename = 0, - const char *rt_info_filename = 0, - const char *timeline_filename = 0); - - // = Registers a task. - virtual status_t register_task (RT_Info *[], - const u_int number_of_modes, - handle_t &handle); - - virtual status_t lookup_rt_info (handle_t handle, - RT_Info* &rtinfo); - // Obtains an RT_Info based on its "handle". - - // = Computes the schedule. - virtual status_t schedule (void); - - // = Access a thread priority. - virtual int priority (const handle_t handle, - OS_Thread_Priority &priority, - Sub_Priority &subpriority, - Preemption_Priority &preemption_prio, - const mode_t = CURRENT_MODE) const; - // Defines "priority" as the priority that was assigned to the Task that - // was assigned "handle", for the specified mode. Defines "subpriority" - // as the relative ordering (due to dependencies) within the priority. - // Returns 0 on success, or 1 if an invalid mode or handle are supplied. - -private: - u_int handles_; - // The number of task handles dispensed so far. - - int minimum_priority_; - // The minimum priority value that the application specified (in - // its call to init ()). - - int maximum_priority_; - // The maximum priority value that the application specified (in - // its call to init ()). - - const char *runtime_filename_; - // Destination file of Scheduler output from the configuration run. - - const char *rt_info_filename_; - // Destination file of all rt_info data from the configuration run. - - const char *timeline_filename_; - // The destination of the timeline. - - int increasing_priority_; - // Set to 1 if priority values increase with increasing priority, - // such as on Solaris and Win32, or 0 if they decrease, such as on - // VxWorks. - - ACE_Unbounded_Set <RT_Info **> task_entries_; - // Collection of known tasks. - -#if defined (ACE_HAS_THREADS) - typedef ACE_Recursive_Thread_Mutex LOCK; -#else - typedef ACE_Null_Mutex LOCK; -#endif /* ACE_HAS_THREADS */ - - LOCK lock_; - // This protects access to the scheduler during configuration runs. - - - /////////////////////////////////////// - // member functions for internal use // - /////////////////////////////////////// - - void reset (); - // Prepare for another schedule computation, but do not - // disturb the "output" (priorities that have already been assigned). - - void print_schedule (); - // Display the schedule, task-by-task. - - status_t store_schedule (const char *filename); - // Store the schedule in the named file. - - status_t store_rt_info (const char *filename); - // Export all RT_Info to the named file. - - ACE_UNIMPLEMENTED_FUNC (Scheduler_Generic (const Scheduler_Generic &)) - ACE_UNIMPLEMENTED_FUNC (Scheduler_Generic &operator= ( - const Scheduler_Generic &)) -}; - - -#if defined (__ACE_INLINE__) -#include "Scheduler_Generic.i" -#endif /* __ACE_INLINE__ */ - -#endif /* SCHEDULER_INTERNAL_H */ - - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.i b/TAO/local/bin/Scheduling_Service/Scheduler_Generic.i deleted file mode 100644 index 71e3695dc35..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Generic.i +++ /dev/null @@ -1,21 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Generic.i -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - - -// EOF - diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.cpp b/TAO/local/bin/Scheduling_Service/Scheduler_Internal.cpp deleted file mode 100644 index aafb7773da2..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.cpp +++ /dev/null @@ -1,2329 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Internal.cpp -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#include "math.h" // for ::pow () -#include "float.h" // for DBL_EPSILON - -#include "ace/Sched_Params.h" - -#include "Scheduler_Internal.h" - -#if ! defined (__ACE_INLINE__) -#include "Scheduler_Internal.i" -#endif /* __ACE_INLINE__ */ - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// static functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -// Structure for storing the RT_Info information for each task, per mode. -struct Mode_Entry -{ - RtecScheduler::RT_Info *rt_info_; - u_long start_time_; // microseconds - u_long stop_time_; // microseconds - - Mode_Entry() : - rt_info_ (0), - start_time_ (0), - stop_time_ (0) - { - } - - Mode_Entry(RtecScheduler::RT_Info *const rt_info, - const u_long start_time = 0, - const u_long stop_time = 0) : - rt_info_ (rt_info), - start_time_ (start_time), - stop_time_ (stop_time) - { - } - - ~Mode_Entry () {} - - Mode_Entry &operator= (const Mode_Entry &entry) - { - if (this != &entry) - { - rt_info_ = entry.rt_info_; - start_time_ = entry.start_time_; - stop_time_ = entry.stop_time_; - } - - return *this; - } -}; - - -// "Add" an RT_Info to another. -static RtecScheduler::RT_Info& -operator+= (RtecScheduler::RT_Info *rt_info1, - const RtecScheduler::RT_Info &rt_info2) -{ - rt_info1->worst_case_execution_time = (rt_info1->worst_case_execution_time - + rt_info2.worst_case_execution_time); - rt_info1->typical_execution_time = (rt_info1->typical_execution_time - + rt_info2.typical_execution_time); - rt_info1->cached_execution_time = (rt_info1->cached_execution_time - + rt_info2.cached_execution_time); - - if ((rt_info1->period > rt_info2.period && rt_info2.period > 0) - || rt_info1->period <= 0) - { - rt_info1->period = rt_info2.period; - } - - return *rt_info1; -} - - -// Sort the threads into the sorted_rt_info array, -// by decreasing (non-increasing, actually) period. -// Returns the number of tasks in the input set. -static -void -sort (Scheduler_Internal::Thread_Map &threads, - u_long number_of_threads, - Mode_Entry sorted_rt_info [], - u_int output_level) -{ - u_int tasks = 0; - - ACE_OS::memset (sorted_rt_info, 0, (size_t) number_of_threads); - - // Iterate over each of the RT_Info entries that we know about, - // sorting the entries by decreasing (non-increasing) period. - Scheduler_Internal::Thread_Map_Entry *entry; - Scheduler_Internal::Thread_Map_Iterator i (threads); - while (i.next (entry)) - { - i.advance (); - RtecScheduler::RT_Info &rt_info = *entry->int_id_; - const RtecScheduler::Time entry_time = rt_info.worst_case_execution_time; - const RtecScheduler::Period entry_period = rt_info.period; - - if (output_level >= 1) - { - ACE_OS::printf ("Thread \"%s\"; utilization is %g and period is %ld" - " usec (%g Hz)\n", - (const char*)rt_info.entry_point, - entry_period > 0 -#if defined (ACE_WIN32) || defined (ACE_HAS_LONGLONG_T) - ? (double) entry_time / entry_period -#else - ? (double) entry_time.lo () / entry_period -#endif /* ACE_WIN32 || ACE_HAS_LONGLONG_T */ - : 0, - entry_period / 10 /* usec/100 ns */, - entry_period > 0 - ? 1.0e7 /* 1/100 ns */ / entry_period - : 0.0); - } - - // Use selection sort to sort entries by period. It's O (n^2), but n - // shouldn't be very big. - u_int j; - for (j = 0; j < tasks; ++j) - { - if (entry_period > sorted_rt_info [j].rt_info_->period) - { - // Found a smaller period: since we are sorting by decreasing - // period, need to insert the current period here. - - if (output_level >= 2) - { - ACE_OS::printf ("insert task before task %u with period %ld\n", - j + 1, - sorted_rt_info [j].rt_info_->period / - 10 /* usec/100 ns */); - } - - // insert this entry into the sort list here - for (u_int k = tasks; k > j; --k) - { - sorted_rt_info [k] = sorted_rt_info [k - 1]; - } - sorted_rt_info [j].rt_info_ = &rt_info; - - break; - } - } - if (j >= tasks) - { - // The entry does not have a lower period than any that we've - // already seen, so append it to the end of the sorted RT_Info array. - if (output_level >= 2) - { - ACE_OS::printf ("insert task with period %ld at end of sorted " - "array\n", - entry_period / 10 /* usec/100 ns */); - } - sorted_rt_info [j].rt_info_ = &rt_info; - } - - ++tasks; - } -} - - -// Check for harmonically related periods by comparing this entry's period -// with that of each of the other entries for integral division. -// As a side effect, figures out the frame_size, in microsec. -static -int -harmonically_related_periods (Mode_Entry const sorted_rt_info [], - const u_int number_of_tasks, - u_long &frame_size) -{ - int harmonically_related = 1; - u_int i; - - if (number_of_tasks > 0) - { - // start frame_size with the longest period - - for (i = 0; i < number_of_tasks; ++i) - frame_size = (u_long) (sorted_rt_info [0].rt_info_->period / - 10 /* microsec/100 ns */); - } - - for (i = 0; i < number_of_tasks - 1; ++i) - { - // Skip over groups of array entries with the same period. - while (i > 0 && i < number_of_tasks - 1 && - sorted_rt_info [i].rt_info_->period == - sorted_rt_info [i - 1].rt_info_->period) - { - ++i; - } - - // Compare the current RT_Info entry, at location i in the - // sorted array, to each of the remoining (with higher array index) - // entries. - for (u_int j = i + 1; j < number_of_tasks; ++j) - { - // if the period is 0, skip the task - if (sorted_rt_info [j].rt_info_->period <= 0) - break; - - // Assumes that the sorted_rt_info array is in decreasing - // (non-increasing) order. - double quotient = (double) sorted_rt_info [i].rt_info_->period / - sorted_rt_info [j].rt_info_->period; - - if (quotient - (long) quotient > DBL_EPSILON) - { - harmonically_related = 0; - - // and add another factor to the frame_size - frame_size *= (u_long) (sorted_rt_info [i].rt_info_->period / - 10 /* microseconds/100 ns */); - } - } - } - - return harmonically_related; -} - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class Scheduler_Internal member functions -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -Scheduler_Internal::Scheduler_Internal () : - Scheduler (), - handles_ (0), - // Set the minimum priority to that for the current platform. This - // shouldn't be necessary, but UPSingleProcessorOrb::initialize_reactors - // creates threads before the Event Channel calls Scheduler::init (). - minimum_priority_ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_THREAD)), - increasing_priority_ (-1), - task_entries_ (), - ordered_info_ (0), - visited_ (0), - dependencies_ (0), - roots_ (0), - frame_size_ (0), - thread_info_ (0), - leaf_info_ (0), - timeline_ (0) -{ -} - - -Scheduler_Internal::~Scheduler_Internal () -{ - reset (); - - delete [] timeline_; - timeline_ = 0; - - for (u_int current_mode = 0; current_mode < modes (); ++current_mode) - { - // Iterate over each of the thread_info_ entries and delete them. - Thread_Map_Entry *entry; - Thread_Map_Iterator i (thread_info_ [current_mode]); - while (i.next (entry)) - { - i.advance (); - thread_info_ [current_mode].unbind (entry->ext_id_); - delete entry->int_id_; - } - } - - for (u_int task = 0; task < tasks (); ++task) - { - delete [] ordered_info_ [task]; - } - - delete [] thread_info_; - thread_info_ = 0; - - delete [] ordered_info_; - ordered_info_ = 0; - - delete [] frame_size_; - frame_size_ = 0; -} - - -void -Scheduler_Internal::reset () -{ - delete dependencies_; - dependencies_ = 0; - - delete roots_; - roots_ = 0; - - delete leaf_info_; - leaf_info_ = 0; -} - -Scheduler::status_t -Scheduler_Internal::lookup_rt_info (handle_t handle, - RT_Info*& rtinfo) -{ - if (handle < 0 || handle > task_entries_.size ()) - { - return ST_UNKNOWN_TASK; - } - RT_Info*** entry; - ACE_Unbounded_Set_Iterator <RT_Info **> i (task_entries_); - while (i.next (entry) != 0) - { - i.advance (); - RT_Info** array = *entry; - if (array[0]->handle == handle) - { - rtinfo = array[0]; - return SUCCEEDED; - } - } - - return ST_UNKNOWN_TASK; -} - - -Scheduler::status_t -Scheduler_Internal::register_task (RT_Info *rt_info [], - const u_int number_of_modes, - handle_t &handle) -{ - status_t ret; - - // try to store the new task's information . . . - switch (task_entries_.insert (rt_info)) - { - case 0 : // successfully inserted - { - rt_info [0]->handle = (handle = ++handles_); - - // assigned the same handle to the RT_Info for each of its modes - for (u_int i = 1; i < number_of_modes; ++i) - { - if (rt_info [i] != 0) - rt_info [i]->handle = handle; - } - - if (number_of_modes > modes ()) - { - modes (number_of_modes); - } - - ret = SUCCEEDED; - - if (output_level () >= 5) - { - ACE_OS::printf ("registered task \"%s\" with RT_Info starting " - "at %X\n", - (const char*)rt_info[0]->entry_point, - (void *) rt_info[0]); - } - } - break; - - case 1 : // the entry had already been inserted - handle = 0; - ret = ST_TASK_ALREADY_REGISTERED; - break; - - default : - // case -1 : insert failed, probably because virtual memory exhaused - handle = 0; - ret = ST_VIRTUAL_MEMORY_EXHAUSTED; - break; - } - - return ret; -} - - -void -Scheduler_Internal::init (const int minimum_priority, - const int maximum_priority, - const char *runtime_filename, - const char *rt_info_filename, - const char *timeline_filename) -{ - minimum_priority_ = minimum_priority; - maximum_priority_ = maximum_priority; - runtime_filename_ = runtime_filename; - rt_info_filename_ = rt_info_filename; - timeline_filename_ = timeline_filename; -} - - -Scheduler::status_t -Scheduler_Internal::schedule (void) -{ - ACE_Guard<LOCK> ace_mon (lock_); - - // here goes . . . - - increasing_priority_ = maximum_priority_ >= minimum_priority_; - - status_t status = NOT_SCHEDULED; - - // store number of tasks, based on registrations - tasks (task_entries_.size ()); - - // allocate tables . . . - ACE_NEW_RETURN (ordered_info_, RT_Info **[tasks ()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - for (u_int task = 0; task < tasks (); ++task) - { - ACE_NEW_RETURN (ordered_info_ [task], RT_Info *[modes ()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - ACE_OS::memset (ordered_info_ [task], 0, - sizeof (RT_Info *) * modes ()); - } - - ACE_NEW_RETURN (thread_info_, Thread_Map [modes ()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - - ACE_NEW_RETURN (frame_size_, u_long [modes ()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - - // set up timeline structure - if (timeline_filename_ != 0) - { - ACE_NEW_RETURN (timeline_, - ACE_Unbounded_Queue <Timeline_Entry> [modes()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - } - - for (u_int current_mode = 0; current_mode < modes (); ++current_mode) - { - // set the current mode - mode (current_mode); - - status_t mode_status = NOT_SCHEDULED; - - // Identify threads and store information in convenient form for later - // use. - if ((mode_status = identify_threads ()) != SUCCEEDED) - { - return mode_status; // should only happen if virtual memory exceeded - } - - // Traverse task dependencies to aggregate thread parameters. - if ((mode_status = aggregate_thread_parameters ()) != SUCCEEDED) - { - return mode_status; // should only happen if virtual memory exceeded - } - - // only RMS is currently supported - if ((mode_status = schedule_rms (minimum_priority_, - maximum_priority_)) == SUCCEEDED) - { - if (status == NOT_SCHEDULED) status = SUCCEEDED; - } - else - { - status = mode_status; - } - } - - if (output_level () > 0) - { - print_schedule (); - } - - if (runtime_filename_ != 0 && - (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED)) - { - status = store_schedule (runtime_filename_); - } - - if (timeline_filename_ != 0 && - (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED)) - { - status = create_timelines (timeline_filename_); - } - - if ((status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED) && rt_info_filename_) - { - status = store_rt_info (rt_info_filename_); - } - - // If there was a failure, (try to) remove the output files. - if (! (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED)) - { - if (runtime_filename_ && unlink ((char *) runtime_filename_) - && errno != ENOENT) - { - ACE_OS::perror ("Scheduler_Internal::schedule (); " - "unable to remove schedule file"); - } - if (rt_info_filename_ && unlink ((char *) rt_info_filename_) && - errno != ENOENT) - { - ACE_OS::perror ("Scheduler_Internal::schedule (); " - "unable to remove rt_info file"); - } - } - - return status; -} - - -Scheduler::status_t -Scheduler_Internal::update_dependencies (RT_Info &rt_info, - Sub_Priority subpriority) -{ - u_int i = 0; - - // Detect cycles in the dependency graph by storing (the address of) - // each RT_Info instance as it is visited. Then, on every visit, - // check to see if the instance had already been visited. Flag it, - // if so (and stop the recursion :-). - - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies; visiting \"%s\"", - (const char*)rt_info.entry_point); - } - - switch (visited_->insert (&rt_info)) - { - case -1 : - return ST_VIRTUAL_MEMORY_EXHAUSTED; - case 0 : - // successfully inserted - break; - case 1 : - default : - // oops, had already visited this rt_info! -#if 0 /* Ignore, it seems to work well without this check */ - return CYCLE_IN_DEPENDENCIES; -#else - break; -#endif /* 0 */ - } - - Scheduler::status_t ret = NOT_SCHEDULED; - - if (rt_info.priority == -1) - { - // Just updating the subpriority. - - int *ordered_deps = 0; - int *marked = 0; - - // Sort the dependencies by importance, lowest first. - ACE_NEW_RETURN (ordered_deps, int [number_of_dependencies (rt_info)], - ST_VIRTUAL_MEMORY_EXHAUSTED); - ACE_NEW_RETURN (marked, int [number_of_dependencies (rt_info)], - ST_VIRTUAL_MEMORY_EXHAUSTED); - for (i = 0; i < number_of_dependencies (rt_info); ++i) - { - ordered_deps [i] = -1; - marked [i] = 0; - } - - for (i = 0; i < number_of_dependencies (rt_info); ++i) - { - Sub_Priority current_importance = 0x7FFF; - int current_importance_dep = -1; - - // Find the unmarked dependent with the lowest importances. - for (u_int j = 0; j < number_of_dependencies (rt_info); ++j) - { - ACE_ASSERT (rt_info.dependencies[j].rt_info != -1); - RT_Info* info; - this->lookup_rt_info (rt_info.handle, info); - if (! marked [j] && - info->importance <= current_importance) - { - current_importance = info->importance; - current_importance_dep = j; - } - } - - ACE_ASSERT (current_importance_dep != -1); - ordered_deps [i] = current_importance_dep; - marked [current_importance_dep] = 1; - } - - if (output_level () >= 5) - { - ACE_OS::printf ("\"%s\" has %d dependencies\n", - (const char*)rt_info.entry_point, - number_of_dependencies(rt_info)); - for (i = 0; i < number_of_dependencies(rt_info); ++i) - { - RT_Info* info; - this->lookup_rt_info (rt_info.dependencies[ordered_deps[i]].rt_info, info); - ACE_OS::printf ("ordered dependency %d: \"%s\" (importance: %d)\n", - i, - (const char*)info->entry_point, - info->importance); - } - } - - // Traverse the dependent tasks, in order of importance. - for (i = 0; i < number_of_dependencies (rt_info); ++i) - { - RT_Info* dep_info; - this->lookup_rt_info (rt_info.dependencies[ordered_deps[i]].rt_info, - dep_info); - if (i > 0) - { - RT_Info* previous_info; - this->lookup_rt_info (rt_info.dependencies[ordered_deps [i-1]].rt_info, - previous_info); - if (previous_info->importance < dep_info->importance) - { - // Increment subpriority based on increased importance - // of this dependent. - ++subpriority; - } - } - - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); " - "incremented subpriority to %u\n", - subpriority); - } - - dep_info->subpriority = subpriority; - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); " - "set subpriority of \"%s\"o %u\n", - (const char*)dep_info->entry_point, - subpriority); - } - - // Recurse until all dependent tasks have been visited. - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); " - "calling recursively for dependent \"%s\"\n", - (const char*)dep_info->entry_point); - } - - if ((ret = update_dependencies (*dep_info, - subpriority + 1)) != NOT_SCHEDULED) - { - break; - } - } - - delete [] ordered_deps; - delete [] marked; - } - else - { - for (i = 0; i < number_of_dependencies (rt_info); ++i) - { - RT_Info* info; - this->lookup_rt_info (rt_info.dependencies[i].rt_info, info); - info->priority = rt_info.priority; - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); " - "set priority of \"%s\" to %d " - "(its subpriority is %u)\n", - (const char*)info->entry_point, - info->priority, - info->subpriority); - } - - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); " - "calling recursively for dependent \"%s\"\n", - (const char*)info->entry_point); - } - - // Recurse until all dependent tasks have been visited. - if ((ret = update_dependencies (*info, - 0 /* not used when - setting priorities */)) != - NOT_SCHEDULED) - { - break; - } - } - } - - return ret; -} - - -Scheduler::status_t -Scheduler_Internal::schedule_rms (const int minimum_priority, - const int maximum_priority) -{ - double utilization = 0.0; - u_int i; - - // Allocate an array for the sorted RT_Info. - Mode_Entry *sorted_rt_info; - ACE_NEW_RETURN (sorted_rt_info, Mode_Entry [threads ()], - ST_VIRTUAL_MEMORY_EXHAUSTED); - - // Sort the threads' thread info entries by period. - sort (thread_info_ [mode ()], threads (), sorted_rt_info, output_level ()); - - // Load priorities by walking the sorted rt_info_array, incrementing - // current_priority for each new period (rate). For threads af the same - // rate, assign subpriorities based on 1) data dependencies and - // 2) importance. Also, calculate CPU utilization on the fly. - ACE_Sched_Priority current_priority = minimum_priority; - for (i = 0; i < threads (); ++i) - { - RT_Info &rt_info = *sorted_rt_info [i].rt_info_; - const RtecScheduler::Time entry_time = rt_info.worst_case_execution_time; - const RtecScheduler::Period entry_period = rt_info.period; - - if (entry_period > DBL_EPSILON) - { -#if defined (ACE_WIN32) || defined (ACE_HAS_LONGLONG_T) - utilization += (double) entry_time / entry_period; -#else - utilization += (double) entry_time.lo () / entry_period; -#endif /* ACE_WIN32 || ACE_HAS_LONGLONG_T */ - } - - if (i != 0 && output_level () >= 3) - { - - ACE_OS::printf ("entry_period: %d (\"%s\"), " - "previous thread period: %d\n", - entry_period, - (const char*)sorted_rt_info [i].rt_info_->entry_point, - sorted_rt_info [i - 1].rt_info_->period); - } - - // If i == 0, we're at the starting point: there are no other threads - // to compare to. - if (i != 0 && entry_period != sorted_rt_info [i - 1].rt_info_->period) - { - // If the period of this task is the same as the period of the - // previous task (the threads are sorted by period), then assign - // it the same ("current") priority. Otherwise, assign a higher - // priority (which may have a lower value), via "current_priority". - if (current_priority == maximum_priority) - { - status (ST_INSUFFICIENT_THREAD_PRIORITY_LEVELS); - } - else - { - if (output_level () >= 3) - { - ACE_OS::printf ("will advance current_priority from its " - "current %d for period of %d\n", - current_priority, entry_period); - } - - if (increasing_priority_) - { - // This assumes that the target and host are the - // same platform! It's hear to deal with the - // non-contiguous OS priorities of Win32 platforms. - current_priority = - ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, - current_priority, - ACE_SCOPE_PROCESS); - } - else - { - // This assumes that the OS priorities on the target - // are contiguous, e.g., 255, 254, 253, 252, etc., - // from low to high priority. The only target we - // use with decreasing priorities, VxWorks, does have - // contiguous OS priorities. - --current_priority; - } - } - } - - if (output_level () >= 3) - { - ACE_OS::printf ("thread %s, set priority to %d\n", - (const char*)rt_info.entry_point, - current_priority); - } - - rt_info.priority = current_priority; - - // There should only be one dependency for each - // RT_Info instance in the (sorted) thread_info_ array. - if (number_of_dependencies (rt_info) != 1) - { - ACE_ERROR ((LM_ERROR, - "On '%s' deps count should be 1, it is %d\n", - (const char*)rt_info.entry_point, - number_of_dependencies(rt_info))); - } - - // . . . and it should have a valid RT_Info pointer. - ACE_ASSERT (rt_info.dependencies[0].rt_info != -1); - RT_Info* tmp; - this->lookup_rt_info (rt_info.dependencies[0].rt_info, tmp); - tmp->priority = current_priority; - } - - - // Set the priority of every task. - ACE_Bounded_Set_Iterator <RT_Info *> root_i (*roots_); - RT_Info **root; - while (root_i.next (root) != 0) - { - root_i.advance (); - if (output_level () >= 4) - { - ACE_OS::printf ("ROOT: %s\n", - (const char*)(*root)->entry_point); - } - - RT_Info *leaf = 0; - leaf_info_->find ((const char*)(*root)->entry_point, leaf); - ACE_ASSERT (leaf != 0); - - if (output_level () >= 4) - { - ACE_OS::printf ("found leaf_info entry %s\n", - (const char*)leaf->entry_point); - } - - // Find the highest priority leaf corresponding to each root. - // ???? should do that! - - (*root)->priority = leaf->priority; - - // Update the priority of all dependent tasks. - // update_dependencies () is recursive, so set up the visited_ - // structure outside of it. - ACE_NEW_RETURN (visited_, - ACE_Bounded_Set <const RT_Info *> (tasks ()), - ST_VIRTUAL_MEMORY_EXHAUSTED); - - if (status () == NOT_SCHEDULED /* first mode */ || - status () == SUCCEEDED /* subsequent modes */ ) - { - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); call for " - "root %s to set priorities\n", - (const char*)(*root)->entry_point); - } - - status (update_dependencies (**root, 0 /* not used when - setting priorities */)); - } - - delete visited_; - visited_ = 0; - } - - // Set minimum_priority, the priority value of the lowest priority - // (highest numbered) dispatch queue. This is global, over all modes, - // so don't overwrite a smaller value. - if (increasing_priority_) - { - if (current_priority - minimum_priority > - (int) minimum_priority_queue ()) - { - if (output_level () >= 3) - { - ACE_OS::printf ("set minimum_priority_queue to %d = " - " %d - %d\n", - current_priority - minimum_priority, - current_priority, minimum_priority); - } - minimum_priority_queue (current_priority - minimum_priority); - } - } - else - { - if (minimum_priority - current_priority > - (int) minimum_priority_queue ()) - { - if (output_level () >= 3) - { - ACE_OS::printf ("set minimum_priority_queue to %d = " - " %d - %d\n", - current_priority - minimum_priority, - current_priority, minimum_priority); - } - minimum_priority_queue (minimum_priority - current_priority); - } - } - - // Load RT_Info pointers into ordered_info_ array for efficient lookup. - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - if ((*entry) [mode ()] != 0) - { - // This mode has a non-zero RT_Info pointer. - ordered_info_ [(*entry) [mode ()]->handle - 1][mode ()] = - (*entry) [mode ()]; - } - // else, just leave the ordered_info_ entry for this [task][mode] at 0. - } - - const u_int harmonically_related = - harmonically_related_periods (sorted_rt_info, - threads (), - frame_size_ [mode ()]); - - if (timeline_filename_ != 0) - { - status_t timeline_status; - if ((timeline_status = generate_timeline (sorted_rt_info, - threads (), - frame_size_ [mode ()], - timeline_ [mode()])) != - SUCCEEDED) - { - status (timeline_status); - } - } - - delete [] sorted_rt_info; - sorted_rt_info = 0; - - // Calculate the utilization bound, based on whether or not the - // task periods are harmonically related. - double utilization_bound; - - if (harmonically_related) - { - utilization_bound = 1.0; - } - else - { - utilization_bound = threads () * (::pow ((double) 2, 1./threads ()) - 1); - } - - // Don't overwrite status if an error had already been noted. - if (status () == NOT_SCHEDULED) - { - // Compare the total utilization to the utilization bound - // to determine whether or not the threads are schedulable. - status (utilization <= utilization_bound - ? SUCCEEDED - : ST_UTILIZATION_BOUND_EXCEEDED); - } - - // ???? if utilization bound is exceeeded, then should try all - // possible task phasings (RT test) - - if (output_level () >= 1) - { - ACE_OS::printf ("mode %u: utilization bound: %g; " - "total CPU utilization: %g: ", - mode (), - utilization_bound, - utilization); - Scheduler::output (stdout, status ()); - ACE_OS::printf ("\n\n"); - } - - return status (); -} - - -u_int -Scheduler_Internal::find_number_of_threads (mode_t mode) -{ - u_int number_of_threads = 0; - - // Quickly traverse RT_Info's to determine number of - // threads, so that the thread_ array can be allocated below. - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - RT_Info *rt_info = (*entry) [mode]; - - // This test misses thread delineators that are 0 in a particular - // mode. - if (rt_info != 0 && - (rt_info->threads > 0 || - (number_of_dependencies (rt_info) == 0 - && rt_info->period > 0))) - { - // This mode's RT_Info instance either has more than 0 - // "internal" threads, or delineates a thread because it - // has no dependencies and has a non-zero period. - int nt = rt_info->threads > 0 ? rt_info->threads : 1; - number_of_threads += nt; - if (output_level () >= 2) - { - ACE_OS::printf ("find_number_of_threads (): mode %u; entry %s; " - "added %u threads\n", - mode, - (const char*)rt_info->entry_point, - nt); - } - } - } - - if (output_level () >= 1) - { - ACE_OS::printf ("find_number_of_threads (): mode %u; " - "identified %lu threads\n", - mode, number_of_threads); - } - - return number_of_threads; -} - - -Scheduler::status_t -Scheduler_Internal::find_thread_delineators (mode_t mode) -{ - ACE_NEW_RETURN (dependencies_, - ACE_Bounded_Set <const RT_Info *> (tasks ()), - ST_VIRTUAL_MEMORY_EXHAUSTED); - - // Fill in the thread_ array. While doing this, load the - // dependencies set also. - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - RT_Info *rt_info = (*entry) [mode]; - - if (rt_info != 0) - { - if ((rt_info->threads > 0 || - (number_of_dependencies (rt_info) == 0 && - rt_info->period > 0))) - { - // This mode's RT_Info instance either has more than 0 - // "internal" threads, or delineates a thread because it - // has no dependencies and has a non-zero period. - - if (output_level () >= 5) - { - ACE_OS::printf ("find_thread_delineators (); %s is a leaf and" - " has %u threads\n", - (const char*)rt_info->entry_point, - rt_info->threads); - } - -#if 1 - // TODO: This seems to break several invariants on the - // RT_Info collection, I must talk to David about it. - - // Add one thread for non-active objects, and the number of - // threads otherwise. - for (u_int i = 0; - i < (rt_info->threads > 0 ? rt_info->threads : 1); - ++i) - { - RT_Info *thread_info; - // Set "name" of thread to be that of its root RT_Info. - ACE_NEW_RETURN (thread_info, RT_Info, - ST_VIRTUAL_MEMORY_EXHAUSTED); - thread_info->entry_point = rt_info->entry_point; - thread_info->threads = 0; - thread_info->period = 0; - Dependency_Info tmp; - tmp.number_of_calls = 0; - tmp.rt_info = rt_info->handle; - Scheduler::add_dependency (thread_info, tmp); - - if (output_level () >= 4) - { - ACE_OS::printf ("bind thread delineator %s\n", - (const char*)thread_info->entry_point); - } - - thread_info_ [mode].bind ((const char*)rt_info->entry_point, - thread_info); - } -#endif - } - - for (u_int dep = 0; - dep < number_of_dependencies (rt_info); - ++dep) - { - RT_Info* info; - this->lookup_rt_info (rt_info->dependencies[dep].rt_info, info); - if (output_level () >= 4) - { - ACE_OS::printf ("insert dependency %s\n", - (const char*)info->entry_point); - - } - if (dependencies_->insert (info) == -1) - { - return ST_VIRTUAL_MEMORY_EXHAUSTED; - } - } - - } - } - - return SUCCEEDED; -} - - -Scheduler::status_t -Scheduler_Internal::find_dependency_chain_roots (mode_t mode) -{ - ACE_NEW_RETURN (roots_, - ACE_Bounded_Set <RT_Info *> (tasks ()), - ST_VIRTUAL_MEMORY_EXHAUSTED); - - // Now do the fun traversal through all RT_Infos to look for roots of - // dependency trees. From each of those roots, traverse the dependency - // tree back to each leaf, which is one of the thread delineators that - // was found earlier. - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - RT_Info *rt_info = (*entry) [mode]; - - if (rt_info != 0 && dependencies_->find (rt_info) == -1) - { - if (output_level () >= 5) - { - ACE_OS::printf ("\"%s\" is not a dependent task (it is a " - "dependency-chain root); it has " - "%u dependencies\n", - (const char*)rt_info->entry_point, - number_of_dependencies (rt_info)); - } - - if (output_level () >= 4) - { - ACE_OS::printf ("insert root %s\n", - (const char*)rt_info->entry_point); - } - roots_->insert (rt_info); - } - } - - return SUCCEEDED; -} - - -Scheduler::status_t -Scheduler_Internal::find_dependency_chain_leaves () -{ - RT_Info **root; - ACE_Map_Manager <RT_Info *, Sub_Priority, ACE_Null_Mutex> - root_subpriorities; - - // Search through all of the dependency chain roots and assign - // subpriorities to them. In effect, this sorts the roots by - // importance. - - Sub_Priority current_subpriority = 0; - ACE_Bounded_Set_Iterator <RT_Info *> roots_i1 (*roots_); - while (roots_i1.next (root) != 0) - { - roots_i1.advance (); - RT_Info *rt_info = *root; - - if (rt_info == 0) continue; // The task does not run in this mode. - - // If we've seen the root already, ignore it. Otherwise, - // consider it a candidate as the lowest-importance root. - RT_Info **min_importance_root; - RtecScheduler::Importance root_importance; - if (root_subpriorities.find (*root) == -1) - { - if (output_level () >= 6) - { - ACE_OS::printf ("find_dependency_chain_leaves (); root \"%s\" " - "has not yet been visited\n", - rt_info ? (const char*)rt_info->entry_point : "NULL"); - } - min_importance_root = root; - root_importance = (*root)->importance; - } - else - { - if (output_level () >= 6) - { - ACE_OS::printf ("find_dependency_chain_leaves (); root \"%s\" " - "has already been visited\n", - rt_info ? (const char*)rt_info->entry_point : "NULL"); - } - min_importance_root = 0; - root_importance = (RtecScheduler::Importance) 0xFFFFFFFF; - } - - RT_Info **root2; - ACE_Bounded_Set_Iterator <RT_Info *> roots_i2 (*roots_); - while (roots_i2.next (root2) != 0) - { - roots_i2.advance (); - if (root2 == root || *root2 == 0) continue; - - RtecScheduler::Importance root2_importance = (*root2)->importance; - - if ((min_importance_root == 0 || - root2_importance < root_importance) && - root_subpriorities.find (*root2) == -1) - { - min_importance_root = root2; - root_importance = root2_importance; - } - } - - // At this point, min_importance_root contains the root with - // the lowest importance, among all those that we haven't visited yet. - if (output_level () >= 6) - { - ACE_OS::printf ("lowest importance root is \"%s\"\n", - (const char*)(*min_importance_root)->entry_point); - } - - int result; - if ((result = root_subpriorities.bind (*min_importance_root, - current_subpriority++)) != 0) - { - ACE_OS::fprintf (stderr, - "Scheduler_Internal::find_dependency_chain_leaves ();" - "bind of %s to %d failed with result %d!!!!\n", - (const char*)(*min_importance_root)->entry_point, - current_subpriority, - result); - return ST_VIRTUAL_MEMORY_EXHAUSTED; - } - else - { - if (output_level () >= 6) - { - ACE_OS::fprintf (stderr, - "Scheduler_Internal::find_dependency_chain_leaves ();" - "bind of \"%s\" to %d succeeded.\n", - (const char*)(*min_importance_root)->entry_point, - current_subpriority); - } - - Sub_Priority subp; - root_subpriorities.find (*min_importance_root, subp); - (*min_importance_root)->subpriority = subp; - if (output_level () >= 4) - { - ACE_OS::printf ("\"%s\" assigned subpriority %d\n\n", - (const char*)(*min_importance_root)->entry_point, - subp); - } - } - } - - size_t roots = root_subpriorities.current_size (); - if (output_level () >= 4) - { - ACE_OS::printf ("%u roots\n", roots); - } - - // Sort the roots by importance, least first. - u_int i; - RT_Info **sorted_root; - ACE_NEW_RETURN (sorted_root, RT_Info *[roots], ST_VIRTUAL_MEMORY_EXHAUSTED); - - RT_Info **visited_root; - ACE_NEW_RETURN (visited_root, - RT_Info *[roots], - ST_VIRTUAL_MEMORY_EXHAUSTED); - u_int next_visited_root = 0; - for (i = 0; i < roots; ++i) - { - visited_root[i] = 0; - } - - Sub_Priority min_subp; - RT_Info *min_subp_root = 0; - for (i = 0; i < roots; ++i) - { - min_subp = 0x7FFF; - - ACE_Bounded_Set_Iterator <RT_Info *> roots_i3 (*roots_); - while (roots_i3.next (root) != 0) - { - roots_i3.advance (); - RT_Info *rt_info = *root; - - if (output_level () >= 6) - { - ACE_OS::printf ("find_dependency_chain_leaves (); " - "sorted root \"%s\"\n", - rt_info ? (const char*)rt_info->entry_point : "NULL"); - } - - if (rt_info == 0) continue; // The task does not run in this mode. - u_int next_root = 0; - for (u_int j = 0; j < roots; ++j) - { - if (visited_root[j] == rt_info) next_root = 1; - } - if (next_root == 1) continue; - - if (min_subp > rt_info->subpriority) - { - min_subp = rt_info->subpriority; - min_subp_root = rt_info; - } - } - - sorted_root[i] = min_subp_root; - visited_root[next_visited_root++] = min_subp_root; - } - - delete [] visited_root; - - // Now do the fun traversal from each root of a dependency chain. - // From each of those roots, traverse the dependency chain back to - // each leaf, which is one of the thread delineators that was found earlier. - for (i = 0; i < roots; ++i) - { - if (sorted_root[i] == 0) break; - - RT_Info *rt_info = sorted_root[i]; - - if (rt_info == 0) continue; // The task does not run in this mode. - - // Update the subpriority of this task: set it to the minimum - // subpriority if it hadn't already been set. - if (rt_info->subpriority < 0) - { - if (output_level () >= 4) - { - ACE_OS::printf ("find_dependency_chain_leaves (); " - "set subpriority of %s to %u\n", - (const char*)rt_info->entry_point, - ACE_Scheduler_MIN_SUB_PRIORITY); - } - rt_info->subpriority = ACE_Scheduler_MIN_SUB_PRIORITY; - } - - // Update the subpriority of all dependent tasks. - // update_dependencies () is recursive, so set up the visited_ - // structure outside of it. - ACE_NEW_RETURN (visited_, - ACE_Bounded_Set <const RT_Info *> (tasks ()), - ST_VIRTUAL_MEMORY_EXHAUSTED); - - if (status () == NOT_SCHEDULED /* first mode */ || - status () == SUCCEEDED /* subsequent modes */ ) - { - Sub_Priority subp; - root_subpriorities.find (rt_info, subp); - - if (output_level () >= 4) - { - ACE_OS::printf ("update_dependencies (); call for " - "root %s to set subpriorities, starting with " - "%d\n", - (const char*)rt_info->entry_point, - subp); - } - - status (update_dependencies (*rt_info, subp)); - } - - delete visited_; - visited_ = 0; - } - - delete [] sorted_root; - - return SUCCEEDED; -} - - -Scheduler::status_t -Scheduler_Internal::identify_threads () -{ - status_t temp_status; - - reset (); - - // Figure out how many threads there are in this mode. - threads (find_number_of_threads (mode ())); - - // Find and store the thread delineators: they have no dependencies - // and have a specified rate, or they have internal threads of their own. - if ((temp_status = find_thread_delineators (mode ())) != SUCCEEDED) - { - return temp_status; - } - - // Find and store dependency-chain roots. - if ((temp_status = find_dependency_chain_roots (mode ())) != SUCCEEDED) - { - return temp_status; - } - - // Find and store dependency-chain leaves. - if ((temp_status = find_dependency_chain_leaves ()) != SUCCEEDED) - { - return temp_status; - } - - return SUCCEEDED; -} - - -Scheduler::status_t -Scheduler_Internal::aggregate_thread_parameters () -{ - ACE_NEW_RETURN (leaf_info_, Thread_Map (), - ST_VIRTUAL_MEMORY_EXHAUSTED); - - ACE_Bounded_Set_Iterator <RT_Info *> roots_i (*roots_); - RT_Info **root; - while (roots_i.next (root)) - { - roots_i.advance (); - if (*root != 0) - { - RT_Info &rt_info = **root; - - if (output_level () >= 4) - { - ACE_OS::printf ("root: %s\n", (const char*)rt_info.entry_point); - } - - RT_Info leaf_info (rt_info); - RT_Info *leaf = &rt_info; - - for (u_int i = 0; i < number_of_dependencies (rt_info); ++i) - { - RT_Info* info; - this->lookup_rt_info(rt_info.dependencies[i].rt_info, info); - leaf = - &calculate_thread_properties (leaf_info, - *info, - rt_info.dependencies[i]. - number_of_calls); - if (output_level () >= 4) - { - ACE_OS::printf ("reached leaf %s\n", - (const char*)leaf->entry_point); - } - } - - if (output_level () >= 4) - { - ACE_OS::printf ("root %s maps to leaf %s\n", - (const char*)rt_info.entry_point, - (const char*)leaf->entry_point); - } - leaf_info_->bind ((const char*)rt_info.entry_point, leaf); - - RT_Info *thread_info = 0; - thread_info_ [mode ()].find ((const char*)leaf->entry_point, - thread_info); - if (thread_info == 0) - { - ACE_ERROR ((LM_ERROR, - "Task \"%s\" depends on a thread identified " - "by \"%s\", which does not \n" - "have a period or internal threads. " - "Is that dependency backwards?\n", - (const char*)rt_info.entry_point, - (const char*)leaf->entry_point)); - } - ACE_ASSERT (thread_info != 0); - - if (output_level () >= 4) - { - ACE_OS::printf ("found thread_info entry %s\n", - (const char*)thread_info->entry_point); - } - - // Add the dependency chain's aggregate parameters to that - // of the thread. - (void) operator+= (thread_info, leaf_info); - } - } - - return SUCCEEDED; -} - - -RtecScheduler::RT_Info & -Scheduler_Internal::calculate_thread_properties (RT_Info &thread_info, - RT_Info &rt_info, - const u_int number_of_calls) -{ - u_int i; - - for (i = 0; i < number_of_calls; ++i) - { - (void) operator+= (&thread_info, rt_info); - } - - if (output_level () >= 4) - { - ACE_OS::printf ("calculate_thread_properties (); " - "time: %ld, period: %ld usec\n", -#if defined (ACE_WIN32) || defined (ACE_HAS_LONGLONG_T) - thread_info.worst_case_execution_time, -#else - thread_info.time.lo (), -#endif /* ACE_WIN32 || ACE_HAS_LONGLONG_T */ - thread_info.period / 10 /* usec/100 ns */); - } - - if (number_of_dependencies (rt_info) == 0) - { - if (output_level () >= 4) - { - ACE_OS::printf ("calculate_thread_properties (); " - "reached leaf %s\n", - (const char*)rt_info.entry_point); - } - return rt_info; - } - - for (i = 0; i < number_of_dependencies (rt_info); ++i ) - { - // TODO: - if (rt_info.dependencies[i].rt_info != 0) - { - RT_Info* info; - this->lookup_rt_info (rt_info.dependencies[i].rt_info, info); - if (output_level () >= 4) - { - ACE_OS::printf ("calculate_thread_properties (): recurse on " - "dependency %s\n", - (const char*)info->entry_point); - } - - RT_Info& ret = - calculate_thread_properties (thread_info, - *info, - rt_info.dependencies[i].number_of_calls); - return ret; - } - } - - ACE_ASSERT (! "should never reach this!"); // should never get here! - return rt_info; // to avoid compilation warning -} - - -int -Scheduler_Internal::priority (const handle_t handle, - OS_Thread_Priority &priority, - Sub_Priority &subpriority, - Preemption_Priority &preemption_prio, - const mode_t requested_mode) const -{ - // Casting away the const. - ACE_Guard<LOCK> ace_mon (((Scheduler_Internal *) this)->lock_); - - const mode_t lookup_mode = requested_mode == CURRENT_MODE - ? mode () - : requested_mode; - - if (!ordered_info_) - { - priority = minimum_priority_; - subpriority = ACE_Scheduler_MIN_SUB_PRIORITY; - preemption_prio = ACE_Scheduler_MAX_PREEMPTION_PRIORITY; - return 0; - } - else if (lookup_mode < modes () && handle <= handles_ && - ordered_info_ [handle - 1][lookup_mode] != 0) - { - priority = ordered_info_ [handle - 1][lookup_mode]->priority; - subpriority = ordered_info_ [handle - 1][lookup_mode]->subpriority; - - if (increasing_priority_) - { -#if defined (ACE_WIN32) - // Find the queue_number by iterating over the OS thread priorities. - // This allows proper handling of non-contiguous OS priorities. - // It would be more efficient to store the queue number in the - // RT_Info instead of computing it here every time. This is only - // intended for off-line scheduling, though, so it's not critical. - // TODO: // ???? Hard-code knowledge of 5 dispatch queues!! - preemption_prio = 4; - for (ACE_Sched_Priority p = - ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_PROCESS); - priority > p; - p = ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, - p, - ACE_SCOPE_PROCESS)) - { - --preemption_prio; - } -#else /* ! ACE_WIN32 */ - // E.g., Solaris, which has contiguous priorities. - preemption_prio = minimum_priority_queue () - - (priority - minimum_priority_); -#endif /* ! ACE_WIN32 */ - } - else - { - // Assume VxWorks, which has contiguous priorities. - preemption_prio = minimum_priority_queue () - - (minimum_priority_ - priority); - } - - // TODO: This should be updated when priority and subpriority - // are set, but I don't know when that happens :( - ordered_info_ [handle - 1][lookup_mode]->preemption_priority = - preemption_prio; - - if (output_level () >= 3) - { - ACE_OS::printf ("preemption_prio %d: min %d, pri %d, min_pri %d\n", - preemption_prio, minimum_priority_queue (), - priority, minimum_priority_); - } - - return 0; - } else { - return -1; - } -} - - -void -Scheduler_Internal::print_schedule () -{ - for (mode_t m = 0; m < modes (); ++m) - { - ACE_OS::printf ("\nMode %u:\n", m); - ACE_OS::printf ("Task Priority Subpri- CPU Time Period Rate " - "Utilization Name\n" - " ority microsec microsec Hz\n" - "---- -------- ------- -------- -------- ---- " - "----------- ----\n"); - - // at 1 and incrementing by 1. - for (u_int task = 1; task <= tasks (); ++task) - { - RtecScheduler::OS_Priority prio; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_prio; - if (priority (task, - prio, - subpriority, - preemption_prio, - m) == -1) - { - ACE_OS::printf ("%3u -- -- -- " - " -- -- -- %s\n", - task, - (const char*)ordered_info_[task-1][m]->entry_point); - } - else - { -#if defined (ACE_WIN32) || defined (ACE_HAS_LONGLONG_T) - const u_long t = - (u_long) ordered_info_ [task-1][m]->worst_case_execution_time / - 10 /* microsec/100 ns */; -#else - const u_long t = ordered_info_ [task-1][m]->time.lo () / - 10 /* microsec/100 ns */; -#endif /* ACE_WIN32 || ACE_HAS_LONGLONG_T */ - - ACE_OS::printf ("%3u %6d %6d %8lu" - "%9lu%5lu %6.4f %s\n", - task, prio, subpriority, t, - (u_long) (ordered_info_ [task-1][m]->period / - 10 /* microsec/100 ns */), - ordered_info_ [task-1][m]->period > 0 - ? (u_long) (1.0e7 / - ordered_info_ [task-1][m]-> - period) - : 0L, - ordered_info_ [task-1][m]->period > 0 - ? (double) t / - ordered_info_ [task-1][m]->period - : 0.0, - (const char*)ordered_info_[task-1][m]->entry_point); - } - } - } -} - - -Scheduler::status_t -Scheduler_Internal::store_schedule (const char *filename) -{ - u_int i; - FILE *const file = ACE_OS::fopen (filename, "w"); - - if (file) - { - ACE_OS::fprintf (file, "\ -// Automatically generated \"%s\"\n\ -\n\ -#include \"Scheduler_Runtime.h\"\n\ -\n\ -static const unsigned int MODES = %u;\n\ -static const unsigned int TASKS = %u;\n\ -static const unsigned int THREADS = %u;\n\ -static const unsigned int MINIMUM_PRIORITY_QUEUE = %u;\n\ -\n\ -int\n\ -Scheduler_Runtime_registered_tasks_ [TASKS] = { 0 };\n\ -\n\ -const char *\n\ -Scheduler_Runtime_task_names_ [TASKS] =\n\ - {\n\ -", filename, - modes (), - tasks (), - threads (), - minimum_priority_queue ()); - - for (i = 0; i < tasks (); ++i) - { - ACE_OS::fprintf (file, " \"%s\"%s\n", - (const char*)ordered_info_ [i][0]->entry_point, - i == tasks () - 1 ? "" : ","); - } - - ACE_OS::fprintf (file, "\ - };\n\ -\n\ -int\n\ -Scheduler_Runtime_priorities_ [MODES][TASKS][3] =\n\ - {\n\ -"); - - for (i = 0; i < modes (); ++i) - { - ACE_OS::fprintf (file, " { /* mode %u */\n", i); - for (u_int j = 0; j < tasks (); ++j) - { - RtecScheduler::OS_Priority priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_prio; - if (ordered_info_ [j][i] == 0) - { - // This task doesn't run in this mode. - priority = increasing_priority_ ? minimum_priority_ - 1 - : minimum_priority_ + 1; - subpriority = -1; - preemption_prio = minimum_priority_queue () + 1; - } - else - { - this->priority (j+1, priority, subpriority, preemption_prio, i); - } - - ACE_OS::fprintf (file, " { %d, %d, %u }%s\n", - priority, - subpriority, - preemption_prio, - j == tasks () - 1 ? "" : ","); - } - ACE_OS::fprintf (file, " }%s /* end mode %u */\n", - i == modes () - 1 ? "" : ",", i); - } - - ACE_OS::fprintf (file, "\ - };\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::modes ()\n\ -{\n\ - return MODES;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::tasks ()\n\ -{\n\ - return TASKS;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::threads ()\n\ -{\n\ - return THREADS;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::minimum_priority_queue ()\n\ -{\n\ - return MINIMUM_PRIORITY_QUEUE;\n\ -}\n\ -\n\ -const char *\n\ -Scheduler_Runtime::task_name (const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_task_names_ [handle - 1];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::priority (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][0];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::subpriority (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][1];\n\ -}\n\ -\n\ -int\n\ -Scheduler_Runtime::preemption_prio (const unsigned int mode,\n\ - const unsigned int handle)\n\ -{\n\ - return Scheduler_Runtime_priorities_ [mode][handle - 1][2];\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::config ()\n\ -{\n\ - return 0;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::find (const char *operation_name)\n\ -{\n\ - for (unsigned int i = 0; i < TASKS; ++i)\n\ - if (! ACE_OS::strcmp (operation_name,\n\ - Scheduler_Runtime_task_names_ [i]))\n\ - return i + 1;\n\ -\n\ - return 0;\n\ -}\n\ -\n\ -unsigned int\n\ -Scheduler_Runtime::register_task (const unsigned int task)\n\ -{\n\ - if (Scheduler_Runtime_registered_tasks_ [task - 1] == 1)\n\ - {\n\ - return 0;\n\ - }\n\ - else\n\ - {\n\ - Scheduler_Runtime_registered_tasks_ [task - 1] = 1;\n\ - return task;\n\ - }\n\ -}\n\ -\n\ -"); - - if (ACE_OS::fprintf (file, "// EOF\n") > 0 && - ACE_OS::fclose (file) == 0) - { - return SUCCEEDED; - } - else - { - return UNABLE_TO_WRITE_SCHEDULE_FILE; - } - } - else - { - return UNABLE_TO_OPEN_SCHEDULE_FILE; - } -} - - -Scheduler::status_t -Scheduler_Internal::store_rt_info (const char *filename) -{ - FILE *file = ACE_OS::fopen (filename, "w"); - if (file) - { - const time_t now = ACE_OS::time (0); - - (void) ACE_OS::fprintf (file, - "# RT_Info provided for \"%s\" %s" - "# Version 1.1\n" - "# Format for each entry:\n" - "# entry name\n" - "# handle\n" - "# worst case execution time\n" - "# typical execution time\n" - "# cached execution time\n" - "# period\n" - "# importance\n" - "# quantum\n" - "# begin dependencies\n" - "# number of dependencies\n" - "# entry name, number of calls " - "(one of these lines per dependency, if any)\n" - "# end dependencies\n" - "# priority\n" - "# order within priority\n\n" - "%u modes\n%u operations\n\n", - filename, ACE_OS::ctime (&now), - modes (), tasks ()); - - RT_Info ***entry; - ACE_Unbounded_Set_Iterator <RT_Info **> - task_entries_i (task_entries_); - while (task_entries_i.next (entry) != 0) - { - task_entries_i.advance (); - export( (*entry) [0], file); - } - } - else - { - return UNABLE_TO_OPEN_SCHEDULE_FILE; - } - - if (ACE_OS::fprintf (file, "\n# end of file\n", 1) > 0 && - ACE_OS::fclose (file) == 0) - { - return SUCCEEDED; - } - else - { - return UNABLE_TO_WRITE_SCHEDULE_FILE; - } -} - - -// This implementation is incredibly ugly, but it sometimes works. The -// timeline viewer accepts start/stop pairs by task, and figures out the -// preemption. So, it's not necessary to figure out the preemptions. -Scheduler::status_t -Scheduler_Internal::generate_timeline ( - Mode_Entry const sorted_rt_info [], - const u_int number_of_tasks, - u_long frame_size, - ACE_Unbounded_Queue <Timeline_Entry> &jobs) -{ - if (number_of_tasks > 0) - { - u_long start = 0; - u_long stop = 0; - u_int i; - u_long *next_start; - u_long *leftover; - - ACE_NEW_RETURN (next_start, u_long [number_of_tasks], - ST_VIRTUAL_MEMORY_EXHAUSTED); - ACE_NEW_RETURN (leftover, u_long [number_of_tasks], - ST_VIRTUAL_MEMORY_EXHAUSTED); - - for (i = 0; i < number_of_tasks; ++i) - { - next_start [i] = 0; - leftover [i] = 0; - } - - while (stop <= frame_size) - { - for (i = number_of_tasks; i > 0; --i) - { - u_long execution_time = 0; // microseconds - - if (start < next_start [i - 1]) - { - if (leftover [i - 1] == 0) - { - // Not at this task's next start period, and it - // has no leftover work in it's current period, - // so move on to the next task. - - if (output_level () >= 3) - { - ACE_OS::printf (" continue for task %lu\n", - sorted_rt_info [i - 1].rt_info_->handle); - } - - continue; - } - else - { - if (output_level () >= 3) - { - ACE_OS::printf (" leftover for task %lu\n", - sorted_rt_info [i - 1].rt_info_->handle); - } - - execution_time = leftover [i - 1]; - leftover [i - 1] = 0; - } - } - else - { - if (output_level () >= 3) - { - ACE_OS::printf (" task %s reached next start of" - " %lu (at %lu)\n", - (const char*)sorted_rt_info [i - 1].rt_info_-> - entry_point, - next_start [i - 1], - start); - } - - execution_time = (u_long) - (sorted_rt_info [i - 1].rt_info_->worst_case_execution_time / - 10 /* us/100 ns */); - - next_start [i - 1] += - (u_long) (sorted_rt_info [i - 1].rt_info_->period / - 10 /* usec/100 ns */); - - if (output_level () >= 3) - { - ACE_OS::printf (" loaded next_start of %lu with " - "%lu\n", - sorted_rt_info [i - 1].rt_info_-> - handle, - next_start [i - 1]); - } - } - - if (output_level () >= 3) - { - ACE_OS::printf (" handle: %d, " - " execution_time: %lu, " - " leftover: %lu\n", - sorted_rt_info [i - 1].rt_info_->handle, - execution_time, - leftover [i - 1]); - } - - // Look for a start time of a higher priority task that - // is before this one can finish. - int will_finish = 1; - for (u_int j = number_of_tasks; j > i; --j) - { - // Skip over groups of array entries with the same period. - if (j < number_of_tasks && - sorted_rt_info [j - 1].rt_info_->period == - sorted_rt_info [j].rt_info_->period) - { - break; - } - - if (next_start [j - 1] > 0 && - next_start [j - 1] <= start + execution_time) - { - leftover [i - 1] = execution_time - - (next_start [j - 1] - start); - execution_time = next_start [j - 1] - start; - will_finish = 0; - if (output_level () >= 3) - { - ACE_OS::printf (" handle: %d, " - " execution_time: %lu, " - " leftover: %lu\n", - sorted_rt_info [i - 1].rt_info_-> - handle, - execution_time, - leftover [i - 1]); - } - } - - if (output_level () >= 2) - { - ACE_OS::printf (" period: %ld, time: %lu usec, " - " period ratio: %lu, " - " execution_time: %lu usec\n", - sorted_rt_info [j-1].rt_info_-> - period / 10 /* usec/100 ns */, - (u_long) (sorted_rt_info [j-1].rt_info_-> - worst_case_execution_time / 10 /* usec/100 ns */), - sorted_rt_info [j-1].rt_info_->period - > 0 - ? (u_long) (sorted_rt_info [i-1]. - rt_info_->period / - sorted_rt_info [j-1]. - rt_info_->period) - : 0, - execution_time / 10 /* usec/100 ns */); - } - } - - if (output_level () >= 3) - { - ACE_OS::printf (" period: %ld usec, time: %lu usec, " - " execution_time: %lu usec\n", - sorted_rt_info [i - 1].rt_info_-> - period / 10 /* usec/100 ns */, - (u_long) (sorted_rt_info [i - 1].rt_info_-> - worst_case_execution_time / 10 /* usec/100 ns */), - execution_time / 10 /* usec/100 ns */); - } - - jobs.enqueue_head (Timeline_Entry (sorted_rt_info [i - 1].rt_info_-> - handle, - sorted_rt_info [i - 1].rt_info_-> - entry_point, - start, - stop = start + execution_time, - next_start [i - 1])); - start = stop; - - if (! will_finish) - { - // don't bother to visit any other tasks: restart - // with the highest priority task - break; - } - } - - // figure out next start time based on periods only - u_long min_start = 0xFFFFFFFF; - for (i = 0; i < number_of_tasks; ++i) - { - if (min_start > next_start [i]) min_start = next_start [i]; - } - start = min_start; - - // if any tasks haven't finished the current period processing, - // let them try to finish by overwriting "start" with "stop" - for (i = 0; i < number_of_tasks; ++i) - { - if (leftover [i] > 0) - { - start = stop; - break; - } - } - } - - delete [] next_start; - next_start = 0; - delete [] leftover; - leftover = 0; - } - - return SUCCEEDED; -} - - -Scheduler::status_t -Scheduler_Internal::create_timelines (const char *filename) -{ - // Store each mode's timeline in a different file. Append the - // mode identifier to filename. - char full_filename [MAXPATHLEN]; - ACE_OS::strcpy (full_filename, filename); - char *filename_extension = full_filename + ACE_OS::strlen (filename); - if (filename_extension == 0) - { - return UNABLE_TO_OPEN_SCHEDULE_FILE; - } - - status_t status = SUCCEEDED; - - for (u_int mode = 0; - (status == SUCCEEDED || status == ST_UTILIZATION_BOUND_EXCEEDED) && - mode < modes (); - ++mode) - { - char mode_id[128]; - ACE_OS::sprintf (mode_id, "-mode_%d.timeline", mode + 1); - ACE_OS::strcpy (filename_extension, mode_id); - - FILE *const file = ACE_OS::fopen (full_filename, "w"); - if (file) - { - u_int i; - - // count the number of tasks in this mode with non-null RT_Info - u_int nonnull_tasks = 0; - for (i = 0; i < tasks (); ++i) - { - if (ordered_info_ [i][mode] != 0) - { - ++nonnull_tasks; - } - } - ACE_OS::fprintf (file, "%u\n", nonnull_tasks); /* number_of_tasks */ - - - ACE_OS::fprintf (file, "%lu\n", /* frame_size */ - frame_size_ [mode]); - ACE_OS::fprintf (file, "0 %lu\n", /* start stop_times */ - frame_size_ [mode]); - - ACE_Bounded_Set <u_int> emitted_tasks (nonnull_tasks); - u_int max_priority = 0x7FFFFFFF; - for (i = 0; i < tasks (); ++i) - { - u_int highest_priority = 0x7FFFFFFF; /* corresponds to lowest - queue number */ - u_int highest_priority_task = 0xFFFFFFFF; - - for (u_int j = 0; j < tasks (); ++j) - { - if (ordered_info_ [j][mode] != 0) - { - RtecScheduler::OS_Priority priority; - RtecScheduler::Sub_Priority subpriority; - RtecScheduler::Preemption_Priority preemption_prio; - this->priority (j+1, priority, subpriority, preemption_prio, - mode); - - if (i == 0) - { - if (max_priority > preemption_prio) - { - max_priority = preemption_prio; - } - } - - if (! emitted_tasks.find (j) && - highest_priority > preemption_prio) - { - highest_priority = preemption_prio; - highest_priority_task = j; - } - } - } - - /* task_name priority */ - if (highest_priority_task < 0xFFFFFFFF) - { - ACE_OS::fprintf (file, "%s %d\n", - /* task name */ - (const char*)ordered_info_ [highest_priority_task][mode]-> - entry_point, - /* queue number */ - minimum_priority_queue () - - (increasing_priority_ - ? ordered_info_ [highest_priority_task][mode]-> - priority - - minimum_priority_ - : minimum_priority_ - - ordered_info_ [highest_priority_task][mode]-> - priority)); - - emitted_tasks.insert (highest_priority_task); - } - } - - const u_int timeline_entries = (u_int) timeline_ [mode].size (); - for (i = 0; i < timeline_entries; ++i) - { - Timeline_Entry entry; - if (! timeline_ [mode].dequeue_head (entry)) - { - ACE_OS::fprintf (file, "%s %d %s\n%s %d %d\n", - entry.entry_point_, - entry.start_, - "", /* label */ - entry.entry_point_, - entry.stop_, - entry.next_start_); - } - } - - if (ACE_OS::fclose (file) != 0) - { - status = UNABLE_TO_WRITE_SCHEDULE_FILE; - } - } - else - { - status = UNABLE_TO_OPEN_SCHEDULE_FILE; - } - } - - return status; -} - - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Bounded_Set<RtecScheduler::RT_Info *>; -template class ACE_Bounded_Set<const RtecScheduler::RT_Info *>; -template class ACE_Bounded_Set<u_int>; -template class ACE_Bounded_Set_Iterator<RtecScheduler::RT_Info *>; -template class ACE_Node<Scheduler_Internal::Timeline_Entry>; -template class ACE_Node<RtecScheduler::RT_Info **>; -template class ACE_Unbounded_Queue<Scheduler_Internal::Timeline_Entry>; -template class ACE_Unbounded_Queue_Iterator< - Scheduler_Internal::Timeline_Entry>; -template class ACE_Unbounded_Set<RtecScheduler::RT_Info **>; -template class ACE_Unbounded_Set_Iterator<RtecScheduler::RT_Info **>; - -template class ACE_Map_Entry <RtecScheduler::RT_Info *, Scheduler::Sub_Priority>; -template class ACE_Map_Manager <RtecScheduler::RT_Info *, Scheduler::Sub_Priority, - ACE_Null_Mutex>; - -#if defined (ACE_HAS_THREADS) - template class ACE_Map_Entry<ACE_CString, RtecScheduler::RT_Info *>; - template class ACE_Map_Manager<ACE_CString, RtecScheduler::RT_Info *, ACE_Null_Mutex>; - template class ACE_Map_Iterator<ACE_CString, RtecScheduler::RT_Info *, ACE_Null_Mutex>; -#endif /* ACE_HAS_THREADS */ -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.h b/TAO/local/bin/Scheduling_Service/Scheduler_Internal.h deleted file mode 100644 index 45bd2060110..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.h +++ /dev/null @@ -1,252 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Internal.h -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - -#if ! defined (SCHEDULER_INTERNAL_H) -#define SCHEDULER_INTERNAL_H - -#include "ace/Containers.h" -#include "ace/ACE.h" - -#include "Scheduler.h" - -struct Mode_Entry; // for internal use only - -class Scheduler_Internal : public ACE_Scheduler - // = TITLE - // Implementation of an off-line scheduler. - // - // = DESCRIPTION - // Schedules tasks using rate-monotonic scheduling. -{ -public: - Scheduler_Internal (); - virtual ~Scheduler_Internal (); - - // = Initialize the scheduler. - virtual void init (const int minimum_priority, - const int maximum_priority, - const char *runtime_filename = 0, - const char *rt_info_filename = 0, - const char *timeline_filename = 0); - - // = Registers a task. - virtual status_t register_task (RT_Info *[], - const u_int number_of_modes, - handle_t &handle); - - virtual status_t lookup_rt_info (handle_t handle, - RT_Info* &rtinfo); - // Obtains an RT_Info based on its "handle". - - // = Computes the schedule. - virtual status_t schedule (void); - - // = Access a thread priority. - virtual int priority (const handle_t handle, - OS_Thread_Priority &priority, - Sub_Priority &subpriority, - Preemption_Priority &preemption_prio, - const mode_t = CURRENT_MODE) const; - // Defines "priority" as the priority that was assigned to the Task that - // was assigned "handle", for the specified mode. Defines "subpriority" - // as the relative ordering (due to dependencies) within the priority. - // Returns 0 on success, or 1 if an invalid mode or handle are supplied. - - typedef ACE_Map_Entry <ACE_CString, RT_Info *> Thread_Map_Entry; - typedef ACE_Map_Manager <ACE_CString, RT_Info *, ACE_Null_Mutex> - Thread_Map; - typedef ACE_Map_Iterator <ACE_CString, RT_Info *, ACE_Null_Mutex> - Thread_Map_Iterator; - -private: - u_int handles_; - // The number of task handles dispensed so far. - - int minimum_priority_; - // The minimum priority value that the application specified (in - // its call to init ()). - - int maximum_priority_; - // The maximum priority value that the application specified (in - // its call to init ()). - - const char *runtime_filename_; - // Destination file of Scheduler output from the configuration run. - - const char *rt_info_filename_; - // Destination file of all rt_info data from the configuration run. - - const char *timeline_filename_; - // The destination of the timeline. - - int increasing_priority_; - // Set to 1 if priority values increase with increasing priority, - // such as on Solaris and Win32, or 0 if they decrease, such as on - // VxWorks. - - ACE_Unbounded_Set <RT_Info **> task_entries_; - // Collection of known tasks. - - RT_Info ***ordered_info_; - // An ordered array of pointers to the RT_Info pointers stored - // in task_entries_. It is index by [handle][mode]. This permits - // efficient retrieval by get_priority (). - - ACE_Bounded_Set <const RT_Info *> *visited_; - // When updating dependencies, use this set to keep track of - // visited RT_Info instances in order to detect cycles in the - // dependency graph. It is dynamically allocated/deallocated so that - // it doesn't have to be "cleaned out" manually for each mode. - - ACE_Bounded_Set <RT_Info *> *leaves_; - // For 1) storing aggregate thread execution parameters during - // traversal of dependency chains, and - // 2) assigning priorities to all tasks. - - ACE_Bounded_Set <const RT_Info *> *dependencies_; - // Collection of RT_Info's that are dependent tasks, for efficient - // identification of dependency-chain roots. - - ACE_Bounded_Set <RT_Info *> *roots_; - // Collection of RT_Info's that are roots of dependency chains. - - status_t update_dependencies (RT_Info &, Sub_Priority subpriority); - // For each of this task's dependencies (transitively), increment its - // subpriority. The higher subpriorities indicate that the dependent - // tasks should run before this task. - - u_long *frame_size_; /* millisec */ - // For creating timelines (array indexed by mode). - - Thread_Map *thread_info_; - // Collection of known threads, dynamically allocated because - // it is reused for each mode. It consists of a amp of RT_Info - // instances, keyed by entry_point, that aggregate the info for the - // entire thread. Each instance has one dependency: the root - // RT_Info instance of the thread. - // *thread_info_ is an array, indexed by mode. - - Thread_Map *leaf_info_; - // Mapping from roots of dependency chains to their leaves. - -public: // for template specialization - struct Timeline_Entry - { - u_long handle_; - const char *entry_point_; - u_long start_; // microseconds - u_long stop_; // microseconds - u_long next_start_; - - Timeline_Entry (const u_long handle = 0, - const char *entry_point = 0, - const u_long start = 0, - const u_long stop = 0, - const u_long next_start = 0) - : handle_ (handle), - entry_point_ (entry_point), - start_ (start), - stop_ (stop), - next_start_ (next_start) {} - }; -private: -#if defined (ACE_HAS_THREADS) - typedef ACE_Recursive_Thread_Mutex LOCK; -#else - typedef ACE_Null_Mutex LOCK; -#endif /* ACE_HAS_THREADS */ - - LOCK lock_; - // This protects access to the scheduler during configuration runs. - - ACE_Unbounded_Queue <Timeline_Entry> *timeline_; - // For storing timelines. - - - /////////////////////////////////////// - // member functions for internal use // - /////////////////////////////////////// - - void reset (); - // Prepare for another schedule computation, but do not - // disturb the "output" (priorities that have already been assigned). - - status_t schedule_rms (const int minimum_priority, - const int maximum_priority); - // Computes the schedule using Rate Monotonic Scheduling. - - RT_Info &calculate_thread_properties (RT_Info &thread_info, - RT_Info &rt_info, - const u_int number_of_calls); - // Computes the execution time, etc., of the thread, identified by - // rt_info, and store it in thread_info, by recursively traversing - // the RT_Info call chain. Returns the root node. - - void print_schedule (); - // Display the schedule, task-by-task. - - status_t store_schedule (const char *filename); - // Store the schedule in the named file. - - status_t store_rt_info (const char *filename); - // Export all RT_Info to the named file. - - status_t identify_threads (); - // Assembles RT_Tasks into threads. - - status_t aggregate_thread_parameters (); - // Stores the aggregated thread parameters at each leaf (thread delineator) - // in the tread_info_ array. - - u_int find_number_of_threads (mode_t mode); - // Counts the number of threads in a mode based on the task dependencies. - - status_t find_thread_delineators (mode_t mode); - // Find and store the thread delineators: they have no dependencies - // and have a specified rate, or they have internal threads of their own. - - status_t find_dependency_chain_roots (mode_t mode); - // Find and store the roots of dependency chains. - - status_t find_dependency_chain_leaves (); - // Find and store the leaves of dependency chains. - - status_t generate_timeline ( - Mode_Entry const sorted_rt_info [], - const u_int number_of_tasks, - u_long frame_size, - ACE_Unbounded_Queue <Timeline_Entry> &jobs); - - status_t create_timelines (const char *filename); - // Create a timeline for each mode. - - // the following functions are not implememented - Scheduler_Internal (const Scheduler_Internal &); - Scheduler_Internal &operator= (const Scheduler_Internal &); -}; - - -#if defined (__ACE_INLINE__) -#include "Scheduler_Internal.i" -#endif /* __ACE_INLINE__ */ - -#endif /* SCHEDULER_INTERNAL_H */ - - -// EOF diff --git a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.i b/TAO/local/bin/Scheduling_Service/Scheduler_Internal.i deleted file mode 100644 index 91ee5915070..00000000000 --- a/TAO/local/bin/Scheduling_Service/Scheduler_Internal.i +++ /dev/null @@ -1,21 +0,0 @@ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// Scheduler_Internal.i -// -// = CREATION DATE -// 23 January 1997 -// -// = AUTHOR -// David Levine -// -// ============================================================================ - - -// EOF - diff --git a/TAO/local/bin/Scheduling_Service/dump_schedule.cpp b/TAO/local/bin/Scheduling_Service/dump_schedule.cpp deleted file mode 100644 index bdab1a0342e..00000000000 --- a/TAO/local/bin/Scheduling_Service/dump_schedule.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// -// $Id$ -// - -#include "ace/Sched_Params.h" -#include "ace/Get_Opt.h" -#include "tao/corba.h" - -#include "CosNamingC.h" -#include "Scheduler_Factory.h" - -// This program dumps the results of one scheduling in a C++ file. - - - -int main (int argc, char *argv[]) -{ - ACE_TRY - { - // Initialize ORB. - CORBA::ORB_ptr orb = - CORBA::ORB_init (argc, argv, "dump_schedule", ACE_TRY_ENV); - ACE_CHECK_ENV; - - CORBA::POA_ptr poa = - orb->POA_init(argc, argv, "POA"); - if (poa == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to initialize the POA.\n"), - 1); - } - - CORBA::Object_ptr objref = - orb->resolve_initial_references ("NameService"); - ACE_CHECK_ENV; - CosNaming::NamingContext_var naming_context = - CosNaming::NamingContext::_narrow (objref, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_Scheduler_Factory::use_config (naming_context.ptr ()); - - RtecScheduler::RT_Info_Set* infos; - ACE_Scheduler_Factory::server ()->compute_scheduling - (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_THREAD), - ACE_Sched_Params::priority_max (ACE_SCHED_FIFO, - ACE_SCOPE_THREAD), - infos, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_Scheduler_Factory::dump_schedule (*infos, - "Scheduler_Runtime.cpp"); - delete infos; - } - ACE_CATCH (CORBA::SystemException, sys_ex) - { - ACE_TRY_ENV.print_exception ("SYS_EX"); - } - ACE_ENDTRY; - - return 0; -} diff --git a/TAO/local/bin/Scheduling_Service/schedule_service.cpp b/TAO/local/bin/Scheduling_Service/schedule_service.cpp deleted file mode 100644 index bb4f303a1a3..00000000000 --- a/TAO/local/bin/Scheduling_Service/schedule_service.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// $Id$ -// - -#include "tao/corba.h" - -#include "CosNamingC.h" -#include "Config_Scheduler.h" - -int main (int argc, char *argv[]) -{ - ACE_TRY - { - // Initialize ORB. - CORBA::ORB_ptr orb = - CORBA::ORB_init (argc, argv, "internet", ACE_TRY_ENV); - ACE_CHECK_ENV; - - CORBA::POA_ptr poa = - orb->POA_init(argc, argv, "POA"); - if (poa == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to initialize the POA.\n"), - 1); - } - - CORBA::Object_ptr objref = - orb->resolve_initial_references ("NameService"); - ACE_CHECK_ENV; - - CosNaming::NamingContext_var naming_context = - CosNaming::NamingContext::_narrow (objref, ACE_TRY_ENV); - ACE_CHECK_ENV; - - // Create an Scheduling service servant... - RtecScheduler::Scheduler_ptr scheduler = new ACE_Config_Scheduler; - // CORBA::Object::_duplicate(scheduler); - ACE_CHECK_ENV; - - CORBA::String str = - orb->object_to_string (scheduler, ACE_TRY_ENV); - ACE_OS::puts ((char *) str); - - // Register the servant with the Naming Context.... - CosNaming::Name schedule_name (1); - schedule_name[0].id = CORBA::string_dup ("ScheduleService"); - schedule_name.length (1); - naming_context->bind (schedule_name, scheduler, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_DEBUG ((LM_DEBUG, "running scheduling service\n")); - if (orb->run () == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "run"), 1); - } - - CORBA::release (scheduler); - } - ACE_CATCHANY - { - ACE_TRY_ENV.print_exception ("schedule_service"); - } - ACE_ENDTRY; - - return 0; -} diff --git a/TAO/local/bin/Scheduling_Service/svc.conf b/TAO/local/bin/Scheduling_Service/svc.conf deleted file mode 100644 index 43c6a486c92..00000000000 --- a/TAO/local/bin/Scheduling_Service/svc.conf +++ /dev/null @@ -1,49 +0,0 @@ -# $Id$ -# -# This file contains a sample ACE_Service_Config configuration -# file specifying the strategy factories utilized by an application -# using TAO. There are currently only two possible factories: -# Client_Strategy_Factory and Server_Strategy_Factory. These names -# must be used as the second argument to their corresponding line, -# because that's what the ORB uses to find the desired factory. -# -# Note that there are two unordinary characteristics of the way *this* -# file is set up: -# - both client and server strategies are specified in the same -# file, which would only make sense for co-located clients & servers -# - both of the factories are actually sourced out of libTAO.so -# (TAO.DLL on Win32), and they would normally be in a separate -# dll from the TAO ORB Core. -# -# The options which can be passed to the Resource Factory are: -# -# -ORBresources <which> -# where <which> can be 'global' to specify globally-held resources, -# or 'tss' to specify thread-specific resources. -# -# The options which can be passed to the Client are: -# <none currently> -# -# The options which can be passed to the Server are: -# -# -ORBconcurrency <which> -# where <which> can be 'thread-per-connection' to specify -# use of the ACE_Threaded_Strategy concurrency strategy, -# or 'reactive' to specify use of the ACE_Reactive_Strategy -# concurrency strategy. -# -# -ORBthreadflags <flags> -# specifies the default thread flags to use, where <flags> is a -# logical OR'ing of the flags THR_DETACHED, THR_BOUND, THR_NEW_LWP, -# THR_SUSPENDED, or THR_DAEMON. Note that not every flag may be valid -# on every platform. -# -# -ORBdemuxstrategy <which> -# where <which> can be one of 'dynamic', 'linear', 'active', or 'user', -# and specifies the type of object lookup strategy used internally. -# -ORBtablesize <unsigned> -# specifies the size of the object table -# -dynamic Resource_Factory Service_Object * TAO:_make_TAO_Resource_Factory() "-ORBresources global" -dynamic Client_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Client_Strategy_Factory() -dynamic Server_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Server_Strategy_Factory() "-ORBconcurrency reactive -ORBdemuxstrategy dynamic -ORBtablesize 128" diff --git a/TAO/local/tests/Latency.cpp b/TAO/local/tests/Latency.cpp deleted file mode 100644 index d4cb5e7e496..00000000000 --- a/TAO/local/tests/Latency.cpp +++ /dev/null @@ -1,891 +0,0 @@ -// $Id$ - -#include <limits.h> -#if defined (quantify) - #include <quantify.h> -#endif /* quantify */ - -#include "ace/Get_Opt.h" -#include "ace/Sched_Params.h" -#include "ace/Profile_Timer.h" - -#include "tao/Timeprobe.h" -#include "Event_Utilities.h" -#include "Event_Service_Constants.h" -#include "Scheduler_Factory.h" -#include "RtecEventChannelAdminC.h" -#include "Latency.h" - -static const char usage [] = "[-? |\n" -" [-c <consumers> [4]]\n" -" [-d directly connect all consumers/suppliers\n" -" [-j to collect jitter statistics]\n" -" [-m <count> of messages to send [10]]\n" -" [-s <suppliers>, [1]]\n" -" [-t <timeout interval>, msec [250]]]"; - -// Configuration parameters. -static u_int consumers = 1; -static u_int suppliers = 1; -static u_int total_messages = 1000; -static int measure_jitter = 0; -static u_int timeout_interval = 250; // msec - -static int short_circuit_EC = 0; -static int shutting_down = 0; - -// This is global to allow the Supplier to short ciruit the EC -// and talk directly to consumers. For testing only :-) -static Latency_Consumer **consumer; - -// ************************************************************ - -Latency_Consumer::Latency_Consumer (const int measure_jitter) - : measure_jitter_ (measure_jitter), - min_latency_ (INT_MAX), - max_latency_ (INT_MIN), - total_latency_ (0), - total_pushes_ (0), - min_to_ec_ (INT_MAX), - max_to_ec_ (INT_MIN), - sum_to_ec_ (0), - min_in_ec_ (INT_MAX), - max_in_ec_ (INT_MIN), - sum_in_ec_ (0), - min_from_ec_ (INT_MAX), - max_from_ec_ (INT_MIN), - sum_from_ec_ (0) -{ -} - -int -Latency_Consumer::open_consumer (RtecEventChannelAdmin::EventChannel_ptr ec, - const char *my_name) -{ - entry_point (my_name); - ACE_TRY - { - RtecScheduler::Scheduler_ptr server = - ACE_Scheduler_Factory::server (); - - rt_info_ = - server->create (my_name, ACE_TRY_ENV); - server->set (rt_info_, - 1, 1, 1, 0, - RtecScheduler::VERY_LOW, - RtecScheduler::NO_QUANTUM, 1, - ACE_TRY_ENV); - - // Create the event that we're registering for. - ACE_ConsumerQOS_Factory dependencies; - dependencies.start_disjunction_group (); - dependencies.insert_type (ACE_ES_EVENT_NOTIFICATION, rt_info_); - dependencies.insert_type (ACE_ES_EVENT_SHUTDOWN, rt_info_); - - this->channel_admin_ = ec; - - // = Connect as a consumer. - consumer_admin_ = - RtecEventChannelAdmin::ConsumerAdmin::_duplicate(channel_admin_->for_consumers (ACE_TRY_ENV)); - ACE_CHECK_ENV; - suppliers_ = - RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(consumer_admin_->obtain_push_supplier (ACE_TRY_ENV)); - ACE_CHECK_ENV; - suppliers_->connect_push_consumer (this, - dependencies.get_ConsumerQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCH (const ACE_EventChannel::SUBSCRIPTION_ERROR, se) - { - ACE_ERROR_RETURN ((LM_ERROR, - "Latency_Consumer::open: " - "subscribe failed.\n"), -1); - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "Latency_Consumer::open: " - "unexpected exception.\n"), -1); - } - ACE_ENDTRY; - - return 0; -} - -void -Latency_Consumer::disconnect_push_consumer (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Consumer received disconnect from channel.\n")); -} - -void -Latency_Consumer::push (const RtecEventComm::EventSet &events, - CORBA::Environment &) -{ - // ACE_DEBUG ((LM_DEBUG, "Latency_Consumer:push - ")); - ACE_TIMEPROBE ("push event to consumer"); - - if (events.length () == 0) - { - // ACE_DEBUG ((LM_DEBUG, "no events\n")); - return; - } - // ACE_DEBUG ((LM_DEBUG, "%d event(s)\n", events.length ())); - -#if defined (quantify) - // If measuring jitter, just Quantify the supplier-consumer path. - if (measure_jitter) - { - quantify_stop_recording_data (); - } -#endif /* quantify */ - - for (int i = 0; i < events.length (); ++i) - { - if (events[i].type_ == ACE_ES_EVENT_SHUTDOWN) - { - ACE_DEBUG ((LM_DEBUG, "Latency Consumer: received shutdown event\n")); - this->shutdown (); - } - else - { - if (measure_jitter_) - { - // @@ TOTAL HACK - ACE_hrtime_t creation; - ACE_OS::memcpy (&creation, &events[i].creation_time_, - sizeof (creation)); - - ACE_hrtime_t ec_recv; - ACE_OS::memcpy (&ec_recv, &events[i].ec_recv_time_, - sizeof (ec_recv)); - - ACE_hrtime_t ec_send; - ACE_OS::memcpy (&ec_send, &events[i].ec_send_time_, - sizeof (ec_send)); - - const ACE_hrtime_t now = ACE_OS::gethrtime (); - const ACE_hrtime_t elapsed = now - creation; - // Note: the division by 1 provides transparent support of - // ACE_U_LongLong. - ACE_Time_Value latency (elapsed / ACE_ONE_SECOND_IN_NSECS, - (elapsed / 1 % ACE_ONE_SECOND_IN_NSECS) / 1000); - - const ACE_hrtime_t to_ec_nsecs = ec_recv - creation; - ACE_Time_Value to_ec (to_ec_nsecs / ACE_ONE_SECOND_IN_NSECS, - (to_ec_nsecs / 1 % ACE_ONE_SECOND_IN_NSECS) / 1000); - - const ACE_hrtime_t in_ec_nsecs = ec_send - ec_recv; - ACE_Time_Value in_ec (in_ec_nsecs / ACE_ONE_SECOND_IN_NSECS, - (in_ec_nsecs / 1 % ACE_ONE_SECOND_IN_NSECS) / 1000); - - const ACE_hrtime_t from_ec_nsecs = now - ec_send; - ACE_Time_Value from_ec (from_ec_nsecs / ACE_ONE_SECOND_IN_NSECS, - (from_ec_nsecs / 1 % ACE_ONE_SECOND_IN_NSECS) / 1000); - - if (! shutting_down) - { - ++total_pushes_; - if (min_latency_ > latency) min_latency_ = latency; - if (max_latency_ < latency) max_latency_ = latency; - total_latency_ += latency; - if (min_to_ec_ > to_ec) min_to_ec_ = to_ec; - if (max_to_ec_ < to_ec) max_to_ec_ = to_ec; - sum_to_ec_ += to_ec; - if (min_in_ec_ > in_ec) min_in_ec_ = in_ec; - if (max_in_ec_ < in_ec) max_in_ec_ = in_ec; - sum_in_ec_ += in_ec; - if (min_from_ec_ > from_ec) min_from_ec_ = from_ec; - if (max_from_ec_ < from_ec) max_from_ec_ = from_ec; - sum_from_ec_ += from_ec; - } - } - } - - } -} - -void -Latency_Consumer::shutdown (void) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) %s shutting down.\n", entry_point ())); - - ACE_TRY - { - // Disconnect from the push supplier. - suppliers_->disconnect_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - - CORBA::release (suppliers_); - - ACE_DEBUG ((LM_DEBUG, "@@ we should shutdown here!!!\n")); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, - "(%t) %s Latency_Consumer::shutdown: unexpected exception.\n", - entry_point ())); - } - ACE_ENDTRY; -} - - -void -Latency_Consumer::print_stats () /* const */ -{ - if (measure_jitter_) - { - double lat_min = - (min_latency_.sec () * 1000000.0 + min_latency_.usec ()) / 1000.0; - double lat_max = - (max_latency_.sec () * 1000000.0 + max_latency_.usec ()) / 1000.0; - double lat_avg = - (total_latency_.sec () * 1000000.0 +total_latency_.usec ()) / total_pushes_ / 1000.0; - ACE_DEBUG ((LM_TRACE, - "%s: Latency in msec (min/max/avg): " - "%5.3f/%5.3f/%5.3f\n", - entry_point (), lat_min, lat_max, lat_avg)); - - double to_ec_min = - (min_to_ec_.sec () * 1000000.0 + min_to_ec_.usec ()) / 1000.0; - double to_ec_max = - (max_to_ec_.sec () * 1000000.0 + max_to_ec_.usec ()) / 1000.0; - double to_ec_avg = - (sum_to_ec_.sec () * 1000000.0 + sum_to_ec_.usec ()) / total_pushes_ / 1000.0; - ACE_DEBUG ((LM_TRACE, - "%s: From test to EC (min/max/avg): " - "%5.3f/%5.3f/%5.3f\n", - entry_point (), to_ec_min, to_ec_max, to_ec_avg)); - - double in_ec_min = - (min_in_ec_.sec () * 1000000.0 + min_in_ec_.usec ()) / 1000.0; - double in_ec_max = - (max_in_ec_.sec () * 1000000.0 + max_in_ec_.usec ()) / 1000.0; - double in_ec_avg = - (sum_in_ec_.sec () * 1000000.0 + sum_in_ec_.usec ()) / total_pushes_ / 1000.0; - ACE_DEBUG ((LM_TRACE, - "%s: In the EC (min/max/avg): " - "%5.3f/%5.3f/%5.3f\n", - entry_point (), in_ec_min, in_ec_max, in_ec_avg)); - - double from_ec_min = - (min_from_ec_.sec () * 1000000.0 + min_from_ec_.usec ()) / 1000.0; - double from_ec_max = - (max_from_ec_.sec () * 1000000.0 + max_from_ec_.usec ()) / 1000.0; - double from_ec_avg = - (sum_from_ec_.sec () * 1000000.0 + sum_from_ec_.usec ()) / total_pushes_ / 1000.0; - ACE_DEBUG ((LM_TRACE, - "%s: From EC to test (min/max/avg): " - "%5.3f/%5.3f/%5.3f\n", - entry_point (), from_ec_min, from_ec_max, from_ec_avg)); - - } -} - - -// ************************************************************ - -Latency_Supplier::Supplier::Supplier (Latency_Supplier* impl) - : impl_ (impl) -{ -} - -void Latency_Supplier::Supplier::disconnect_push_supplier - (CORBA::Environment &_env) -{ - this->impl_->disconnect_push_supplier (_env); -} - -Latency_Supplier::Consumer::Consumer (Latency_Supplier* impl) - : impl_ (impl) -{ -} - -void Latency_Supplier::Consumer::disconnect_push_consumer - (CORBA::Environment &_env) -{ - this->impl_->disconnect_push_consumer (_env); -} - -void Latency_Supplier::Consumer::push - (const RtecEventComm::EventSet &events, - CORBA::Environment &_env) -{ - this->impl_->push (events, _env); -} - -// ************************************************************ - -Latency_Supplier::Latency_Supplier (const u_int total_messages, - CORBA::Long supplier_id, - const int timestamp) - : total_messages_ (total_messages), - supplier_id_ (supplier_id), - timestamp_ (timestamp), - total_sent_ (0), - master_ (0), - supplier_ (new Supplier (this)), - consumer_ (new Consumer (this)) -{ - CORBA::Object::_duplicate (this->supplier_); - CORBA::Object::_duplicate (this->consumer_); -} - -Latency_Supplier::~Latency_Supplier (void) -{ - CORBA::release (this->supplier_); - CORBA::release (this->consumer_); -} - -int -Latency_Supplier::open_supplier (RtecEventChannelAdmin::EventChannel_ptr ec, - const char *name, int master) -{ - this->entry_point (name); - master_ = master; - ACE_TRY - { - RtecScheduler::Scheduler_ptr server = - ACE_Scheduler_Factory::server (); - - rt_info_ = - server->create (name, ACE_TRY_ENV); - - server->set (rt_info_, 1, 1, 1, timeout_interval * 10000, - RtecScheduler::VERY_LOW, - RtecScheduler::NO_QUANTUM, 1, - ACE_TRY_ENV); - -#if 0 - SUPPLIER_NS::RegisterService - (entry_point (), - // ACE_Naming::NOBJECT, - NOBJECT, this); -#endif /* 0 */ - - ACE_SupplierQOS_Factory publications; - publications.insert (supplier_id_, - ACE_ES_EVENT_NOTIFICATION, - rt_info_, 1); - publications.insert (supplier_id_, - ACE_ES_EVENT_SHUTDOWN, - rt_info_, 1); - - this->channel_admin_ = ec; - - // = Connect as a supplier. - supplier_admin_ = - RtecEventChannelAdmin::SupplierAdmin::_duplicate(channel_admin_->for_suppliers (ACE_TRY_ENV)); - ACE_CHECK_ENV; - consumers_ = - RtecEventChannelAdmin::ProxyPushConsumer::_duplicate(supplier_admin_->obtain_push_consumer (ACE_TRY_ENV)); - ACE_CHECK_ENV; - - consumers_->connect_push_supplier (this->supplier_, - publications.get_SupplierQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_TRY_ENV.print_exception ("Latency_Supplier::open"); - return -1; - } - ACE_ENDTRY; - - return 0; -} - -void -Latency_Supplier::disconnect_push_consumer (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Supplier-consumer received disconnect from channel.\n")); -} - -void -Latency_Supplier::disconnect_push_supplier (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Supplier received disconnect from channel.\n")); -} - -int -Latency_Supplier::start_generating_events (void) -{ - const ACE_hrtime_t now = ACE_OS::gethrtime (); - test_start_time_.set (now / 1000000000, (now / 1 % 1000000000) / 1000); - - ACE_TRY - { - ACE_ConsumerQOS_Factory dependencies; - dependencies.start_disjunction_group (); - dependencies.insert_time (ACE_ES_EVENT_INTERVAL_TIMEOUT, - timeout_interval * 10000, - rt_info_); - if (!master_) - dependencies.insert_type (ACE_ES_EVENT_SHUTDOWN, rt_info_); - - // = Connect as a consumer. - consumer_admin_ = - RtecEventChannelAdmin::ConsumerAdmin::_duplicate(channel_admin_->for_consumers (ACE_TRY_ENV)); - ACE_CHECK_ENV; - suppliers_ = - RtecEventChannelAdmin::ProxyPushSupplier::_duplicate(consumer_admin_->obtain_push_supplier (ACE_TRY_ENV)); - ACE_CHECK_ENV; - - suppliers_->connect_push_consumer (this->consumer_, - dependencies.get_ConsumerQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "Latency_Supplier::generate_events:" - " unexpected exception.\n"), -1); - } - ACE_ENDTRY; - - return 0; -} - -void -Latency_Supplier::push (const RtecEventComm::EventSet &events, - CORBA::Environment & _env) -{ - // ACE_DEBUG ((LM_DEBUG, "Latency_Supplier::push - ")); - - if (events.length () == 0) - { - // ACE_DEBUG ((LM_DEBUG, "no events\n")); - return; - } - - // ACE_DEBUG ((LM_DEBUG, "%d event(s)\n", events.length ())); - - for (int i = 0; i < events.length (); ++i) - { - if (!master_ && events[i].type_ == ACE_ES_EVENT_SHUTDOWN) - { - ACE_DEBUG ((LM_DEBUG, "Latency Supplier: received shutdown event\n")); - this->shutdown (); - } - else if (events[i].type_ == ACE_ES_EVENT_INTERVAL_TIMEOUT) - { - // Create the event to send. - RtecEventComm::Event event; - event.source_ = supplier_id_; - event.type_ = ACE_ES_EVENT_NOTIFICATION; - ++total_sent_; - - if (timestamp_) - { - // @@ David, event.time_ is now a long. I'm not sure if - // this calculation is correct now. For the moment beign - // I use a global variable instead. - // const ACE_hrtime_t now = ACE_OS::gethrtime (); - // event.time_.set (now / ACE_ONE_SECOND_IN_NSECS, - // (now % ACE_ONE_SECOND_IN_NSECS) / 1000); - - // @@ TOTAL HACK - // event_push_time = ACE_OS::gethrtime (); - ACE_hrtime_t t = ACE_OS::gethrtime (); - ACE_OS::memcpy (&event.creation_time_, &t, - sizeof (event.creation_time_)); - } - - // @@ ACE_TIMEPROBE_RESET; - // @@ ACE_TIMEPROBE ("start with new event in Supplier"); - - ACE_TRY - { - if (short_circuit_EC) - { - for (u_int cons = 0; cons < consumers; ++cons) - { - // This constructor is fast. - const RtecEventComm::EventSet es (1, 1, &event); - consumer [cons]->push (es, ACE_TRY_ENV); - } - } - else - { -#if defined (quantify) - // If measuring jitter, just Quantify the supplier-consumer path. - if (measure_jitter) - { - quantify_start_recording_data (); - } -#endif /* quantify */ - - ACE_TIMEPROBE (" supplier starts pushing event"); - - RtecEventComm::EventSet events (1); - events.length (1); - events[0] = event; - consumers_->push (events, ACE_TRY_ENV); - - ACE_TIMEPROBE (" supplier ends pushing event"); - } - ACE_CHECK_ENV; - } - ACE_CATCH (RtecEventComm::Disconnected, d) - { - ACE_ERROR ((LM_ERROR, "(%t) Latency_Supplier::push: disconnected.\n")); - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "(%t) %s Latency_Supplier::push:" - " unexpected exception.\n", - entry_point ())); - } - ACE_ENDTRY; - - // Check if we're done. - if (master_ && (total_sent_ >= total_messages_)) - this->shutdown (); - } - else - { - ACE_ERROR ((LM_ERROR, "(%t) %s received unexpected events: ", - entry_point ())); - // ::dump_sequence (events); - return; - } - } -} - -void -Latency_Supplier::shutdown (void) -{ - shutting_down = 1; - - #if defined (quantify) - // Need to stop recording here even if testing for jitter, because - // recording is still probably enabled. - quantify_stop_recording_data (); - if (! measure_jitter) - { - ACE_DEBUG ((LM_DEBUG, "(%t) stopped Quantify recording\n")); - } - #endif /* quantify */ - - const ACE_hrtime_t now = ACE_OS::gethrtime (); - test_stop_time_.set (now / ACE_ONE_SECOND_IN_NSECS, - (now / 1 % ACE_ONE_SECOND_IN_NSECS) / 1000); - - static int total_iterations = 1; - if (--total_iterations > 0) - { - total_sent_ = 0; - return; - } - - ACE_TRY - { - if (master_) - { - // Create the shutdown message. - RtecEventComm::Event event; - event.source_ = supplier_id_; - event.type_ = ACE_ES_EVENT_SHUTDOWN; - - // Push the shutdown event. - RtecEventComm::EventSet events (1); - events.length (1); - events[0] = event; - consumers_->push (events, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - - // Disconnect from the channel. - consumers_->disconnect_push_consumer (ACE_TRY_ENV); - ACE_CHECK_ENV; - - // Disconnect from the push supplier. - suppliers_->disconnect_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - - if (master_) - { - // @@ TODO: Do this portably (keeping the ORB_ptr returned from - // ORB_init) - channel_admin_->destroy (ACE_TRY_ENV); - ACE_CHECK_ENV; - - TAO_ORB_Core_instance ()->orb ()->shutdown (); - } - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "(%t) %s Latency_Supplier::shutdown:" - " unexpected exception.\n", - entry_point ())); - ACE_TRY_ENV.print_exception ("Latency_Supplier::shutdown"); - } - ACE_ENDTRY; -} - - -void -Latency_Supplier::print_stats () /* const */ -{ - ACE_Time_Value test_elapsed_time (test_stop_time_ - test_start_time_); - const u_int elapsed = test_elapsed_time.sec () * 1000000 + - test_elapsed_time.usec (); // usec - - ACE_DEBUG ((LM_TRACE, - "%s: delivered %u events to %u consumer(s) in %u msec;\n" - " per-event average was %8.3f msec.\n", - entry_point (), - total_sent_, - consumers / suppliers + consumers % suppliers, - elapsed / 1000, - (double) elapsed / total_sent_ / 1000.0)); -} - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// function get_options -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -static -unsigned int -get_options (int argc, char *argv []) -{ - ACE_Get_Opt get_opt (argc, argv, "Oc:djm:s:t:?"); - int opt; - int temp; - - while ((opt = get_opt ()) != EOF) - { - switch (opt) { - case 'c': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - consumers = (u_int) temp; - } - else - { - ACE_ERROR_RETURN ((LM_ERROR, - "%s: number of consumers must be > 0", - argv[0]), 1); - } - break; - case 'd': - short_circuit_EC = 1; - break; - case 'j': - measure_jitter = 1; - break; - case 'm': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - total_messages = (u_int) temp; - } - else - { - ACE_ERROR_RETURN ((LM_ERROR, - "%s: count must be > 0", - argv[0]), 1); - } - break; - case 's': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - suppliers = (u_int) temp; - } - else - { - ACE_ERROR_RETURN ((LM_ERROR, - "%s: number of suppliers must be > 0", - argv[0]), 1); - } - break; - case 't': - if (ACE_OS::atoi (get_opt.optarg) >= 0) - { - timeout_interval = ACE_OS::atoi (get_opt.optarg); - } - else - { - ACE_ERROR_RETURN ((LM_ERROR, - "%s: timeout must be >= 0", - argv[0]), 1); - } - break; - case '?': - ACE_DEBUG ((LM_DEBUG, - "Usage: %s %s\n", - argv[0], usage)); - ACE_OS::exit (0); - break; - default: - ACE_ERROR_RETURN ((LM_ERROR, - "%s: unknown arg, -%c\n" - "Usage: %s %s\n", - argv[0], char(opt), - argv[0], usage), 1); - } - } - - if (argc != get_opt.optind) - { - ACE_ERROR_RETURN ((LM_ERROR, - "%s: too many arguments\n" - "Usage: %s %s\n", - argv[0], argv[0], usage), 1); - } - - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// function main -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -int -main (int argc, char *argv []) -{ - if (ACE_OS::sched_params ( - ACE_Sched_Params ( - ACE_SCHED_FIFO, - ACE_Sched_Params::priority_min (ACE_SCHED_FIFO), - ACE_SCOPE_PROCESS)) != 0) - { - if (ACE_OS::last_error () == EPERM) - { - ACE_DEBUG ((LM_MAX, "Latency: user is not superuser, " - "so remain in time-sharing class\n")); - } - else - { - ACE_DEBUG ((LM_ERROR, "%p\n", "Latency")); - ACE_OS::exit (-1); - } - } - - u_int i; - - ACE_TRY - { - // Initialize ORB. - CORBA::ORB_ptr orb = - CORBA::ORB_init (argc, argv, "internet", ACE_TRY_ENV); - ACE_CHECK_ENV; - - CORBA::POA_ptr poa = - orb->POA_init(argc, argv, "POA"); - - if (get_options (argc, argv)) - ACE_OS::exit (-1); - - - - CORBA::Object_ptr objref = - orb->resolve_initial_references ("NameService"); - ACE_CHECK_ENV; - CosNaming::NamingContext_var naming_context = - CosNaming::NamingContext::_narrow (objref, ACE_TRY_ENV); - ACE_CHECK_ENV; - - ACE_Scheduler_Factory::use_config (naming_context.ptr ()); - - // Allocate the timeprobe instance now, so we don't measure - // the cost of doing it later. - ACE_TIMEPROBE_RESET; - - CosNaming::Name channel_name (1); - channel_name[0].id = CORBA::string_dup ("EventService"); - channel_name.length (1); - - CORBA::Object_ptr ec_ptr = - naming_context->resolve (channel_name, ACE_TRY_ENV); - ACE_CHECK_ENV; - RtecEventChannelAdmin::EventChannel_var ec = - RtecEventChannelAdmin::EventChannel::_narrow (ec_ptr, ACE_TRY_ENV); - ACE_CHECK_ENV; - - // Create supplier(s). - Latency_Supplier **supplier; - ACE_NEW_RETURN (supplier, Latency_Supplier *[suppliers], -1); - for (i = 0; i < suppliers; ++i) - { - int supplier_timestamps = (i==0); - ACE_NEW_RETURN (supplier [i], - Latency_Supplier (total_messages, - measure_jitter, - supplier_timestamps), - -1); - char supplier_name [BUFSIZ]; - sprintf (supplier_name, "supplier-%d", i+1); - // Only the first supplier timestamps its messages. - int master = (i==0); - if (supplier [i]->open_supplier (ec.ptr (), - supplier_name, - master) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "Supplier open failed.\n"), -1); - } - - // Create consumers. - ACE_NEW_RETURN (consumer, Latency_Consumer *[consumers], -1); - for (i = 0; i < consumers; ++i) - { - ACE_NEW_RETURN (consumer [i], Latency_Consumer (measure_jitter), -1); - RtecEventComm::PushConsumer::_duplicate (consumer[i]); - char buf [BUFSIZ]; - sprintf (buf, "consumer-%d", i+1); - - if (consumer [i]->open_consumer (ec.ptr (), buf) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "Someone was feeling introverted.\n"), - -1); - } - - #if defined (quantify) - if (! measure_jitter) - { - ACE_DEBUG ((LM_DEBUG, "(%t) start Quantify recording\n")); - quantify_start_recording_data (); - } - #endif /* quantify */ - - // Tell supplier(s) to generate events. - for (i = 0; i < suppliers; ++i) - { - if (supplier [i]->start_generating_events () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "generate_events failed.\n"), -1); - } - - orb->run (); - - for (i = 0; i < suppliers; ++i) - { - supplier [i]->print_stats (); - delete supplier[i]; - ACE_CHECK_ENV; - } - delete [] supplier; - - for (i = 0; i < consumers; ++i) - { - consumer [i]->print_stats (); - CORBA::release (consumer [i]); - ACE_CHECK_ENV; - } - delete [] consumer; - - ACE_TIMEPROBE_PRINT; - ACE_TIMEPROBE_FINI; - } - ACE_CATCH (CORBA::SystemException, sys_ex) - { - ACE_TRY_ENV.print_exception ("SYS_EX"); - } - ACE_ENDTRY; - - - return 0; -} diff --git a/TAO/local/tests/Latency.h b/TAO/local/tests/Latency.h deleted file mode 100644 index e9384715a32..00000000000 --- a/TAO/local/tests/Latency.h +++ /dev/null @@ -1,250 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ACE Event Service Benchmarks -// -// = FILENAME -// Latency.h -// -// = AUTHOR -// David Levine (levine@cs.wustl.edu) and -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// -// ============================================================================ - -#if !defined (LATENCY_H) -#define LATENCY_H - -#include "ace/SString.h" -#include "RtecEventChannelAdminC.h" -#include "RtecEventCommS.h" - -class Latency_Consumer : public POA_RtecEventComm::PushConsumer -// = TITLE -// Latency Consumer -// -// = DESCRIPTION -// Simple example of a consumer that registers for supplier -// notifications. -{ -public: - Latency_Consumer (const int measure_jitter = 0); - // Construction. The default of not measuring jitter provides - // a "null" push routine, for measuring aggregate timing. - - int open_consumer (RtecEventChannelAdmin::EventChannel_ptr ec, - const char *my_name); - // Uses the name server to obtain a reference to the <supplier_name> - // and registers with channel to receive notifications from the - // supplier. Also registers to receive shutdown messages from the - // supplier. Stores <my_name> for printing out messages. Returns 0 - // on success, -1 on failure. - - virtual void disconnect_push_consumer (CORBA::Environment &); - // The channel is disconnecting. - - void entry_point (const char*); - const char *entry_point () const; - - void print_stats () /* const */; - // Print timing statistics. - -// (not protected to allow short-circuiting) protected: - virtual void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // If the <events>[0] is a notification, prints out the data from - // the supplier. If its a shutdown message, the consumer - // disconnects from the channel. - -protected: - void shutdown (void); - // Disconnect from the Event Service. - - // = Event channel adminstration references. - RtecEventChannelAdmin::EventChannel_var channel_admin_; - RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin_; - RtecEventChannelAdmin::ProxyPushSupplier_ptr suppliers_; - -private: - RtecScheduler::handle_t rt_info_; - - int measure_jitter_; - - ACE_Time_Value min_latency_; - ACE_Time_Value max_latency_; - ACE_Time_Value total_latency_; - u_long total_pushes_; - // Registers and counters for keeping track of latency statistics. - - ACE_Time_Value min_to_ec_; - ACE_Time_Value max_to_ec_; - ACE_Time_Value sum_to_ec_; - // Statitics on time to get to the EC. - - ACE_Time_Value min_in_ec_; - ACE_Time_Value max_in_ec_; - ACE_Time_Value sum_in_ec_; - // Statitics on time spent in the EC. - - ACE_Time_Value min_from_ec_; - ACE_Time_Value max_from_ec_; - ACE_Time_Value sum_from_ec_; - // Statitics on time spent since the EC put the event on the wire - // and it gets here. - - ACE_CString entry_point_; -}; - -// ************************************************************ - -class Latency_Supplier -// = TITLE -// Latency Supplier -// -// = DESCRIPTION -// Generates event nofications and a shutdown message. -{ -public: - - // - // This class provides IS-A Consumer and Supplier of events. But - // inheritance from two skeleton classes is non-complaint (or at - // least won't work with TAO). We use smaller implementation classes - // that delegate on Latency_Supplier to do the job. - // - class Supplier : public POA_RtecEventComm::PushSupplier { - public: - virtual void disconnect_push_supplier (CORBA::Environment &); - // The channel is disconnecting. - - private: - Supplier (Latency_Supplier* impl); - friend class Latency_Supplier; - - private: - Latency_Supplier* impl_; - }; - - class Consumer : public POA_RtecEventComm::PushConsumer { - public: - virtual void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // The channel pushed some events to us. - - virtual void disconnect_push_consumer (CORBA::Environment &); - // The channel is disconnecting. - - private: - Consumer (Latency_Supplier* impl); - friend class Latency_Supplier; - - private: - Latency_Supplier* impl_; - }; - - Latency_Supplier (const u_int total_messages, - CORBA::Long supplier_id, - const int timestamp = 0); - // Construction. Requires the total number of messages to be - // sent. If the timestamp flag is enabled, then events are - // timestamped, e.g., for use in measuring jitter. - - ~Latency_Supplier (void); - - int open_supplier (RtecEventChannelAdmin::EventChannel_ptr event_channel, - const char *name, int master); - // Registers with the name server under the given <name>. Also - // connects to the Event Channel as a supplier of notifications and - // shutdown messages. If <master> != 0, then the supplier will - // destroy the channel upon shutting down. Returns 0 on success, -1 - // on failure. - - void disconnect_push_supplier (CORBA::Environment &); - // The channel is disconnecting. - - void disconnect_push_consumer (CORBA::Environment &); - // The channel is disconnecting. - - void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // Takes a timestamp and then pushes event_ to all consumers, either - // directly, or via a channel. - - int start_generating_events (void); - // Called when the supplier should start generating events. - // Registers with the Event Channel to receive timeouts every .25 - // seconds. Will generate some number of events and then send a - // shutdown message. Returns 0 on success, -1 on failure. - - void entry_point (const char *); - const char *entry_point () const; - - void print_stats () /* const */; - // Print timing statistics. - -protected: - - void shutdown (void); - // Disconnect from the Event Service. - - // = Event Channel adminstration references. - RtecEventChannelAdmin::EventChannel_var channel_admin_; - RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin_; - RtecEventChannelAdmin::ProxyPushConsumer_var consumers_; - RtecEventChannelAdmin::SupplierAdmin_var supplier_admin_; - RtecEventChannelAdmin::ProxyPushSupplier_var suppliers_; - -private: - RtecScheduler::handle_t rt_info_; - - u_int total_messages_; - // How many events to push before ending the test. - - CORBA::Long supplier_id_; - // Our supplier ID. - - int timestamp_; - // Flag indicating whether or not to timestamp outgoing events. - - u_int total_sent_; - // How many events we've pushed. - - ACE_Time_Value test_start_time_; - ACE_Time_Value test_stop_time_; - // Start/stop times, marking the time period when events are - // sent to consumers. - - int master_; - - ACE_CString entry_point_; - - Supplier* supplier_; - Consumer* consumer_; -}; - -void Latency_Consumer::entry_point(const char* s) -{ - entry_point_ = s; -} - -const char* Latency_Consumer::entry_point (void) const -{ - return entry_point_.fast_rep (); -} - -void Latency_Supplier::entry_point(const char* s) -{ - entry_point_ = s; -} - -const char* Latency_Supplier::entry_point (void) const -{ - return entry_point_.fast_rep (); -} - -#endif /* LATENCY_H */ diff --git a/TAO/local/tests/Makefile b/TAO/local/tests/Makefile deleted file mode 100644 index 7997cf23477..00000000000 --- a/TAO/local/tests/Makefile +++ /dev/null @@ -1,262 +0,0 @@ -# -# $Id$ -# - -BIN = Latency # This is not compiling (yet) Utilization - -BUILD = $(BIN) - -LATENCY_SRCS= \ - Latency.cpp -UTILIZATION_SRCS= \ - Utilization.cpp - -LSRC= \ - $(LATENCY_SRCS) \ - $(UTILIZATION_SRCS) - -LATENCY_OBJS = $(LATENCY_SRCS:.cpp=.o) -UTILIZATION_OBJS = $(UTILIZATION_SRCS:.cpp=.o) - -LDLIBS= -lorbsvcs -lTAO - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(ACE_ROOT)/include/makeinclude/macros.GNU -include $(ACE_ROOT)/include/makeinclude/rules.common.GNU -include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU -include $(ACE_ROOT)/include/makeinclude/rules.local.GNU - -#### compiler-specific options -ifeq ($(CXX),g++) - CCFLAGS += -pedantic -else -ifeq ($(CXX),CC) -endif -endif - -ifdef quantify - CCFLAGS += -Dquantify - CPPFLAGS += -I/pkg/purify/quantify-2.1-solaris2 -endif # quantify - -#### Local rules and variables... - -ifndef TAO_ROOT -TAO_ROOT = $(ACE_ROOT)/TAO -endif -TSS_ORB_FLAG = #-DTAO_HAS_TSS_ORBCORE -DCFLAGS = -g -LDFLAGS += -L$(TAO_ROOT)/orbsvcs/lib -L$(TAO_ROOT)/tao -CPPFLAGS += -I$(TAO_ROOT)/orbsvcs/lib -I$(TAO_ROOT) -I$(TAO_ROOT)/tao/compat $(TSS_ORB_FLAG)#-H - -# Leave the scheduler output out if this is a config run. -ifneq ($(config),1) -LATENCY_CONFIG_OBJS=Latency_Scheduler_Runtime.o -UTILIZATION_CONFIG_OBJS=Latency_UTILIZATION_Runtime.o -endif # config - -ifeq ($(probe),1) - CCFLAGS += -DACE_ENABLE_TIMEPROBES -endif # probe - -Latency: $(addprefix $(VDIR),$(LATENCY_OBJS) $(LATENCY_CONFIG_OBJS)) - $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) - -Utilization: $(addprefix $(VDIR),$(UTILIZATION_OBJS) $(UTILIZATION_CONFIG_OBJS)) - $(LINK.cc) $(LDFLAGS) -o $@ $^ $(VLDLIBS) - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/Latency.o .shobj/Latency.: Latency.cpp \ - $(ACE_ROOT)/ace/Get_Opt.h \ - $(ACE_ROOT)/ace/ACE.h \ - $(ACE_ROOT)/ace/OS.h \ - $(ACE_ROOT)/ace/config.h \ - $(ACE_ROOT)/ace/streams.h \ - $(ACE_ROOT)/ace/OS.i \ - $(ACE_ROOT)/ace/Trace.h \ - $(ACE_ROOT)/ace/Log_Msg.h \ - $(ACE_ROOT)/ace/Log_Record.h \ - $(ACE_ROOT)/ace/Log_Priority.h \ - $(ACE_ROOT)/ace/Log_Record.i \ - $(ACE_ROOT)/ace/Version.h \ - $(ACE_ROOT)/ace/ACE.i \ - $(ACE_ROOT)/ace/Get_Opt.i \ - $(ACE_ROOT)/ace/Sched_Params.h \ - $(ACE_ROOT)/ace/Sched_Params.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.h \ - $(TAO_ROOT)/tao/corba.h \ - $(ACE_ROOT)/ace/SOCK_Stream.h \ - $(ACE_ROOT)/ace/SOCK_IO.h \ - $(ACE_ROOT)/ace/SOCK.h \ - $(ACE_ROOT)/ace/Addr.h \ - $(ACE_ROOT)/ace/Addr.i \ - $(ACE_ROOT)/ace/IPC_SAP.h \ - $(ACE_ROOT)/ace/IPC_SAP.i \ - $(ACE_ROOT)/ace/SOCK.i \ - $(ACE_ROOT)/ace/SOCK_IO.i \ - $(ACE_ROOT)/ace/INET_Addr.h \ - $(ACE_ROOT)/ace/INET_Addr.i \ - $(ACE_ROOT)/ace/SOCK_Stream.i \ - $(ACE_ROOT)/ace/Synch_T.h \ - $(ACE_ROOT)/ace/Event_Handler.h \ - $(ACE_ROOT)/ace/Event_Handler.i \ - $(ACE_ROOT)/ace/Synch.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.h \ - $(ACE_ROOT)/ace/SV_Semaphore_Simple.i \ - $(ACE_ROOT)/ace/SV_Semaphore_Complex.i \ - $(ACE_ROOT)/ace/Synch.i \ - $(ACE_ROOT)/ace/Synch_T.i \ - $(ACE_ROOT)/ace/Thread.h \ - $(ACE_ROOT)/ace/Thread.i \ - $(ACE_ROOT)/ace/Atomic_Op.i \ - $(ACE_ROOT)/ace/Hash_Map_Manager.h \ - $(ACE_ROOT)/ace/SString.h \ - $(ACE_ROOT)/ace/SString.i \ - $(ACE_ROOT)/ace/SOCK_Acceptor.h \ - $(ACE_ROOT)/ace/Time_Value.h \ - $(ACE_ROOT)/ace/SOCK_Acceptor.i \ - $(ACE_ROOT)/ace/SOCK_Connector.h \ - $(ACE_ROOT)/ace/SOCK_Connector.i \ - $(ACE_ROOT)/ace/Strategies.h \ - $(ACE_ROOT)/ace/Strategies_T.h \ - $(ACE_ROOT)/ace/Service_Config.h \ - $(ACE_ROOT)/ace/Service_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.h \ - $(ACE_ROOT)/ace/Shared_Object.i \ - $(ACE_ROOT)/ace/Service_Object.i \ - $(ACE_ROOT)/ace/Signal.h \ - $(ACE_ROOT)/ace/Containers.h \ - $(ACE_ROOT)/ace/Containers.i \ - $(ACE_ROOT)/ace/Signal.i \ - $(ACE_ROOT)/ace/Object_Manager.h \ - $(ACE_ROOT)/ace/Object_Manager.i \ - $(ACE_ROOT)/ace/Managed_Object.h \ - $(ACE_ROOT)/ace/Managed_Object.i \ - $(ACE_ROOT)/ace/Service_Config.i \ - $(ACE_ROOT)/ace/Reactor.h \ - $(ACE_ROOT)/ace/Handle_Set.h \ - $(ACE_ROOT)/ace/Handle_Set.i \ - $(ACE_ROOT)/ace/Timer_Queue.h \ - $(ACE_ROOT)/ace/Timer_Queue_T.h \ - $(ACE_ROOT)/ace/Free_List.h \ - $(ACE_ROOT)/ace/Free_List.i \ - $(ACE_ROOT)/ace/Timer_Queue_T.i \ - $(ACE_ROOT)/ace/Reactor.i \ - $(ACE_ROOT)/ace/Reactor_Impl.h \ - $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \ - $(ACE_ROOT)/ace/Synch_Options.h \ - $(ACE_ROOT)/ace/Connector.h \ - $(ACE_ROOT)/ace/Map_Manager.h \ - $(ACE_ROOT)/ace/Map_Manager.i \ - $(ACE_ROOT)/ace/Svc_Handler.h \ - $(ACE_ROOT)/ace/Task.h \ - $(ACE_ROOT)/ace/Thread_Manager.h \ - $(ACE_ROOT)/ace/Thread_Manager.i \ - $(ACE_ROOT)/ace/Task.i \ - $(ACE_ROOT)/ace/Task_T.h \ - $(ACE_ROOT)/ace/Message_Queue.h \ - $(ACE_ROOT)/ace/Message_Block.h \ - $(ACE_ROOT)/ace/Malloc.h \ - $(ACE_ROOT)/ace/Malloc.i \ - $(ACE_ROOT)/ace/Malloc_T.h \ - $(ACE_ROOT)/ace/Malloc_T.i \ - $(ACE_ROOT)/ace/Memory_Pool.h \ - $(ACE_ROOT)/ace/Mem_Map.h \ - $(ACE_ROOT)/ace/Mem_Map.i \ - $(ACE_ROOT)/ace/Memory_Pool.i \ - $(ACE_ROOT)/ace/Message_Block.i \ - $(ACE_ROOT)/ace/IO_Cntl_Msg.h \ - $(ACE_ROOT)/ace/Message_Queue.i \ - $(ACE_ROOT)/ace/Task_T.i \ - $(ACE_ROOT)/ace/Dynamic.h \ - $(ACE_ROOT)/ace/Dynamic.i \ - $(ACE_ROOT)/ace/Singleton.h \ - $(ACE_ROOT)/ace/Singleton.i \ - $(ACE_ROOT)/ace/Svc_Handler.i \ - $(ACE_ROOT)/ace/Connector.i \ - $(ACE_ROOT)/ace/Acceptor.h \ - $(ACE_ROOT)/ace/Acceptor.i \ - $(TAO_ROOT)/tao/orbconf.h \ - $(TAO_ROOT)/tao/orb.h \ - $(TAO_ROOT)/tao/corbacom.h \ - $(TAO_ROOT)/tao/object.h \ - $(TAO_ROOT)/tao/align.h \ - $(TAO_ROOT)/tao/sequence.h \ - $(TAO_ROOT)/tao/varout.h \ - $(TAO_ROOT)/tao/any.h \ - $(TAO_ROOT)/tao/poa.h \ - $(TAO_ROOT)/tao/tao_internals.h \ - $(TAO_ROOT)/tao/params.h \ - $(TAO_ROOT)/tao/client_factory.h \ - $(TAO_ROOT)/tao/server_factory.h \ - $(TAO_ROOT)/tao/default_client.h \ - $(TAO_ROOT)/tao/default_server.h \ - $(TAO_ROOT)/tao/except.h \ - $(TAO_ROOT)/tao/orbobj.h \ - $(TAO_ROOT)/tao/nvlist.h \ - $(TAO_ROOT)/tao/principa.h \ - $(TAO_ROOT)/tao/request.h \ - $(TAO_ROOT)/tao/svrrqst.h \ - $(TAO_ROOT)/tao/typecode.h \ - $(TAO_ROOT)/tao/marshal.h \ - $(TAO_ROOT)/tao/cdr.h \ - $(TAO_ROOT)/tao/stub.h \ - $(TAO_ROOT)/tao/connect.h \ - $(TAO_ROOT)/tao/orb_core.h \ - $(TAO_ROOT)/tao/objtable.h \ - $(TAO_ROOT)/tao/optable.h \ - $(TAO_ROOT)/tao/debug.h \ - $(TAO_ROOT)/tao/managed_types.h \ - $(TAO_ROOT)/tao/iiopobj.h \ - $(TAO_ROOT)/tao/iioporb.h \ - $(TAO_ROOT)/tao/giop.h \ - $(TAO_ROOT)/tao/orb_core.i \ - $(ACE_ROOT)/ace/Dynamic_Service.h \ - $(TAO_ROOT)/tao/corbacom.i \ - $(TAO_ROOT)/tao/sequence.i \ - $(TAO_ROOT)/tao/typecode.i \ - $(TAO_ROOT)/tao/any.i \ - $(TAO_ROOT)/tao/cdr.i \ - $(TAO_ROOT)/tao/stub.i \ - $(TAO_ROOT)/tao/object.i \ - $(TAO_ROOT)/tao/orbobj.i \ - $(TAO_ROOT)/tao/marshal.i \ - $(TAO_ROOT)/tao/poa.i \ - $(TAO_ROOT)/tao/giop.i \ - $(TAO_ROOT)/tao/iioporb.i \ - $(TAO_ROOT)/tao/iiopobj.i \ - $(TAO_ROOT)/tao/managed_types.i \ - $(TAO_ROOT)/tao/params.i \ - $(TAO_ROOT)/tao/server_factory.i \ - $(TAO_ROOT)/tao/default_client.i \ - $(TAO_ROOT)/tao/default_server.i \ - $(TAO_ROOT)/tao/connect.i \ - $(TAO_ROOT)/tao/singletons.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecSchedulerC.i \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventChannelAdminC.i \ - $(TAO_ROOT)/orbsvcs/lib/Event_Service_Constants.h \ - $(TAO_ROOT)/orbsvcs/lib/Event_Utilities.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.h \ - $(TAO_ROOT)/orbsvcs/lib/CosNamingC.i \ - $(TAO_ROOT)/orbsvcs/lib/Scheduler_Factory.i \ - Latency.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.h \ - $(TAO_ROOT)/orbsvcs/lib/RtecEventCommS.i - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/local/tests/Utilization.cpp b/TAO/local/tests/Utilization.cpp deleted file mode 100644 index 0b99257d5b4..00000000000 --- a/TAO/local/tests/Utilization.cpp +++ /dev/null @@ -1,871 +0,0 @@ -// $Id$ - -#if defined (quantify) - #include <quantify.h> -#endif /* quantify */ -#include <limits.h> - -#include "ace/Get_Opt.h" -#include "ace/Sched_Params.h" - -#include "Event_Service_Constants.h" -#include "Event_Utilities.h" -#include "Utilization.h" - -static const char usage [] = "[-? |\n" - " [-c <consumers> [1]]\n" - " [-d directly connect all consumers/suppliers\n" - " [-j to collect jitter statistics]\n" - " [-m <count> of messages to send [10]]\n" - " [-s <suppliers>, [1]]\n" - " [-t <timeout interval>, msec [100]]]"; - -// Configuration parameters. -static u_int consumers = 1; -static u_int suppliers = 1; -static u_int total_messages = 10; -static int measure_jitter = 0; -static u_int timeout_interval = 100; // msec - -static int short_circuit_EC = 0; -static int shutting_down = 0; - -// This is global to allow the Supplier to short ciruit the EC -// and talk directly to consumers. For testing only :-) -static Utilization_Consumer **consumer; - -// Hold the Scavenger up until we're ready to run . . . -ACE_Barrier start_scavenger (2); -u_int started_scavenger = 0; - -// ************************************************************ - -Utilization_Consumer::Utilization_Consumer (const int measure_jitter) - : measure_jitter_ (measure_jitter), - iterations_ (0), - min_utilization_ (INT_MAX), - max_utilization_ (INT_MIN), - total_utilization_ (0), - total_pushes_ (0) -{ -} - -int -Utilization_Consumer::open_consumer (const char *my_name, const char *) -{ - // We look up name for our qos requirements. - ACE_Scheduler::status_t result = - ACE_Scheduler::instance ().get_rt_info (my_name, rt_info_); - - switch (result) - { - case ACE_Scheduler::SUCCEEDED : - // Found. - break; - - case ACE_Scheduler::UNKNOWN_TASK : - rt_info_->set ((timeout_interval - 1) * 10000 /* 100 ns/msec */, - (timeout_interval - 1) * 10000 /* 100 ns/msec */, - (timeout_interval - 1) * 10000 /* 100 ns/msec */, - 0); - - // Not found, but created. We'll leave it blank for now. - break; - - case ACE_Scheduler::FAILED : - default : - // Error. - ACE_ERROR_RETURN ((LM_ERROR, "Utilization_Consumer: get_rt_info failed.\n"), -1); - } - - ACE_TRY - { - // Look up the event service in the name server. - channel_admin_ = EVENT_CHANNEL_NS::BindService ("Event Service"); - if (channel_admin_ == 0) - { - ACE_ERROR ((LM_ERROR, "%p bind failed.\n", "Utilization_Consumer::open")); - return -1; - } - - // Create the event that we're registering for. - ACE_ConsumerQOS_Factory dependencies; - dependencies.start_disjunction_group (); - dependencies.insert (ACE_ES_EVENT_NOTIFICATION, rt_info_); - dependencies.insert (ACE_ES_EVENT_SHUTDOWN, rt_info_); - - // = Connect as a consumer. - consumer_admin_ = channel_admin_->for_consumers (ACE_TRY_ENV); - ACE_CHECK_ENV; - suppliers_ = consumer_admin_->obtain_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - suppliers_->connect_push_consumer (this, - dependencies.get_ConsumerQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCH (const ACE_EventChannel::SUBSCRIPTION_ERROR, se) - { - ACE_ERROR_RETURN ((LM_ERROR, - "Utilization_Consumer::open: subscribe failed.\n"), -1); - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "Utilization_Consumer::open: unexpected exception.\n"), -1); - } - ACE_ENDTRY; - - return 0; -} - -void -Utilization_Consumer::disconnect_push_consumer (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Consumer received disconnect from channel.\n")); -} - -void -Utilization_Consumer::push (const CosEventComm::EventSet &events, - CORBA::Environment &) -{ - ACE_TIMEPROBE ("push event to consumer"); - - #if defined (quantify) - // If measuring jitter, just Quantify the supplier-consumer path. - if (measure_jitter) - { - quantify_stop_recording_data (); - } - #endif /* quantify */ - - if (events[0].type_ == ACE_ES_EVENT_SHUTDOWN) - this->shutdown (); - else - { - if (measure_jitter_) - { - const ACE_hrtime_t now = ACE_OS::gethrtime (); - // Note: the division by 1 provides transparent support of - // ACE_U_LongLong. - ACE_Time_Value utilization (now / 1000000000, - (now / 1 % 1000000000) / 1000); - utilization -= ACE_Time_Value (events[0].time_ / 1000000000, - (events[0].time_ / 1 % 1000000000) / 1000); - - if (! shutting_down) - { - if (min_utilization_ > utilization) min_utilization_ = utilization; - if (max_utilization_ < utilization) max_utilization_ = utilization; - total_utilization_ += utilization; - ++total_pushes_; - } - } - - ACE_TIMEPROBE_PRINT; - - // Chew up almost the entire timeout interval on the CPU. - u_long n = 1279ul; /* takes about 40.2 usecs on a 167 MHz Ultra2 */ - - for (u_int i = 0; i < (timeout_interval * 1000 / 40.2); ++i) - { - ACE::is_prime (n, - 2ul /* min_factor */, - n/2 /* max_factor */); - iterations_ += 1; // ACE_U_LongLong doesn't have ++ - } - } -} - -void -Utilization_Consumer::shutdown (void) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) %s shutting down.\n", entry_point ())); - - ACE_TRY - { - // Disconnect from the push supplier. - suppliers_->disconnect_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, - "(%t) %s Utilization_Consumer::shutdown: unexpected exception.\n", - entry_point ())); - } - ACE_ENDTRY; -} - - -void -Utilization_Consumer::print_stats () /* const */ -{ - if (measure_jitter_) - { - ACE_DEBUG ((LM_TRACE, - "%s: minimum, maximum, average event utilization (msec): " - "%5.3f, %5.3f, %5.3f\n", - entry_point (), - (min_utilization_.sec () * 1000000.0 + min_utilization_.usec ()) / - 1000.0, - (max_utilization_.sec () * 1000000.0 + max_utilization_.usec ()) / - 1000.0, - (total_utilization_.sec () * 1000000.0 + - total_utilization_.usec ()) / total_pushes_ / 1000.0)); - } - ACE_OS::fprintf (stderr, "Consumer processed %llu iterations\n", - iterations_ / 1ul); -} - - -// ************************************************************ - -Utilization_Supplier::Utilization_Supplier (const u_int total_messages, - const int timestamp) - : total_messages_ (total_messages), - timestamp_ (timestamp), - total_sent_ (0), - master_ (0) -{ -} - -int -Utilization_Supplier::open_supplier (const char *name, int master) -{ - master_ = master; - - // We look up name for our qos requirements. - ACE_Scheduler::status_t result = - ACE_Scheduler::instance ().get_rt_info (name, rt_info_); - - switch (result) - { - case ACE_Scheduler::SUCCEEDED : - // Found. - break; - - case ACE_Scheduler::UNKNOWN_TASK : - // Not found, but created. We want to be notified 4 times a second. - rt_info_->set (1,1,1, timeout_interval * 10000 /* 100 ns/msec */, - ACE_Scheduler::RT_Info::VERY_LOW, - ACE_Scheduler::RT_Info::NO_QUANTUM); - break; - - case ACE_Scheduler::FAILED : - default : - // Error. - ACE_ERROR_RETURN ((LM_ERROR, "Utilization_Supplier: get_rt_info failed.\n"), -1); - } - - ACE_TRY - { - SUPPLIER_NS::RegisterService - (entry_point (), - // ACE_Naming::NOBJECT, - NOBJECT, this); - - // Look up the event service in the name server. - channel_admin_ = EVENT_CHANNEL_NS::BindService ("Event Service"); - if (channel_admin_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "%p bind failed.\n", - "Utilization_Supplier::open"), -1); - - ACE_SupplierQOS_Factory publications; - publications.insert (ACE_ES_EVENT_NOTIFICATION, rt_info_, 1); - publications.insert (ACE_ES_EVENT_SHUTDOWN, rt_info_, 1); - - // = Connect as a supplier. - supplier_admin_ = channel_admin_->for_suppliers (ACE_TRY_ENV); - ACE_CHECK_ENV; - consumers_ = supplier_admin_->obtain_push_consumer (ACE_TRY_ENV); - ACE_CHECK_ENV; - consumers_->connect_push_supplier (this, - publications.get_SupplierQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCH (const ACE_EventChannel::SUBSCRIPTION_ERROR, se) - { - ACE_ERROR_RETURN ((LM_ERROR, - "Utilization_Supplier::open: subscribe failed.\n"), -1); - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "Utilization_Supplier::open: unexpected exception.\n"), -1); - } - ACE_ENDTRY; - - return 0; -} - -void -Utilization_Supplier::disconnect_push_consumer (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Supplier-consumer received disconnect from channel.\n")); -} - -void -Utilization_Supplier::disconnect_push_supplier (CORBA::Environment &) -{ - ACE_DEBUG ((LM_DEBUG, "Supplier received disconnect from channel.\n")); -} - -int -Utilization_Supplier::start_generating_events (void) -{ - const ACE_hrtime_t now = ACE_OS::gethrtime (); - test_start_time_.set (now / 1000000000, (now / 1 % 1000000000) / 1000); - - ACE_TRY - { - ACE_ConsumerQOS_Factory dependencies; - dependencies.start_disjunction_group (); - dependencies.insert (ACE_ES_EVENT_INTERVAL_TIMEOUT, - timeout_interval * 10000 /* 100 ns/msec */, - rt_info_); - if (!master_) - dependencies.insert (ACE_ES_EVENT_SHUTDOWN, rt_info_); - - // = Connect as a consumer. - consumer_admin_ = channel_admin_->for_consumers (ACE_TRY_ENV); - ACE_CHECK_ENV; - suppliers_ = consumer_admin_->obtain_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - suppliers_->connect_push_consumer (this, - dependencies.get_ConsumerQOS (), - ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, - "Utilization_Supplier::generate_events:" - " unexpected exception.\n"), -1); - } - ACE_ENDTRY; - - return 0; -} - -void -Utilization_Supplier::push (const CosEventComm::EventSet &events, - CORBA::Environment &) -{ - if (!master_ && events[0].type_ == ACE_ES_EVENT_SHUTDOWN) - this->shutdown (); - else if (events[0].type_ == ACE_ES_EVENT_INTERVAL_TIMEOUT) - { - // Create the event to send. - CosEventComm::Event event; - event.source_ = this; - event.type_ = ACE_ES_EVENT_NOTIFICATION; - ++total_sent_; - - if ( ! started_scavenger ) - { - started_scavenger = 1; - - // Start the Scavenger. - start_scavenger.wait (); - } - - if (timestamp_) - { - const ACE_hrtime_t now = ACE_OS::gethrtime (); - // David, time_ is now a long. I'm not sure if this calculation correct now. - //event.time_.set (now / 1000000000, (now % 1000000000) / 1000); - event.time_ = now; - } - - ACE_TIMEPROBE_RESET; - ACE_TIMEPROBE ("start with new event in Supplier"); - - ACE_TRY - { - if (short_circuit_EC) - { - for (u_int cons = 0; cons < consumers; ++cons) - { - // This constructor is fast. - const CosEventComm::EventSet es (1, 1, &event); - consumer [cons]->push (es, ACE_TRY_ENV); - } - } - else - { -#if defined (quantify) - // If measuring jitter, just Quantify the supplier-consumer path. - if (measure_jitter) - { - quantify_start_recording_data (); - } -#endif /* quantify */ - - ACE_TIMEPROBE ("time to read high-res clock and " - "compare an int with 0"); - consumers_->push (event, ACE_TRY_ENV); - } - ACE_CHECK_ENV; - } - ACE_CATCH (CosEventComm::Disconnected, d) - { - ACE_ERROR ((LM_ERROR, "(%t) Utilization_Supplier::push: disconnected.\n")); - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "(%t) %s Utilization_Supplier::push:" - " unexpected exception.\n", - entry_point ())); - } - ACE_ENDTRY; - - // Check if we're done. - if (master_ && (total_sent_ >= total_messages_)) - this->shutdown (); - } - else - { - ACE_ERROR ((LM_ERROR, "(%t) %s received unexpected events: ", - entry_point ())); - ::dump_sequence (events); - return; - } -} - -void -Utilization_Supplier::shutdown (void) -{ - shutting_down = 1; - - #if defined (quantify) - // Need to stop recording here even if testing for jitter, because - // recording is still probably enabled. - quantify_stop_recording_data (); - if (! measure_jitter) - { - ACE_DEBUG ((LM_DEBUG, "(%t) stopped Quantify recording\n")); - } - #endif /* quantify */ - - const ACE_hrtime_t now = ACE_OS::gethrtime (); - test_stop_time_.set (now / 1000000000, (now / 1 % 1000000000) / 1000); - - static int total_iterations = 1; - if (--total_iterations > 0) - { - total_sent_ = 0; - return; - } - - ACE_TRY - { - if (master_) - { - // Create the shutdown message. - CosEventComm::Event event; - event.source_ = this; - event.type_ = ACE_ES_EVENT_SHUTDOWN; - - // Push the shutdown event. - consumers_->push (event, ACE_TRY_ENV); - ACE_CHECK_ENV; - } - - // Disconnect from the channel. - consumers_->disconnect_push_consumer (ACE_TRY_ENV); - ACE_CHECK_ENV; - - // Disconnect from the push supplier. - suppliers_->disconnect_push_supplier (ACE_TRY_ENV); - ACE_CHECK_ENV; - - if (master_) - channel_admin_->destroy (ACE_TRY_ENV); - ACE_CHECK_ENV; - } - ACE_CATCHANY - { - ACE_ERROR ((LM_ERROR, "(%t) %s Utilization_Supplier::shutdown:" - " unexpected exception.\n", - entry_point ())); - } - ACE_ENDTRY; -} - - -void -Utilization_Supplier::print_stats () /* const */ -{ - ACE_Time_Value test_elapsed_time (test_stop_time_ - test_start_time_); - const u_int elapsed = test_elapsed_time.sec () * 1000000 + - test_elapsed_time.usec (); // usec - - ACE_DEBUG ((LM_TRACE, - "%s: delivered %u events to %u consumer(s) in %u msec;\n" - " per-event average was %8.3f msec.\n", - entry_point (), - total_sent_, - consumers / suppliers + consumers % suppliers, - elapsed / 1000, - (double) elapsed / total_sent_ / 1000.0)); -} - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// class Scavenger -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -Scavenger::Scavenger (const int priority) - : ACE_Task<ACE_NULL_SYNCH> (ACE_Thread_Manager::instance ()), - priority_ (priority), - iterations_ (0) -{ -} - -Scavenger::~Scavenger () -{ -} - -int -Scavenger::open (void *arg) -{ - ACE_UNUSED_ARG (arg); - - long flags = THR_BOUND | THR_SCHED_FIFO; - - // Become an active object. - if (this->activate (flags, 1, 0, this->priority_) == -1) - { - ACE_DEBUG ((LM_ERROR, - "(%t) task activation at priority %d failed, exiting\n%a", - priority_, -1)); - } - - return 0; -} - -int -Scavenger::svc (void) -{ - // Make sure that its thread has the proper priority. - ACE_hthread_t thr_handle; - ACE_Thread::self (thr_handle); - int prio; - - if (ACE_Thread::getprio (thr_handle, prio) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "getprio failed"), -1); - } - - ACE_DEBUG ((LM_DEBUG, "(%t) SCAVENGER prio = %d, priority_ = %d\n", - prio, this->priority_)); - - if (this->priority_ != prio) - { - ACE_ERROR_RETURN ((LM_ERROR, "improper priority: %d\n", prio), -1); - } - - // Wait here until the Consumer is running. - start_scavenger.wait (); - - for (u_long i = 0; - ! shutting_down && - i < timeout_interval * 1000 / 40.2 * total_messages * 3; - ++i) - { - u_long n = 1279ul; /* takes about 40.2 usecs */ - ACE::is_prime (n, - 2ul /* min_factor */, - n/2 /* max_factor */); - - iterations_ += 1; // ACE_U_LongLong doesn't have ++ - } - - if (! shutting_down) - { - ACE_OS::fprintf (stderr, "Scavenger timed out!!!!\n"); - } - - return 0; -} - -void -Scavenger::print_status () -{ - ACE_OS::fprintf (stderr, "Scavenger processed %llu iterations\n", - iterations_ / 1ul); -} - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// function get_options -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -static -unsigned int -get_options (int argc, char *argv []) -{ - ACE_Get_Opt get_opt (argc, argv, "c:djm:s:t:?"); - int opt; - int temp; - - while ((opt = get_opt ()) != EOF) - { - switch (opt) { - case 'c': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - consumers = (u_int) temp; - } - else - { - cerr << argv [0] << ": number of consumers must be > 0" << endl; - return 1; - } - break; - case 'd': - short_circuit_EC = 1; - break; - case 'j': - measure_jitter = 1; - break; - case 'm': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - total_messages = (u_int) temp; - } - else - { - cerr << argv [0] << ": count must be > 0" << endl; - return 1; - } - break; - case 's': - if ((temp = ACE_OS::atoi (get_opt.optarg)) > 0) - { - suppliers = (u_int) temp; - } - else - { - cerr << argv [0] << ": number of suppliers must be > 0" << endl; - return 1; - } - break; - case 't': - if (ACE_OS::atoi (get_opt.optarg) >= 0) - { - timeout_interval = ACE_OS::atoi (get_opt.optarg); - } - else - { - cerr << argv [0] << ": count must be >= 0" << endl; - return 1; - } - break; - case '?': - cout << "usage: " << argv [0] << " " << usage << endl; - ACE_OS::exit (0); - break; - default: - cerr << argv [0] << ": unknown arg, " << (char) opt << endl; - cerr << "usage: " << argv [0] << " " << usage << endl; - return 1; - } - } - - switch (argc - get_opt.optind) { - case 0: - // OK - break; - default: - cerr << argv [0] << ": too many arguments" << endl; - cerr << "usage: " << argv [0] << " " << usage << endl; - return 1; - } - - return 0; -} - -// ************************************************************ -// This function tells the scheduler to generate a schedule. It will -// only call it once, so this function can be called multiple times. -static void -Generate_Schedule (void) -{ - static int once = 0; - static ACE_Thread_Mutex m; - - if (once == 0) - { - ACE_Guard<ACE_Thread_Mutex> ace_mon (m); - - // Double-check. - if (once == 0) - { - once = 1; - ACE_Scheduler::status_t result = ACE_Scheduler::instance ().schedule (); - - if (result != ACE_Scheduler::SUCCEEDED) - ACE_ERROR ((LM_ERROR, "ACE_Scheduler::schedule failed.\n")); - else - { - if (Scheduler_Runtime::config ()) - { - ACE_DEBUG ((LM_ERROR, "ACE_Scheduler::schedule succeeded.\n")); - } - } - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// function main -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -int -main (int argc, char *argv []) -{ - int min_priority = ACE_Sched_Params::priority_min (ACE_SCHED_FIFO, - ACE_SCOPE_THREAD); - - Scavenger scavenger (min_priority); - - if (ACE_OS::sched_params ( - ACE_Sched_Params ( - ACE_SCHED_FIFO, - ACE_Sched_Params::next_priority (ACE_SCHED_FIFO, - min_priority, - ACE_SCOPE_PROCESS), - ACE_SCOPE_PROCESS)) != 0) - { - if (ACE_OS::last_error () == EPERM) - { - ACE_DEBUG ((LM_MAX, "Utilization: user is not superuser, " - "so remain in time-sharing class\n")); - } - else - { - ACE_DEBUG ((LM_ERROR, "%p\n", "Utilization")); - ACE_OS::exit (-1); - } - } - - u_int i; - - if (get_options (argc, argv)) ACE_OS::exit (-1); - - ACE_Scheduler::instance ().output_level (1); - - // Allocate the timeprobe instance now, so we don't measure - // the cost of doing it later. - ACE_TIMEPROBE_RESET; - - // Set the scheduler output name. - char *orb_argv[3] = { "main", "Scheduler_Utilization_Runtime.cpp", 0 }; - int orb_argc = 3; - - // Initialize ORB. - UPSingleProcessorOrb::ORB_init (orb_argc, orb_argv, "the_ORB"); - - // Register Event Service with Naming Service. - CosEventChannelAdmin::EventChannel_ptr ec; - ACE_NEW_RETURN (ec, ACE_EventChannel, -1); - - EVENT_CHANNEL_NS::RegisterService ("Event Service", NOBJECT, ec); - - // Create supplier(s). - Utilization_Supplier **supplier; - ACE_NEW_RETURN (supplier, Utilization_Supplier *[suppliers], -1); - for (i = 0; i < suppliers; ++i) - { - ACE_NEW_RETURN (supplier [i], - Utilization_Supplier (total_messages, measure_jitter), - -1); - char supplier_name [BUFSIZ]; - sprintf (supplier_name, "supplier-%d", i+1); - if (supplier [i]->open_supplier (supplier_name, int (i == 0)) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "Supplier open failed.\n"), -1); - } - - // Create consumers. - ACE_NEW_RETURN (consumer, Utilization_Consumer *[consumers], -1); - for (i = 0; i < consumers; ++i) - { - ACE_NEW_RETURN (consumer [i], Utilization_Consumer (measure_jitter), -1); - char buf [BUFSIZ]; - sprintf (buf, "consumer-%d", i+1); - - if ((consumer [i]->open_consumer (buf, - supplier [i % suppliers]->entry_point ()) == - -1)) - ACE_ERROR_RETURN ((LM_ERROR, "Someone was feeling introverted.\n"), - -1); - } - - #if defined (quantify) - if (! measure_jitter) - { - ACE_DEBUG ((LM_DEBUG, "(%t) start Quantify recording\n")); - quantify_start_recording_data (); - } - #endif /* quantify */ - - // Tell supplier(s) to generate events. - for (i = 0; i < suppliers; ++i) - { - if (supplier [i]->start_generating_events () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "generate_events failed.\n"), -1); - } - - - scavenger.open (); - - ACE_OS::sleep (1); - - // Enter the main event loop. - UPSingleProcessorOrb::Instance ()->impl_is_ready (); - - scavenger.print_status (); - - // Graceful ORB shutdown. - UPSingleProcessorOrb::Instance ()->Close (); - - ::Generate_Schedule (); - - for (i = 0; i < suppliers; ++i) - { - supplier [i]->print_stats (); - delete supplier [i]; - } - delete [] supplier; - - for (i = 0; i < consumers; ++i) - { - consumer [i]->print_stats (); - delete consumer [i]; - } - delete [] consumer; - - delete ec; - - ACE_TIMEPROBE_FINI; - - return 0; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -# if ! defined (__ACE_INLINE__) - template class UUORB_UtilitiesT<ACE_AbstractEventChannel>; - template class UUORB_UtilitiesT<ACE_AbstractPushSupplier>; -# endif /* ! __ACE_INLINE_ */ -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -# if ! defined (__ACE_INLINE__) -# pragma instantiate UUORB_UtilitiesT<ACE_AbstractEventChannel> -# pragma instantiate UUORB_UtilitiesT<ACE_AbstractPushSupplier> -# endif /* ! __ACE_INLINE_ */ -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/local/tests/Utilization.h b/TAO/local/tests/Utilization.h deleted file mode 100644 index b1394a1c975..00000000000 --- a/TAO/local/tests/Utilization.h +++ /dev/null @@ -1,182 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// ACE Event Service Benchmarks -// -// = FILENAME -// Utilization.h -// -// = AUTHOR -// David Levine (levine@cs.wustl.edu) and -// Tim Harrison (harrison@cs.wustl.edu) -// -// = DESCRIPTION -// -// ============================================================================ - -#if !defined (UTILIZATION_H) -#define UTILIZATION_H - -#include "RtecEvenCommS.h" - -class Utilization_Consumer : public POA_RtecEventComm::PushConsumer -// = TITLE -// Utilization Consumer -// -// = DESCRIPTION -// Simple example of a consumer that registers for supplier -// notifications. -{ -public: - Utilization_Consumer (const int measure_jitter = 0); - // Construction. The default of not measuring jitter provides - // a "null" push routine, for measuring aggregate timing. - - int open_consumer (const char *my_name, const char *supplier_name); - // Uses the name server to obtain a reference to the <supplier_name> - // and registers with channel to receive notifications from the - // supplier. Also registers to receive shutdown messages from the - // supplier. Stores <my_name> for printing out messages. Returns 0 - // on success, -1 on failure. - - virtual void disconnect_push_consumer (CORBA::Environment &); - // The channel is disconnecting. - - const char *entry_point () /* const */ { return rt_info_->entry_point (); } - - void print_stats () /* const */; - // Print timing statistics. - -// (not protected to allow short-circuiting) protected: - virtual void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // If the <events>[0] is a notification, prints out the data from - // the supplier. If its a shutdown message, the consumer - // disconnects from the channel. - -protected: - void shutdown (void); - // Disconnect from the Event Service. - - // = Event channel adminstration references. - RtecEventChannelAdmin::EventChannel_ptr channel_admin_; - RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin_; - RtecEventChannelAdmin::ProxyPushSupplier_ptr suppliers_; - -private: - ACE_Scheduler::RT_Info* rt_info_; - - int measure_jitter_; - - ACE_hrtime_t iterations_; - ACE_Time_Value min_utilization_; - ACE_Time_Value max_utilization_; - ACE_Time_Value total_utilization_; - u_long total_pushes_; - // Registers and counters for keeping track of utilization statistics. -}; - -// ************************************************************ - -class Utilization_Supplier : public POA_RtecEventComm::PushSupplier, public POA_RtecEventComm::PushConsumer -// = TITLE -// Utilization Supplier -// -// = DESCRIPTION -// Generates event nofications and a shutdown message. -{ -public: - Utilization_Supplier (const u_int total_messages, - const int timestamp = 0); - // Construction. Requires the total number of messages to be - // sent. If the timestamp flag is enabled, then events are - // timestamped, e.g., for use in measuring jitter. - - int open_supplier (const char *name, int master); - // Registers with the name server under the given <name>. Also - // connects to the Event Channel as a supplier of notifications and - // shutdown messages. If <master> != 0, then the supplier will - // destroy the channel upon shutting down. Returns 0 on success, -1 - // on failure. - - virtual void disconnect_push_supplier (CORBA::Environment &); - // The channel is disconnecting. - - virtual void disconnect_push_consumer (CORBA::Environment &); - // The channel is disconnecting. - - int start_generating_events (void); - // Called when the supplier should start generating events. - // Registers with the Event Channel to receive timeouts every .25 - // seconds. Will generate some number of events and then send a - // shutdown message. Returns 0 on success, -1 on failure. - - const char *entry_point () /* const */ { return rt_info_->entry_point (); } - - void print_stats () /* const */; - // Print timing statistics. - -protected: - void push (const RtecEventComm::EventSet &events, - CORBA::Environment &); - // Takes a timestamp and then pushes event_ to all consumers, either - // directly, or via a channel. - - void shutdown (void); - // Disconnect from the Event Service. - - // = Event Channel adminstration references. - RtecEventChannelAdmin::EventChannel_ptr channel_admin_; - RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin_; - RtecEventChannelAdmin::ProxyPushConsumer_ptr consumers_; - RtecEventChannelAdmin::SupplierAdmin_ptr supplier_admin_; - RtecEventChannelAdmin::ProxyPushSupplier_ptr suppliers_; - -private: - ACE_Scheduler::RT_Info_ptr rt_info_; - - u_int total_messages_; - // How many events to push before ending the test. - - int timestamp_; - // Flag indicating whether or not to timestamp outgoing events. - - u_int total_sent_; - // How many events we've pushed. - - ACE_Time_Value test_start_time_; - ACE_Time_Value test_stop_time_; - // Start/stop times, marking the time period when events are - // sent to consumers. - - int master_; -}; - - -class Scavenger : public ACE_Task<ACE_NULL_SYNCH> -// = TITLE -// Scavenger -// -// = DESCRIPTION -// Soaks up all unused CPU cycles. -{ -public: - Scavenger (const int priority); - virtual ~Scavenger (); - - int open (void *); - int svc (void); - void print_status (); - -private: - int priority_; - ACE_hrtime_t iterations_; - - // not implemented . . . - Scavenger (); -}; - -#endif /* UTILIZATION_H */ diff --git a/TAO/local/tests/svc.conf b/TAO/local/tests/svc.conf deleted file mode 100644 index 43c6a486c92..00000000000 --- a/TAO/local/tests/svc.conf +++ /dev/null @@ -1,49 +0,0 @@ -# $Id$ -# -# This file contains a sample ACE_Service_Config configuration -# file specifying the strategy factories utilized by an application -# using TAO. There are currently only two possible factories: -# Client_Strategy_Factory and Server_Strategy_Factory. These names -# must be used as the second argument to their corresponding line, -# because that's what the ORB uses to find the desired factory. -# -# Note that there are two unordinary characteristics of the way *this* -# file is set up: -# - both client and server strategies are specified in the same -# file, which would only make sense for co-located clients & servers -# - both of the factories are actually sourced out of libTAO.so -# (TAO.DLL on Win32), and they would normally be in a separate -# dll from the TAO ORB Core. -# -# The options which can be passed to the Resource Factory are: -# -# -ORBresources <which> -# where <which> can be 'global' to specify globally-held resources, -# or 'tss' to specify thread-specific resources. -# -# The options which can be passed to the Client are: -# <none currently> -# -# The options which can be passed to the Server are: -# -# -ORBconcurrency <which> -# where <which> can be 'thread-per-connection' to specify -# use of the ACE_Threaded_Strategy concurrency strategy, -# or 'reactive' to specify use of the ACE_Reactive_Strategy -# concurrency strategy. -# -# -ORBthreadflags <flags> -# specifies the default thread flags to use, where <flags> is a -# logical OR'ing of the flags THR_DETACHED, THR_BOUND, THR_NEW_LWP, -# THR_SUSPENDED, or THR_DAEMON. Note that not every flag may be valid -# on every platform. -# -# -ORBdemuxstrategy <which> -# where <which> can be one of 'dynamic', 'linear', 'active', or 'user', -# and specifies the type of object lookup strategy used internally. -# -ORBtablesize <unsigned> -# specifies the size of the object table -# -dynamic Resource_Factory Service_Object * TAO:_make_TAO_Resource_Factory() "-ORBresources global" -dynamic Client_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Client_Strategy_Factory() -dynamic Server_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Server_Strategy_Factory() "-ORBconcurrency reactive -ORBdemuxstrategy dynamic -ORBtablesize 128" |