summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvenkita <venkita@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-25 04:26:15 +0000
committervenkita <venkita@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-25 04:26:15 +0000
commit1b0be34fae7e78d821fa69d3df966c8b26eabca2 (patch)
treec97bb628da748a3183fea883bad5699a40c725ca
parentadbdf1e8a205e5180cd9a87b5731875c00895c3f (diff)
downloadATCD-1b0be34fae7e78d821fa69d3df966c8b26eabca2.tar.gz
ChangeLogTag: Thu Apr 24 23:20:16 2003 Venkita Subramonian <venkita@cs.wustl.edu>
-rw-r--r--ChangeLog17
-rw-r--r--Kokyu/DSRT_Dispatcher_Impl.cpp6
-rw-r--r--Kokyu/DSRT_Dispatcher_Impl.h14
-rw-r--r--Kokyu/DSRT_Dispatcher_Impl.i6
-rw-r--r--Kokyu/DSRT_Schedulers.cpp86
-rw-r--r--Kokyu/DSRT_Schedulers.h12
-rw-r--r--Kokyu/Kokyu.cpp6
-rw-r--r--Kokyu/Kokyu.h17
-rw-r--r--Kokyu/tests/DSRT_MIF/MIF.cpp13
-rw-r--r--Kokyu/tests/DSRT_MIF/svc.conf4
-rw-r--r--Kokyu/tests/DSRT_MIF/svc.conf.xml2
11 files changed, 113 insertions, 70 deletions
diff --git a/ChangeLog b/ChangeLog
index 7a93a0a4f66..101c80b0ecf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Thu Apr 24 23:20:16 2003 Venkita Subramonian <venkita@cs.wustl.edu>
+
+ * Kokyu/DSRT_Dispatcher_Impl.cpp:
+ * Kokyu/DSRT_Dispatcher_Impl.h:
+ * Kokyu/DSRT_Dispatcher_Impl.i:
+ * Kokyu/DSRT_Schedulers.cpp:
+ * Kokyu/DSRT_Schedulers.h:
+ * Kokyu/Kokyu.cpp:
+ * Kokyu/Kokyu.h:
+ * Kokyu/tests/DSRT_MIF/MIF.cpp:
+ * Kokyu/tests/DSRT_MIF/svc.conf:
+ * Kokyu/tests/DSRT_MIF/svc.conf.xml:
+
+ Made the importance value continuous instead of discrete to make
+ it more compatible with DSRT MIF scheduler. Made the MIF
+ scheduler accept max and min importance thru the svc.conf file.
+
Thu Apr 24 20:17:44 2003 Venkita Subramonian <venkita@cs.wustl.edu>
* Kokyu/DSRT_Dispatcher_Impl.cpp:
diff --git a/Kokyu/DSRT_Dispatcher_Impl.cpp b/Kokyu/DSRT_Dispatcher_Impl.cpp
index 704ba23f028..6be4ea9ba3a 100644
--- a/Kokyu/DSRT_Dispatcher_Impl.cpp
+++ b/Kokyu/DSRT_Dispatcher_Impl.cpp
@@ -30,7 +30,7 @@ DSRT_Dispatcher_Impl::init_i (const DSRT_ConfigInfo& config_info)
int
DSRT_Dispatcher_Impl::schedule_i (guid_t guid,
- const QoSDescriptor& qos_info)
+ const DSRT_QoSDescriptor& qos_info)
{
ACE_UNUSED_ARG (guid);
@@ -42,7 +42,7 @@ DSRT_Dispatcher_Impl::schedule_i (guid_t guid,
int
DSRT_Dispatcher_Impl::update_schedule_i (guid_t guid,
- const QoSDescriptor& qos_info)
+ const DSRT_QoSDescriptor& qos_info)
{
ACE_UNUSED_ARG (guid);
ACE_UNUSED_ARG (qos_info);
@@ -51,7 +51,7 @@ DSRT_Dispatcher_Impl::update_schedule_i (guid_t guid,
int
DSRT_Dispatcher_Impl::cancel_schedule_i (guid_t guid,
- const QoSDescriptor& qos_info)
+ const DSRT_QoSDescriptor& qos_info)
{
return schedule_i (guid, qos_info);
}
diff --git a/Kokyu/DSRT_Dispatcher_Impl.h b/Kokyu/DSRT_Dispatcher_Impl.h
index 6e16981bf6e..f0ed126dbbc 100644
--- a/Kokyu/DSRT_Dispatcher_Impl.h
+++ b/Kokyu/DSRT_Dispatcher_Impl.h
@@ -37,26 +37,24 @@ namespace Kokyu
int init (const DSRT_ConfigInfo&);
int schedule (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
int update_schedule (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
int cancel_schedule (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
private:
- DSRT_Scheduler_Impl* create_scheduler (DSRT_Sched_t sched_type);
int init_i (const DSRT_ConfigInfo&);
int schedule_i (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
int update_schedule_i (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
int cancel_schedule_i (guid_t guid,
- const QoSDescriptor&);
+ const DSRT_QoSDescriptor&);
private:
DSRT_ConfigInfo curr_config_info_;
- DSRT_Sched_t sched_type_;
DSRT_Scheduler_Impl* scheduler_impl_;
};
diff --git a/Kokyu/DSRT_Dispatcher_Impl.i b/Kokyu/DSRT_Dispatcher_Impl.i
index 10011d57c1a..96a0fbdd26c 100644
--- a/Kokyu/DSRT_Dispatcher_Impl.i
+++ b/Kokyu/DSRT_Dispatcher_Impl.i
@@ -16,21 +16,21 @@ int DSRT_Dispatcher_Impl::init (const DSRT_ConfigInfo& config_info)
ACE_INLINE
int DSRT_Dispatcher_Impl::schedule (guid_t guid,
- const QoSDescriptor& qos)
+ const DSRT_QoSDescriptor& qos)
{
return this->schedule_i (guid, qos);
}
ACE_INLINE
int DSRT_Dispatcher_Impl::update_schedule (guid_t guid,
- const QoSDescriptor& qos)
+ const DSRT_QoSDescriptor& qos)
{
return this->update_schedule_i (guid, qos);
}
ACE_INLINE
int DSRT_Dispatcher_Impl::cancel_schedule (guid_t guid,
- const QoSDescriptor& qos)
+ const DSRT_QoSDescriptor& qos)
{
return this->cancel_schedule_i (guid, qos);
}
diff --git a/Kokyu/DSRT_Schedulers.cpp b/Kokyu/DSRT_Schedulers.cpp
index 63f4360ae4d..ea320838205 100644
--- a/Kokyu/DSRT_Schedulers.cpp
+++ b/Kokyu/DSRT_Schedulers.cpp
@@ -20,10 +20,28 @@ DSRT_Scheduler_Impl::DSRT_Scheduler_Impl ()
min_prio_ (ACE_Sched_Params::priority_min (sched_policy_, sched_scope_)),
max_prio_ (ACE_Sched_Params::priority_max (sched_policy_, sched_scope_))
{
+#if defined (ACE_WIN32)
+ // Count up the number of distinct native priorities on current
+ // platform.
+ int n;
+ Priority_t current_priority = this->min_prio_;
+ for (n = 1; current_priority != this->max_; ++n)
+ {
+ current_priority =
+ ACE_Sched_Params::next_priority (this->sched_policy_,
+ current_priority);
+ }
+
+ this->prio_range_ = n-1;
+
+#else
+ this->prio_range_ = this->max_prio_ - this->min_prio_;
+#endif /* ACE_WIN32 */
+
}
int
-DSRT_Scheduler_Impl::schedule (guid_t id, const QoSDescriptor& qos)
+DSRT_Scheduler_Impl::schedule (guid_t id, const DSRT_QoSDescriptor& qos)
{
return this->schedule_i (id, qos);
}
@@ -94,8 +112,34 @@ MIF_Scheduler_Impl::init (int argc, ACE_TCHAR* argv[])
arg_shifter.consume_arg ();
}
}
+ else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-min_importance")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->min_importance_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
+ else if (ACE_OS::strcasecmp (arg, ACE_LIB_TEXT("-max_importance")) == 0)
+ {
+ arg_shifter.consume_arg ();
+
+ if (arg_shifter.is_parameter_next ())
+ {
+ const ACE_TCHAR* opt = arg_shifter.get_current ();
+ this->max_importance_ = ACE_OS::atoi (opt);
+ arg_shifter.consume_arg ();
+ }
+ }
}
+ this->importance_range_ = this->max_importance_ - this->min_importance_;
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT("MIF_Scheduler: importance_range = %d\n"),
+ this->importance_range_));
return 0;
}
@@ -106,44 +150,14 @@ MIF_Scheduler_Impl::fini (void)
}
Priority_t
-MIF_Scheduler_Impl::schedule_i (guid_t id, const QoSDescriptor& qos)
+MIF_Scheduler_Impl::schedule_i (guid_t id, const DSRT_QoSDescriptor& qos)
{
ACE_UNUSED_ARG ((id));
ACE_DEBUG ((LM_DEBUG, "(%t) request for MIF schedule\n"));
- switch (qos.importance_)
- {
- case VERY_LOW_IMPORTANCE:
- return min_prio_;
- break;
-
- case LOW_IMPORTANCE:
- return ACE_Sched_Params::next_priority
- (sched_policy_, min_prio_, sched_scope_);
- break;
-
- case MEDIUM_IMPORTANCE:
- return ACE_Sched_Params::next_priority
- (sched_policy_,
- ACE_Sched_Params::next_priority
- (sched_policy_, min_prio_, sched_scope_),
- sched_scope_);
- break;
-
- case HIGH_IMPORTANCE:
- return ACE_Sched_Params::previous_priority
- (sched_policy_, max_prio_, sched_scope_);
- break;
-
- case VERY_HIGH_IMPORTANCE:
- return max_prio_;
- break;
-
- default:
- break;
- }
+ Priority_t prio_ = qos.importance_ * this->prio_range_ / this->importance_range_;
- return min_prio_;
+ return prio_;
}
@@ -151,6 +165,10 @@ MIF_Scheduler_Impl::schedule_i (guid_t id, const QoSDescriptor& qos)
// ****************************************************************
+//could not use ACE_FACTORY_DEFINE macro here because of Kokyu namespace
+// see new Kokyu::MIF_Scheduler_Impl in _make_xx factory function
+//need to revisit later
+
void _gobble_MIF_Scheduler_Impl (void *p) { \
ACE_Service_Object *_p = ACE_static_cast (ACE_Service_Object *, p);
ACE_ASSERT (_p != 0);
diff --git a/Kokyu/DSRT_Schedulers.h b/Kokyu/DSRT_Schedulers.h
index 72856a7d479..fefaa7951e3 100644
--- a/Kokyu/DSRT_Schedulers.h
+++ b/Kokyu/DSRT_Schedulers.h
@@ -27,16 +27,17 @@ namespace Kokyu
{
public:
DSRT_Scheduler_Impl ();
- int schedule (guid_t, const QoSDescriptor&);
+ int schedule (guid_t, const DSRT_QoSDescriptor&);
private:
- virtual Priority_t schedule_i (guid_t, const QoSDescriptor&) = 0;
+ virtual Priority_t schedule_i (guid_t, const DSRT_QoSDescriptor&) = 0;
protected:
ACE_Sched_Params::Policy sched_policy_;
int sched_scope_;
Priority_t min_prio_;
Priority_t max_prio_;
+ Priority_t prio_range_;
};
class MIF_Scheduler_Impl : public DSRT_Scheduler_Impl
@@ -48,7 +49,12 @@ namespace Kokyu
static void init_svcs (void);
private:
- virtual Priority_t schedule_i (guid_t, const QoSDescriptor&);
+ virtual Priority_t schedule_i (guid_t, const DSRT_QoSDescriptor&);
+
+ private:
+ short min_importance_;
+ short max_importance_;
+ short importance_range_;
};
}
diff --git a/Kokyu/Kokyu.cpp b/Kokyu/Kokyu.cpp
index 3ac6789eea9..55da0b326ec 100644
--- a/Kokyu/Kokyu.cpp
+++ b/Kokyu/Kokyu.cpp
@@ -56,19 +56,19 @@ DSRT_Dispatcher::implementation (DSRT_Dispatcher_Impl* impl)
}
int
-DSRT_Dispatcher::schedule (guid_t guid, const QoSDescriptor& qos)
+DSRT_Dispatcher::schedule (guid_t guid, const DSRT_QoSDescriptor& qos)
{
return dispatcher_impl_->schedule (guid, qos);
}
ACE_INLINE int
-DSRT_Dispatcher::update_schedule (guid_t guid, const QoSDescriptor& qos)
+DSRT_Dispatcher::update_schedule (guid_t guid, const DSRT_QoSDescriptor& qos)
{
return dispatcher_impl_->update_schedule (guid, qos);
}
ACE_INLINE int
-DSRT_Dispatcher::cancel_schedule (guid_t guid, const QoSDescriptor& qos)
+DSRT_Dispatcher::cancel_schedule (guid_t guid, const DSRT_QoSDescriptor& qos)
{
return dispatcher_impl_->cancel_schedule (guid, qos);
}
diff --git a/Kokyu/Kokyu.h b/Kokyu/Kokyu.h
index 72635645f48..9802c6a1dd5 100644
--- a/Kokyu/Kokyu.h
+++ b/Kokyu/Kokyu.h
@@ -55,7 +55,7 @@ namespace Kokyu
enum Importance_t
// Defines the importance of the operation,
- // which can be used by the Scheduler as a
+ // which can be used by the RtecScheduler as a
// "tie-breaker" when other scheduling
// parameters are equal.
{
@@ -87,6 +87,11 @@ namespace Kokyu
Importance_t importance_;
};
+ struct DSRT_QoSDescriptor
+ {
+ short importance_;
+ };
+
class Kokyu_Export Dispatch_Command
{
public:
@@ -111,21 +116,17 @@ namespace Kokyu
class Dispatcher_Impl;
class DSRT_Dispatcher_Impl;
- enum DSRT_Sched_t {SCHED_MIF, SCHED_EDF};
-
struct DSRT_ConfigInfo
{
- ACE_Sched_Params::Policy sched_policy_;
- int sched_scope_;
};
typedef int guid_t;
class Kokyu_Export DSRT_Dispatcher
{
public:
- int schedule (guid_t guid, const QoSDescriptor&);
- int update_schedule (guid_t guid, const QoSDescriptor&);
- int cancel_schedule (guid_t guid, const QoSDescriptor&);
+ int schedule (guid_t guid, const DSRT_QoSDescriptor&);
+ int update_schedule (guid_t guid, const DSRT_QoSDescriptor&);
+ int cancel_schedule (guid_t guid, const DSRT_QoSDescriptor&);
void implementation (DSRT_Dispatcher_Impl*);
private:
diff --git a/Kokyu/tests/DSRT_MIF/MIF.cpp b/Kokyu/tests/DSRT_MIF/MIF.cpp
index e47032873f4..b701fa1338a 100644
--- a/Kokyu/tests/DSRT_MIF/MIF.cpp
+++ b/Kokyu/tests/DSRT_MIF/MIF.cpp
@@ -12,7 +12,7 @@ public:
MyTask (ACE_Barrier& barrier,
Kokyu::DSRT_Dispatcher* dispatcher,
- Kokyu::QoSDescriptor& qos)
+ Kokyu::DSRT_QoSDescriptor& qos)
:barrier_ (barrier),
dispatcher_ (dispatcher),
qos_ (qos)
@@ -49,7 +49,8 @@ public:
private:
ACE_Barrier& barrier_;
Kokyu::DSRT_Dispatcher* dispatcher_;
- Kokyu::QoSDescriptor& qos_;
+ Kokyu::DSRT_QoSDescriptor& qos_;
+
};
int main (int,char**)
@@ -68,11 +69,11 @@ int main (int,char**)
ACE_ASSERT (disp.get () != 0);
- Kokyu::QoSDescriptor qos1, qos2, qos3;
+ Kokyu::DSRT_QoSDescriptor qos1, qos2, qos3;
- qos1.importance_ = Kokyu::LOW_IMPORTANCE;
- qos2.importance_ = Kokyu::HIGH_IMPORTANCE;
- qos3.importance_ = Kokyu::VERY_HIGH_IMPORTANCE;
+ qos1.importance_ = 1;
+ qos2.importance_ = 2;
+ qos3.importance_ = 3;
MyTask mytask1 (barrier, disp.get (), qos1);
MyTask mytask2 (barrier, disp.get (), qos2);
diff --git a/Kokyu/tests/DSRT_MIF/svc.conf b/Kokyu/tests/DSRT_MIF/svc.conf
index fe4d89d5d3a..247c85945d9 100644
--- a/Kokyu/tests/DSRT_MIF/svc.conf
+++ b/Kokyu/tests/DSRT_MIF/svc.conf
@@ -1,2 +1,4 @@
#
-dynamic DSRT_Scheduler_Impl Service_Object * Kokyu:_make_MIF_Scheduler_Impl() "-sched_scope thread -sched_policy fifo" \ No newline at end of file
+dynamic DSRT_Scheduler_Impl Service_Object *
+Kokyu:_make_MIF_Scheduler_Impl()
+"-sched_scope thread -sched_policy fifo -min_importance 0 -max_importance 10" \ No newline at end of file
diff --git a/Kokyu/tests/DSRT_MIF/svc.conf.xml b/Kokyu/tests/DSRT_MIF/svc.conf.xml
index 14f783f0f35..aef4b3ea0a9 100644
--- a/Kokyu/tests/DSRT_MIF/svc.conf.xml
+++ b/Kokyu/tests/DSRT_MIF/svc.conf.xml
@@ -3,6 +3,6 @@
<ACE_Svc_Conf>
<!-- -->
<dynamic id="DSRT_Scheduler_Impl" type="Service_Object">
- <initializer path="Kokyu" init="_make_MIF_Scheduler_Impl" params="-sched_scope thread -sched_policy fifo"/>
+ <initializer path="Kokyu" init="_make_MIF_Scheduler_Impl" params="-sched_scope thread -sched_policy fifo -min_importance 0 -max_importance 10"/>
</dynamic>
</ACE_Svc_Conf>