diff options
author | cdgill <cdgill@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-05-11 21:50:32 +0000 |
---|---|---|
committer | cdgill <cdgill@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-05-11 21:50:32 +0000 |
commit | 5e3ae25b95eb763eeb0e7879bfbd154125d2c9dc (patch) | |
tree | e2e031f035f0054fa0bb89d77985a9fa1e81116e /TAO/orbsvcs | |
parent | 5e169237f4eb5a0838306d6feead608cbee31bb7 (diff) | |
download | ATCD-5e3ae25b95eb763eeb0e7879bfbd154125d2c9dc.tar.gz |
dynamic scheduler integration
Diffstat (limited to 'TAO/orbsvcs')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/RtecScheduler.idl | 11 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp | 128 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h | 64 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp | 64 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/DynSched.h | 29 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Scheduler.h | 6 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp | 247 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h | 99 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/orbsvcs.dsp | 62 |
9 files changed, 610 insertions, 100 deletions
diff --git a/TAO/orbsvcs/orbsvcs/RtecScheduler.idl b/TAO/orbsvcs/orbsvcs/RtecScheduler.idl index 11efec1faa0..b2efd5d2d79 100644 --- a/TAO/orbsvcs/orbsvcs/RtecScheduler.idl +++ b/TAO/orbsvcs/orbsvcs/RtecScheduler.idl @@ -118,12 +118,15 @@ module RtecScheduler // The operations we depend upon. Dependency_Set dependencies; - // The OS por processing the events generated - // from this RT_Info. + // The OS thread priority for processing the + // events generated from this RT_Info. OS_Priority priority; - // For ordering RT_Info's with equal priority. - Sub_Priority dynamic_subpriority; + // For ordering RT_Info's with equal priority. + Sub_Priority dynamic_subpriority; +// this is not really a fixed attribute of the RT_Info, +// but rather a value dynamically computed at run-time +// TBD - remove this field // For ordering RT_Info's with equal priority. Sub_Priority static_subpriority; diff --git a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp index 96919937af5..0e6504900fe 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp +++ b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.cpp @@ -7,7 +7,9 @@ #include "orbsvcs/Time_Utilities.h" #include "orbsvcs/Scheduler_Factory.h" -#include "Scheduler_Generic.h" +// #include "Scheduler_Generic.h" +#include "Strategy_Scheduler.h" + #include "Config_Scheduler.h" #if defined (__ACE_INLINE__) @@ -15,7 +17,12 @@ #endif /* __ACE_INLINE__ */ ACE_Config_Scheduler::ACE_Config_Scheduler (void) - : impl(new Scheduler_Generic) +#if defined (TAO_USES_STRATEGY_SCHEDULER) + : scheduler_strategy_ ((RtecScheduler::Preemption_Priority) TAO_MIN_CRITICAL_PRIORITY) + , impl (new ACE_Strategy_Scheduler (scheduler_strategy_)) +#else + : impl (new Scheduler_Generic) +#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ { // impl->output_level (10); } @@ -53,12 +60,17 @@ ACE_Config_Scheduler::create (const char * entry_point, rt_info[0]->preemption_priority = 0; RtecScheduler::handle_t handle = -1; +#if defined (TAO_USES_STRATEGY_SCHEDULER) + switch (impl->register_task (rt_info[0], handle)) +#else switch (impl->register_task (rt_info, 1, handle)) +#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ + { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::SUCCEEDED: break; - case ACE_Scheduler::ST_VIRTUAL_MEMORY_EXHAUSTED: - case ACE_Scheduler::ST_TASK_ALREADY_REGISTERED: + case BaseSchedImplType::ST_VIRTUAL_MEMORY_EXHAUSTED: + case BaseSchedImplType::ST_TASK_ALREADY_REGISTERED: default: delete rt_info[0]; delete[] rt_info; @@ -78,11 +90,11 @@ ACE_Config_Scheduler::lookup (const char * entry_point, RtecScheduler::RT_Info* rt_info = 0; switch (impl->get_rt_info (entry_point, rt_info)) { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::SUCCEEDED: return rt_info->handle; ACE_NOTREACHED (break); - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: + case BaseSchedImplType::FAILED: + case BaseSchedImplType::ST_UNKNOWN_TASK: default: ACE_ERROR ((LM_ERROR, "Config_Scheduler::lookup - get_rt_info failed\n")); @@ -101,7 +113,7 @@ ACE_Config_Scheduler::get (RtecScheduler::handle_t handle, RtecScheduler::RT_Info* rt_info = 0; switch (impl->lookup_rt_info (handle, rt_info)) { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::SUCCEEDED: { // IDL memory managment semantics require the we return a copy RtecScheduler::RT_Info* copy; @@ -109,8 +121,8 @@ ACE_Config_Scheduler::get (RtecScheduler::handle_t handle, return copy; } ACE_NOTREACHED (break); - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: + case BaseSchedImplType::FAILED: + case BaseSchedImplType::ST_UNKNOWN_TASK: default: ACE_ERROR ((LM_ERROR, "Config_Scheduler::get - lookup_rt_info failed\n")); @@ -137,7 +149,7 @@ void ACE_Config_Scheduler::set (RtecScheduler::handle_t handle, RtecScheduler::RT_Info* rt_info = 0; switch (impl->lookup_rt_info (handle, rt_info)) { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::SUCCEEDED: rt_info->criticality = criticality, rt_info->worst_case_execution_time = time; rt_info->typical_execution_time = typical_time; @@ -148,8 +160,8 @@ void ACE_Config_Scheduler::set (RtecScheduler::handle_t handle, rt_info->threads = threads; rt_info->info_type = info_type; break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: + case BaseSchedImplType::FAILED: + case BaseSchedImplType::ST_UNKNOWN_TASK: default: ACE_ERROR ((LM_ERROR, "Config_Scheduler::set - lookup_rt_info failed\n")); @@ -205,17 +217,22 @@ void ACE_Config_Scheduler::add_dependency (RtecScheduler::handle_t handle, RtecScheduler::RT_Info* rt_info = 0; switch (impl->lookup_rt_info (handle, rt_info)) { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::SUCCEEDED: { RtecScheduler::Dependency_Info dep; dep.rt_info = dependency; dep.number_of_calls = number_of_calls; dep.dependency_type = dependency_type; - ACE_Scheduler::add_dependency(rt_info, dep); +#if defined (TAO_USES_STRATEGY_SCHEDULER) + impl->add_dependency (rt_info, dep); +#else + BaseSchedImplType::add_dependency (rt_info, dep); +#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ + } break; - case ACE_Scheduler::FAILED: - case ACE_Scheduler::ST_UNKNOWN_TASK: + case BaseSchedImplType::FAILED: + case BaseSchedImplType::ST_UNKNOWN_TASK: default: ACE_ERROR ((LM_ERROR, "cannot find %d to add dependency", handle)); @@ -236,7 +253,7 @@ void ACE_Config_Scheduler::compute_scheduling (CORBA::Long minimum_priority, ACE_UNUSED_ARG (_env); impl->init (minimum_priority, maximum_priority); - if (impl->schedule () != ACE_Scheduler::SUCCEEDED) + if (impl->schedule () != BaseSchedImplType::SUCCEEDED) { // TODO: throw something. ACE_ERROR ((LM_ERROR, "schedule failed\n")); @@ -254,12 +271,12 @@ void ACE_Config_Scheduler::compute_scheduling (CORBA::Long minimum_priority, RtecScheduler::RT_Info* rt_info = 0; switch (impl->lookup_rt_info (handle, rt_info)) { - case ACE_Scheduler::SUCCEEDED: + case BaseSchedImplType::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: + case BaseSchedImplType::FAILED: + case BaseSchedImplType::ST_UNKNOWN_TASK: default: ACE_ERROR ((LM_ERROR, "Config_Scheduler::schedule - lookup_rt_info failed\n")); @@ -273,3 +290,70 @@ void ACE_Config_Scheduler::compute_scheduling (CORBA::Long minimum_priority, ACE_Scheduler_Factory::dump_schedule (*(infos.ptr()), 0); ACE_DEBUG ((LM_DEBUG, "dump done\n")); } + + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + #if defined (TAO_USES_STRATEGY_SCHEDULER) + #if defined (TAO_USES_MUF_SCHEDULING) + + template class ACE_Strategy_Scheduler_Factory<ACE_MUF_Scheduler_Strategy>; + + #elif defined (TAO_USES_MLF_SCHEDULING) + + template class ACE_Strategy_Scheduler_Factory<ACE_MLF_Scheduler_Strategy>; + + #elif defined (TAO_USES_EDF_SCHEDULING) + + template class ACE_Strategy_Scheduler_Factory<ACE_EDF_Scheduler_Strategy>; + + #elif defined (TAO_USES_RMS_SCHEDULING) + + template class ACE_Strategy_Scheduler_Factory<ACE_RMS_Scheduler_Strategy>; + + #elif defined (TAO_USES_RMS_DYN_SCHEDULING) + + template class ACE_Strategy_Scheduler_Factory<ACE_RMS_Dyn_Scheduler_Strategy>; + + #else + + #error scheduling strategy must be defined + + #endif /* defined (TAO_USES_MUF_SCHEDULING) */ + #endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ + +#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) +#pragma instantiate + #if defined (TAO_USES_STRATEGY_SCHEDULER) + #if defined (TAO_USES_MUF_SCHEDULING) + + #pragma instantiate ACE_Strategy_Scheduler_Factory<ACE_MUF_Scheduler_Strategy> + + #elif defined (TAO_USES_MLF_SCHEDULING) + + #pragma instantiate ACE_Strategy_Scheduler_Factory<ACE_MLF_Scheduler_Strategy> + + #elif defined (TAO_USES_EDF_SCHEDULING) + + #pragma instantiate ACE_Strategy_Scheduler_Factory<ACE_EDF_Scheduler_Strategy> + + #elif defined (TAO_USES_RMS_SCHEDULING) + + #pragma instantiate ACE_Strategy_Scheduler_Factory<ACE_RMS_Scheduler_Strategy> + + #elif defined (TAO_USES_RMS_DYN_SCHEDULING) + + #pragma instantiate ACE_Strategy_Scheduler_Factory<ACE_RMS_Dyn_Scheduler_Strategy> + + #else + + #error scheduling strategy must be defined + + #endif /* defined (TAO_USES_MUF_SCHEDULING) */ + #endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ +#endif /* defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) */ + + + + + + diff --git a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h index d4c873fcc0e..ba1a8f07962 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h +++ b/TAO/orbsvcs/orbsvcs/Sched/Config_Scheduler.h @@ -19,6 +19,7 @@ class TAO_ORBSVCS_Export ACE_Config_Scheduler // distributed with the EC. { public: + ACE_Config_Scheduler (void); virtual ~ACE_Config_Scheduler (void); @@ -83,7 +84,59 @@ public: RtecScheduler::TASK_COUNT_MISMATCH)); private: - class ACE_Scheduler* impl; + +#if defined (TAO_USES_STRATEGY_SCHEDULER) + + // trait for the scheduler implementation base class + typedef ACE_DynScheduler BaseSchedImplType; + + // traits for the scheduler strategy +#if defined (TAO_USES_MUF_SCHEDULING) + + typedef ACE_MUF_Scheduler_Strategy Scheduler_Strategy; + +#elif defined (TAO_USES_MLF_SCHEDULING) + + #if ! defined (TAO_MIN_CRITICAL_PRIORITY) + #define TAO_MIN_CRITICAL_PRIORITY 0 + #endif /* ! defined (TAO_MIN_CRITICAL_PRIORITY) */ + + typedef ACE_MLF_Scheduler_Strategy Scheduler_Strategy; + +#elif defined (TAO_USES_EDF_SCHEDULING) + + #if ! defined (TAO_MIN_CRITICAL_PRIORITY) + #define TAO_MIN_CRITICAL_PRIORITY 0 + #endif /* ! defined (TAO_MIN_CRITICAL_PRIORITY) */ + + typedef ACE_EDF_Scheduler_Strategy Scheduler_Strategy; + +#elif defined (TAO_USES_RMS_SCHEDULING) + + typedef ACE_RMS_Scheduler_Strategy Scheduler_Strategy; + +#elif defined (TAO_USES_RMS_DYN_SCHEDULING) + + typedef ACE_RMS_Dyn_Scheduler_Strategy Scheduler_Strategy; + +#else + + #error scheduling strategy must be defined + +#endif /* defined (TAO_USES_MUF_SCHEDULING) */ + + Scheduler_Strategy scheduler_strategy_; + +#else /* ! defined (TAO_USES_STRATEGY_SCHEDULER) */ + + // trait for the scheduler implementation base class + typedef ACE_DynScheduler BaseSchedImplType; + +#endif /* defined (TAO_USES_STRATEGY_SCHEDULER) */ + + // implementation base class pointer + BaseSchedImplType* impl; + }; #if defined (__ACE_INLINE__) @@ -91,3 +144,12 @@ private: #endif /* __ACE_INLINE__ */ #endif /* ACE_CONFIG_SCHEDULER_H */ + + + + + + + + + diff --git a/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp b/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp index ab91d3b793e..fa110e2522d 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp +++ b/TAO/orbsvcs/orbsvcs/Sched/DynSched.cpp @@ -190,13 +190,19 @@ ACE_DynScheduler::register_task (RT_Info *rt_info, handle_t &handle) { ACE_DynScheduler::status_t ret; + // check the pointer we were passed + if (! rt_info) + { + handle = 0; + return ST_UNKNOWN_TASK; + } + // try to store the new task's information . . . switch (rt_info_entries_.insert (rt_info)) { case 0 : // successfully inserted { rt_info->handle = (handle = ++handles_); - ret = SUCCEEDED; // zero out the task entry ACT used by the scheduler @@ -208,7 +214,7 @@ ACE_DynScheduler::register_task (RT_Info *rt_info, handle_t &handle) if (output_level () >= 5) { ACE_OS::printf ("registered task \"%s\" with RT_Info at %X\n", - (const char*)rt_info->entry_point, + (const char*)(rt_info->entry_point), (void *) rt_info); } } @@ -280,6 +286,52 @@ ACE_DynScheduler::get_rt_info (Object_Name name, + +int ACE_DynScheduler::priority ( + const RtecScheduler::handle_t handle, + RtecScheduler::OS_Priority &priority, + RtecScheduler::Sub_Priority &subpriority, + RtecScheduler::Preemption_Priority &preemption_prio) +{ + // look up the RT_Info that has the given handle + RT_Info *rt_info = 0; + if (lookup_rt_info (handle, rt_info) == SUCCEEDED) + { + // copy the priority values from the RT_Info + priority = rt_info->priority; + subpriority = rt_info->static_subpriority; + preemption_prio = rt_info->preemption_priority; + + return 0; + } + else + + { + // RT_Info not found: assign default priority values + 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 -1; + } +} + // "priority" is the OS thread priority that was assigned to the Task that + // was assigned "handle". "subpriority" combines the dynamic and static + // subpriorities of the Task that was assigned handle. "preemption_prio" + // is a platform-independent priority queue number, ranging from a + // highest priority value of 0 to the lowest priority value, which is + // returned by "minimum_priority_queue ()". The current and deadline times + // supplied are used to compute the operation's dynamic subpriority + // Returns 0 on success, or -1 if an invalid handle was supplied. + + int ACE_DynScheduler::number_of_dependencies(RT_Info* rt_info) { return rt_info->dependencies.length(); @@ -291,7 +343,7 @@ int ACE_DynScheduler::number_of_dependencies(RT_Info& rt_info) } int ACE_DynScheduler::add_dependency(RT_Info* rt_info, - Dependency_Info& d) + Dependency_Info& d) { RT_Info *temp_info = 0; // temporary pointer to the caller's RT_Info @@ -364,12 +416,6 @@ void ACE_DynScheduler::export(RT_Info& info, FILE* file) } -// TBD - we'll need to update this to use the information aggregated -// within the task entry pointed to by the RT_Info's volatile_token -// ACT (in fact, there is now more than one -// priority assignment per RT_Info, w/ disjunction on multiple -// priority levels, rates, etc. - iterate through and show each dispatch) - (void) ACE_OS::fprintf (file, "# end calls\n%d\n%d\n%d\n\n", info.priority, info.dynamic_subpriority, diff --git a/TAO/orbsvcs/orbsvcs/Sched/DynSched.h b/TAO/orbsvcs/orbsvcs/Sched/DynSched.h index aa811987a7a..5c8d59b5cb1 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/DynSched.h +++ b/TAO/orbsvcs/orbsvcs/Sched/DynSched.h @@ -172,27 +172,21 @@ public: // = Access a thread priority. -// TBD - put this back in, but with dynamic subpriority as well as static -// int priority (const handle_t handle, -// OS_Priority &OS_priority, -// Preemption_Priority &preemption_priority, -// Sub_Priority &dynamic_subpriority, -// Sub_Priority &static_subpriority); - // Defines "priority" as the priority that was assigned to the Task that - // was assigned "handle". Defines "dynamic subpriority" as the strategy - // specific assignment of dynamic subpriority within a priority level, and - // "static subpriority" as the minimal importance and topological ordering. - // Returns 0 on success, or -1 if an invalid handle was 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 ()". + virtual int priority (const handle_t handle, + OS_Priority &priority, + Sub_Priority &subpriority, + Preemption_Priority &preemption_prio); + // "priority" is the OS thread priority that was assigned to the Task that + // was assigned "handle". "subpriority" combines the dynamic and static + // subpriorities of the Task that was assigned handle. "preemption_prio" + // is a platform-independent priority queue number, ranging from a + // highest priority value of 0 to the lowest priority value, which is + // returned by "minimum_priority_queue ()". Returns 0 on success, + // or -1 if an invalid handle was supplied. // = Access the platform-independent priority value of the lowest-priority // thread. - Preemption_Priority minimum_priority_queue () const; - // 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 tasks. u_int tasks () const; @@ -218,7 +212,6 @@ public: static int number_of_dependencies(RT_Info* rt_info); static int number_of_dependencies(RT_Info& rt_info); - // TBD - modify these to take a Task_Entry and show all its dispatches static void export(RT_Info*, FILE* file); static void export(RT_Info&, FILE* file); diff --git a/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h index 8cd1cd53054..9f22254088e 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h +++ b/TAO/orbsvcs/orbsvcs/Sched/Scheduler.h @@ -47,6 +47,8 @@ public: typedef RtecScheduler::OS_Priority OS_Thread_Priority; typedef RtecScheduler::Sub_Priority Sub_Priority; typedef RtecScheduler::RT_Info RT_Info; + typedef RtecScheduler::Time Time; + // Map some types to simplify re-use. typedef const char *Object_Name; @@ -164,7 +166,9 @@ public: // 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 ()". + // returned by "minimum_priority_queue ()". The current and deadline times + // are part of the scheduling service implementation interface, but may be + // ignored by some implementations and used by others. // = Access the platform-independent priority value of the lowest-priority // thread. diff --git a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp index dd840d8a83c..6bf1ec951fb 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp +++ b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.cpp @@ -82,6 +82,13 @@ ACE_Strategy_Scheduler::assign_priorities (Dispatch_Entry **dispatches, // value the OS and scheduler priorities in 0th dispatch entry dispatches[0]->OS_priority (current_OS_priority); dispatches[0]->priority (current_scheduler_priority); + // set OS priority and Scheduler priority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [0]->task_entry ().rt_info ()->priority = + current_OS_priority; + dispatches [0]->task_entry ().rt_info ()->preemption_priority = + current_scheduler_priority; // traverse ordered dispatch entry array, assigning priority // (array is sorted from highest to lowest priority) @@ -142,6 +149,14 @@ ACE_Strategy_Scheduler::assign_priorities (Dispatch_Entry **dispatches, // set scheduler priority of the current dispatch entry dispatches[i]->priority (current_scheduler_priority); + + // set OS priority and Scheduler priority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i]->task_entry ().rt_info ()->priority = + current_OS_priority; + dispatches [i]->task_entry ().rt_info ()->preemption_priority = + current_scheduler_priority; } return status; @@ -159,35 +174,56 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, Sub_Priority static_subpriority_level = 0; u_int dynamic_subpriority_elements = 1; u_int static_subpriority_elements = 1; - dispatches[0]->dynamic_subpriority (dynamic_subpriority_level); - dispatches[0]->static_subpriority (static_subpriority_level++); + dispatches [0]->dynamic_subpriority (dynamic_subpriority_level); + dispatches [0]->static_subpriority (static_subpriority_level); + + // set dynamic and static subpriority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [0]->task_entry ().rt_info ()->dynamic_subpriority = + dynamic_subpriority_level; + dispatches [0]->task_entry ().rt_info ()->static_subpriority = + static_subpriority_level; + + // advance the static subpriority level + static_subpriority_level++; u_int i,j; // traverse ordered dispatch entry array, assigning priority // (array is sorted from highest to lowest priority) for (i = 1; i < count; ++i) { - switch (strategy_.priority_comp (*(dispatches[i-1]), - *(dispatches[i]))) + switch (strategy_.priority_comp (*(dispatches [i-1]), + *(dispatches [i]))) { case -1: // the current entry is at lower priority than the previous - { + { // fill in the high to low dynamic subpriority values by subtracting // the previously assigned subpriority value of each of element in the // current priority level from the value of last subpriority level for (j = 1; j <= dynamic_subpriority_elements; ++j) { - dispatches[i - j]-> + dispatches [i - j]-> dynamic_subpriority (dynamic_subpriority_level - - dispatches[i - j]-> - dynamic_subpriority ()); + dispatches [i - j]-> dynamic_subpriority ()); + + // set dynamic subpriority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i - j]->task_entry ().rt_info ()->dynamic_subpriority = + dispatches [i - j]-> dynamic_subpriority (); } for (j = 1; j <= static_subpriority_elements; ++j) { - dispatches[i - j]-> + dispatches [i - j]-> static_subpriority (static_subpriority_level - - dispatches[i - j]-> - static_subpriority () - 1); + dispatches [i - j]-> static_subpriority () - 1); + + // set static subpriority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i - j]->task_entry ().rt_info ()->static_subpriority = + dispatches [i - j]-> static_subpriority (); } // reset the subpriority counters, set these values in the @@ -196,11 +232,22 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, static_subpriority_elements = 1; dynamic_subpriority_level = 0; static_subpriority_level = 0; - dispatches[i]->dynamic_subpriority (dynamic_subpriority_level); - dispatches[i]->static_subpriority (static_subpriority_level++); + dispatches [i]->dynamic_subpriority (dynamic_subpriority_level); + dispatches [i]->static_subpriority (static_subpriority_level); + + // set dynamic and static subpriority of underlying RT_Info + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i]->task_entry ().rt_info ()->dynamic_subpriority = + dynamic_subpriority_level; + dispatches [i]->task_entry ().rt_info ()->static_subpriority = + static_subpriority_level; + + // advance the static subpriority level + static_subpriority_level++; break; - } + } case 0: // still at the same priority level @@ -217,8 +264,14 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, // with non-determinism if due to run-time conditions, two // dispatches line up with identical dynamic subpriority that // were considered different with respect to the critical instant - dispatches[i]->static_subpriority (static_subpriority_level++); + dispatches [i]->static_subpriority (static_subpriority_level); + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i]->task_entry ().rt_info ()->static_subpriority = + static_subpriority_level; + static_subpriority_level++; static_subpriority_elements++; + break; case 0: // still at the same dynamic subpriority level @@ -236,7 +289,12 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, // one anyway, to give a completely deterministic schedule // even if the dynamic subpriorities happen to align due to // run-time variation - dispatches[i]->static_subpriority (static_subpriority_level++); + dispatches [i]->static_subpriority (static_subpriority_level); + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i]->task_entry ().rt_info ()->static_subpriority = + static_subpriority_level; + static_subpriority_level++; static_subpriority_elements++; break; @@ -246,8 +304,8 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, LM_ERROR, "Static subpriority assignment failure: tasks" " \"%s\" and \"%s\" are out of order.\n", - dispatches[i-1]->task_entry ().rt_info ()->entry_point.in (), - dispatches[i]->task_entry ().rt_info ()->entry_point.in ()), + dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (), + dispatches [i]->task_entry ().rt_info ()->entry_point.in ()), ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING); } @@ -260,13 +318,19 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, LM_ERROR, "Dynamic subpriority assignment failure: tasks" " \"%s\" and \"%s\" are out of order.\n", - dispatches[i-1]->task_entry ().rt_info ()->entry_point.in (), - dispatches[i]->task_entry ().rt_info ()->entry_point.in ()), + dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (), + dispatches [i]->task_entry ().rt_info ()->entry_point.in ()), ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING); } - dispatches[i]->dynamic_subpriority (dynamic_subpriority_level); - dynamic_subpriority_elements++; + dispatches [i]->dynamic_subpriority (dynamic_subpriority_level); + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i]->task_entry ().rt_info ()->dynamic_subpriority = + dynamic_subpriority_level; + + dynamic_subpriority_elements++; + break; default: // should never reach here: something *bad* has happened @@ -275,8 +339,8 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, LM_ERROR, "Priority assignment failure: tasks" " \"%s\" and \"%s\" are out of order.\n", - dispatches[i-1]->task_entry ().rt_info ()->entry_point.in (), - dispatches[i]->task_entry ().rt_info ()->entry_point.in ()), + dispatches [i-1]->task_entry ().rt_info ()->entry_point.in (), + dispatches [i]->task_entry ().rt_info ()->entry_point.in ()), ACE_DynScheduler::ST_INVALID_PRIORITY_ORDERING); } } @@ -286,15 +350,25 @@ ACE_Strategy_Scheduler::assign_subpriorities (Dispatch_Entry **dispatches, // the total number of subpriorities for (j = 1; j <= dynamic_subpriority_elements; ++j) { - dispatches[i - j]-> + dispatches [i - j]-> dynamic_subpriority (dynamic_subpriority_level - - dispatches[i - j]->dynamic_subpriority ()); + dispatches [i - j]->dynamic_subpriority ()); + + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i - j]->task_entry ().rt_info ()->dynamic_subpriority = + dispatches [i - j]->dynamic_subpriority (); } for (j = 1; j <= static_subpriority_elements; ++j) { - dispatches[i - j]-> + dispatches [i - j]-> static_subpriority (static_subpriority_level - - dispatches[i - j]->static_subpriority () - 1); + dispatches [i - j]->static_subpriority () - 1); + + // TBD - assign values into a map of priorities and RT_Infos: + // an RT_Info can be dispatched at multiple priorities + dispatches [i - j]->task_entry ().rt_info ()->static_subpriority = + dispatches [i - j]->static_subpriority (); } return ACE_DynScheduler::SUCCEEDED; @@ -476,9 +550,8 @@ ACE_Strategy_Scheduler::schedule_timeline_entry ( // class template ACE_Strategy_Scheduler_Factory member functions // //////////////////////////////////////////////////////////////////// -template <class STRATEGY> -ACE_Strategy_Scheduler * -ACE_Strategy_Scheduler_Factory<STRATEGY>::create (ACE_DynScheduler::Preemption_Priority minimum_critical_priority) +template <class STRATEGY> ACE_Strategy_Scheduler * +ACE_Strategy_Scheduler_Factory<STRATEGY>::create (RtecScheduler::Preemption_Priority minimum_critical_priority) { ACE_Strategy_Scheduler *the_scheduler = 0; STRATEGY *the_strategy; @@ -1209,6 +1282,118 @@ ACE_RMS_Dyn_Scheduler_Strategy::minimum_critical_priority () // = returns 0 for minimum critical priority number +///////////////////////////////////////////// +// Runtime Dispatch Subpriority Strategies // +///////////////////////////////////////////// + +ACE_Dispatch_Subpriority_Strategy::ACE_Dispatch_Subpriority_Strategy (long frame_size) + : frame_size_ (frame_size) + , dynamic_max_ (LONG_MAX) + , static_max_ (0) + , static_bits_ (0) +{ + // some platforms don't support floating point numbers, so compute delimiters + // for static and dynamic subpriority representations the long way (once) + long doubler = 1; + while ((dynamic_max_ / 2) > frame_size) + { + dynamic_max_ /= 2; + doubler *= 2; + static_max_ = doubler - 1; + ++static_bits_; + } + + max_time_.set (0, dynamic_max_); + min_time_.set (0, - dynamic_max_ - 1); +} + + +RtecScheduler::Sub_Priority +ACE_Dispatch_Subpriority_Strategy::response_function ( + const ACE_Time_Value &time_metric, + RtecScheduler::Sub_Priority static_subpriority) +{ + RtecScheduler::Sub_Priority dynamic_subpriority; + + if (time_metric < min_time_) + { + dynamic_subpriority = - dynamic_max_ - 1; + static_subpriority = static_max_; + } + else if (time_metric > max_time_) + { + dynamic_subpriority = dynamic_max_; + static_subpriority = static_max_; + } + else + { + dynamic_subpriority = time_metric.usec () + + time_metric.sec () * ACE_ONE_SECOND_IN_USECS; + + if (static_subpriority > static_max_) + { + static_subpriority = static_max_; + } + } + + return (dynamic_subpriority > 0) + ? (LONG_MAX - + (dynamic_subpriority << static_bits_) - + static_subpriority) + : (LONG_MIN + + ((-dynamic_subpriority) << static_bits_) + + static_subpriority); +} + + +ACE_Deadline_Subpriority_Strategy::ACE_Deadline_Subpriority_Strategy (long frame_size) + : ACE_Dispatch_Subpriority_Strategy (frame_size) +{ +} + +RtecScheduler::Sub_Priority +ACE_Deadline_Subpriority_Strategy::runtime_subpriority ( + const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority) +{ + ACE_Time_Value time_to_deadline (deadline_time); + time_to_deadline -= current_time; + + return response_function (time_to_deadline, static_subpriority); +} + +ACE_Laxity_Subpriority_Strategy::ACE_Laxity_Subpriority_Strategy (long frame_size) + : ACE_Dispatch_Subpriority_Strategy (frame_size) +{ +} + +RtecScheduler::Sub_Priority +ACE_Laxity_Subpriority_Strategy::runtime_subpriority ( + const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority) +{ + ACE_Time_Value laxity (deadline_time); + laxity -= current_time; + laxity -= execution_time; + + return response_function (laxity, static_subpriority); +} + +RtecScheduler::Sub_Priority +ACE_Static_Subpriority_Strategy::runtime_subpriority ( + const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority) +{ + // map passed static subpriority directly to dispatch subpriority + return static_subpriority; +} + #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) template class ACE_Node<Dispatch_Entry *>; diff --git a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h index c7977092167..60051a4f5a2 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h +++ b/TAO/orbsvcs/orbsvcs/Sched/Strategy_Scheduler.h @@ -93,7 +93,7 @@ class ACE_Strategy_Scheduler_Factory { public: - static ACE_Strategy_Scheduler * create (ACE_DynScheduler::Preemption_Priority minimum_critical_priority); + static ACE_Strategy_Scheduler * create (RtecScheduler::Preemption_Priority minimum_critical_priority); // construct and return a scheduler strategized with // an instance of the the parameterized strategy type }; @@ -465,6 +465,103 @@ private: }; +///////////////////////////////////////////// +// Runtime Dispatch Subpriority Strategies // +///////////////////////////////////////////// + +class TAO_ORBSVCS_Export ACE_Dispatch_Subpriority_Strategy +{ +public: + + ACE_Dispatch_Subpriority_Strategy (long frame_size = ACE_ONE_SECOND_IN_USECS); + // ctor: frame size is the number of microseconds in a complete + // dispatch frame (defaults to one million = one second). + + virtual RtecScheduler::Sub_Priority + runtime_subpriority (const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority) = 0; + // abstract method to compute the dispatch subpriority for an operation + + virtual RtecScheduler::Sub_Priority + response_function (const ACE_Time_Value &time_metric, + RtecScheduler::Sub_Priority static_subpriority); + // response function for run time subpriority: stepwise linear function that + // gives appoximately the same dispatching behavior as a hyperbolic function, + // but does not require us to use floating point math. + + +protected: + + long frame_size_; + // number of microseconds per scheduling frame + + long dynamic_max_; + // max value that a dynamic priority representation can have + + long static_max_; + // number of bits available for static subpriority representation + + u_int static_bits_; + // number of bits available for static subpriority representation + + ACE_Time_Value max_time_; + // maximum time value that can be represented + + ACE_Time_Value min_time_; + // minimum time value that can be represented + +}; + + +class TAO_ORBSVCS_Export ACE_Deadline_Subpriority_Strategy + : public ACE_Dispatch_Subpriority_Strategy +{ +public: + + ACE_Deadline_Subpriority_Strategy (long frame_size = ACE_ONE_SECOND_IN_USECS); + // ctor: frame size is the number of microseconds in a complete + // dispatch frame (defaults to one million = one second). + + + virtual RtecScheduler::Sub_Priority + runtime_subpriority (const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority); +}; + +class TAO_ORBSVCS_Export ACE_Laxity_Subpriority_Strategy + : public ACE_Dispatch_Subpriority_Strategy +{ +public: + + ACE_Laxity_Subpriority_Strategy (long frame_size = ACE_ONE_SECOND_IN_USECS); + // ctor: frame size is the number of microseconds in a complete + // dispatch frame (defaults to one million = one second). + + + virtual RtecScheduler::Sub_Priority + runtime_subpriority (const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority); +}; + +class TAO_ORBSVCS_Export ACE_Static_Subpriority_Strategy + : public ACE_Dispatch_Subpriority_Strategy +{ +public: + + virtual RtecScheduler::Sub_Priority + runtime_subpriority (const ACE_Time_Value ¤t_time, + const ACE_Time_Value &deadline_time, + const ACE_Time_Value &execution_time, + RtecScheduler::Sub_Priority static_subpriority); +}; + + #if defined (__ACE_INLINE__) #include "Strategy_Scheduler.i" #endif /* __ACE_INLINE__ */ diff --git a/TAO/orbsvcs/orbsvcs/orbsvcs.dsp b/TAO/orbsvcs/orbsvcs/orbsvcs.dsp index b9525844db8..694136a2ab8 100644 --- a/TAO/orbsvcs/orbsvcs/orbsvcs.dsp +++ b/TAO/orbsvcs/orbsvcs/orbsvcs.dsp @@ -142,6 +142,10 @@ SOURCE=.\Event\Dispatching_Modules.cpp # End Source File
# Begin Source File
+SOURCE=.\Sched\DynSched.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Event\EC_Gateway.cpp
# End Source File
# Begin Source File
@@ -222,6 +226,10 @@ SOURCE=.\Runtime_Scheduler.cpp # End Source File
# Begin Source File
+SOURCE=.\Sched\SchedEntry.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Sched\Scheduler.cpp
# End Source File
# Begin Source File
@@ -238,6 +246,10 @@ SOURCE=.\Scheduler_Utilities.cpp # End Source File
# Begin Source File
+SOURCE=.\Sched\Strategy_Scheduler.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\Event\Task_Manager.cpp
# End Source File
# Begin Source File
@@ -290,6 +302,10 @@ SOURCE=.\Event\Dispatching_Modules.h # End Source File
# Begin Source File
+SOURCE=.\Sched\DynSched.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Event\EC_Gateway.h
# End Source File
# Begin Source File
@@ -370,6 +386,10 @@ SOURCE=.\Runtime_Scheduler.h # End Source File
# Begin Source File
+SOURCE=.\Sched\SchedEntry.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Sched\Scheduler.h
# End Source File
# Begin Source File
@@ -386,6 +406,10 @@ SOURCE=.\Scheduler_Utilities.h # End Source File
# Begin Source File
+SOURCE=.\Sched\Strategy_Scheduler.h
+# End Source File
+# Begin Source File
+
SOURCE=.\Event\Task_Manager.h
# End Source File
# Begin Source File
@@ -426,12 +450,24 @@ SOURCE=.\Event\Dispatching_Modules.i # End Source File
# Begin Source File
+SOURCE=.\Sched\DynSched.i
+# End Source File
+# Begin Source File
+
SOURCE=.\Event\Event_Channel.i
# End Source File
# Begin Source File
SOURCE=.\Event_Utilities.i
# End Source File
+# Begin Source File
+
+SOURCE=.\Sched\SchedEntry.i
+# End Source File
+# Begin Source File
+
+SOURCE=.\Sched\Strategy_Scheduler.i
+# End Source File
# End Group
# Begin Group "IDL Files"
@@ -450,7 +486,7 @@ InputName=CosLifeCycle BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -486,7 +522,7 @@ InputName=CosNaming BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -515,7 +551,7 @@ InputName=CosNaming BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -551,7 +587,7 @@ InputName=CosTimeBase BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -580,7 +616,7 @@ InputName=CosTimeBase BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -616,7 +652,7 @@ InputName=Logger BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -645,7 +681,7 @@ InputName=Logger BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -681,7 +717,7 @@ InputName=RtecEventChannelAdmin BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -710,7 +746,7 @@ InputName=RtecEventChannelAdmin BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -746,7 +782,7 @@ InputName=RtecEventComm BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -775,7 +811,7 @@ InputName=RtecEventComm BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -811,7 +847,7 @@ InputName=RtecScheduler BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
@@ -840,7 +876,7 @@ InputName=RtecScheduler BuildCmds= \
..\..\tao_idl\tao_idl -Wb,export_macro=TAO_ORBSVCS_Export\
- -Wb,export_include=orbsvcs_export.h $(InputName).idl
+ -Wb,export_include=orbsvcs_export.h $(InputName).idl
"$(InputName)S.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
|