diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-11 02:45:11 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1997-12-11 02:45:11 +0000 |
commit | 3b9469d11341ec4b81a9b8707635b6ed76340877 (patch) | |
tree | 62fdb1a532d98ad8d2da70958983a0ae1ef06ad3 /TAO/orbsvcs/Scheduling_Service | |
parent | cea26aeb6e1bc30c754707f0936d199e08bea071 (diff) | |
download | ATCD-3b9469d11341ec4b81a9b8707635b6ed76340877.tar.gz |
ChangeLogTag:Wed Dec 10 20:13:57 1997 Carlos O'Ryan <coryan@macarena.cs.wustl.edu>
Diffstat (limited to 'TAO/orbsvcs/Scheduling_Service')
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Config_Scheduler.cpp | 261 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Config_Scheduler.h | 94 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Config_Scheduler.i | 5 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Makefile | 746 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler.cpp | 291 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler.h | 278 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler.i | 20 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.cpp | 258 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.h | 129 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.i | 21 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/Scheduling_Service.cpp | 67 | ||||
-rw-r--r-- | TAO/orbsvcs/Scheduling_Service/svc.conf | 49 |
12 files changed, 2219 insertions, 0 deletions
diff --git a/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.cpp b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.cpp new file mode 100644 index 00000000000..3713abfc7d9 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.cpp @@ -0,0 +1,261 @@ +// ============================================================================ +// +// $Id$ +// +// ============================================================================ + +#include "orbsvcs/Scheduler_Factory.h" + +#include "Scheduler_Generic.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_Generic"), + impl(new Scheduler_Generic) +{ + 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[CORBA::ULong(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/orbsvcs/Scheduling_Service/Config_Scheduler.h b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.h new file mode 100644 index 00000000000..6fc922bb1d7 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.h @@ -0,0 +1,94 @@ +// ============================================================================ +// +// $Id$ +// +// ============================================================================ + +#ifndef ACE_CONFIG_SCHEDULER_H +#define ACE_CONFIG_SCHEDULER_H + +#include "ace/OS.h" + +#include "orbsvcs/RtecSchedulerS.h" +#include "orbsvcs/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/orbsvcs/Scheduling_Service/Config_Scheduler.i b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.i new file mode 100644 index 00000000000..a21ea7f9897 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Config_Scheduler.i @@ -0,0 +1,5 @@ +// ============================================================================ +// +// $Id$ +// +// ============================================================================ diff --git a/TAO/orbsvcs/Scheduling_Service/Makefile b/TAO/orbsvcs/Scheduling_Service/Makefile new file mode 100644 index 00000000000..fc9c5d5c380 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Makefile @@ -0,0 +1,746 @@ +# +# $Id$ +# + +BIN = Scheduling_Service +BUILD = $(BIN) + +SCHEDULE_SRCS = \ + Scheduling_Service.cpp \ + Config_Scheduler.cpp \ + Scheduler.cpp \ + Scheduler_Generic.cpp + +LSRC = $(SCHEDULE_SRCS) + +SCHEDULE_OBJS=$(SCHEDULE_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/orbsvcs -L$(TAO_ROOT)/tao +CPPFLAGS += -I$(TAO_ROOT)/orbsvcs -I$(TAO_ROOT) -I$(TAO_ROOT)/tao/compat $(TSS_ORB_FLAG)#-H + +Scheduling_Service: $(addprefix $(VDIR),$(SCHEDULE_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/Scheduling_Service.o .shobj/Scheduling_Service.: Scheduling_Service.cpp \ + $(TAO_ROOT)/tao/corba.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/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/compat/objbase.h \ + $(TAO_ROOT)/tao/compat/initguid.h \ + $(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/orbsvcs/CosNamingC.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/CosNamingC.i \ + Config_Scheduler.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerS.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerC.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerC.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerS.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Event_Service_Constants.h \ + Config_Scheduler.i +.obj/Config_Scheduler.o .shobj/Config_Scheduler.: Config_Scheduler.cpp \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Scheduler_Factory.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)/orbsvcs/orbsvcs/CosNamingC.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/compat/objbase.h \ + $(TAO_ROOT)/tao/compat/initguid.h \ + $(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/orbsvcs/CosNamingC.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerC.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerC.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Scheduler_Factory.i \ + Scheduler_Generic.h Scheduler.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Event_Service_Constants.h \ + Scheduler.i Scheduler_Generic.i Config_Scheduler.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/RtecSchedulerS.h \ + $(TAO_ROOT)/orbsvcs/orbsvcs/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.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/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/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/orbsvcs/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/compat/objbase.h \ + $(TAO_ROOT)/tao/compat/initguid.h \ + $(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/orbsvcs/RtecSchedulerC.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Event_Service_Constants.h \ + Scheduler.i +.obj/Scheduler_Generic.o .shobj/Scheduler_Generic.: Scheduler_Generic.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_Generic.h 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/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/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/orbsvcs/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/compat/objbase.h \ + $(TAO_ROOT)/tao/compat/initguid.h \ + $(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/orbsvcs/RtecSchedulerC.i \ + $(TAO_ROOT)/orbsvcs/orbsvcs/Event_Service_Constants.h \ + Scheduler.i Scheduler_Generic.i + +# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/TAO/orbsvcs/Scheduling_Service/Scheduler.cpp b/TAO/orbsvcs/Scheduling_Service/Scheduler.cpp new file mode 100644 index 00000000000..b71e0679469 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler.cpp @@ -0,0 +1,291 @@ +// $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/orbsvcs/Scheduling_Service/Scheduler.h b/TAO/orbsvcs/Scheduling_Service/Scheduler.h new file mode 100644 index 00000000000..2f128757be6 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler.h @@ -0,0 +1,278 @@ +/* -*- 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 "orbsvcs/RtecSchedulerC.h" +#include "orbsvcs/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/orbsvcs/Scheduling_Service/Scheduler.i b/TAO/orbsvcs/Scheduling_Service/Scheduler.i new file mode 100644 index 00000000000..57875ae26d1 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler.i @@ -0,0 +1,20 @@ +// $Id$ +// +// ============================================================================ +// +// = LIBRARY +// sched +// +// = FILENAME +// Scheduler.i +// +// = CREATION DATE +// 23 January 1997 +// +// = AUTHOR +// David Levine +// +// ============================================================================ + +// EOF + diff --git a/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.cpp b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.cpp new file mode 100644 index 00000000000..8bf453047d4 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.cpp @@ -0,0 +1,258 @@ +// $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 = ACE_Scheduler::SUCCEEDED; + + // store number of tasks, based on registrations + tasks (task_entries_.size ()); + + if (output_level () > 0) + { + print_schedule (); + } + + 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 () +{ +} + +#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/orbsvcs/Scheduling_Service/Scheduler_Generic.h b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.h new file mode 100644 index 00000000000..ab22666a41e --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.h @@ -0,0 +1,129 @@ +/* -*- 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. + + 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/orbsvcs/Scheduling_Service/Scheduler_Generic.i b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.i new file mode 100644 index 00000000000..71e3695dc35 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduler_Generic.i @@ -0,0 +1,21 @@ +// $Id$ +// +// ============================================================================ +// +// = LIBRARY +// sched +// +// = FILENAME +// Scheduler_Generic.i +// +// = CREATION DATE +// 23 January 1997 +// +// = AUTHOR +// David Levine +// +// ============================================================================ + + +// EOF + diff --git a/TAO/orbsvcs/Scheduling_Service/Scheduling_Service.cpp b/TAO/orbsvcs/Scheduling_Service/Scheduling_Service.cpp new file mode 100644 index 00000000000..e76579598b5 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/Scheduling_Service.cpp @@ -0,0 +1,67 @@ +// +// $Id$ +// + +#include "tao/corba.h" + +#include "orbsvcs/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/orbsvcs/Scheduling_Service/svc.conf b/TAO/orbsvcs/Scheduling_Service/svc.conf new file mode 100644 index 00000000000..43c6a486c92 --- /dev/null +++ b/TAO/orbsvcs/Scheduling_Service/svc.conf @@ -0,0 +1,49 @@ +# $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" |