summaryrefslogtreecommitdiff
path: root/Kokyu/DSRT_Sched_Queue_T.cpp
diff options
context:
space:
mode:
authorvenkita <venkita@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-07-25 23:41:55 +0000
committervenkita <venkita@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-07-25 23:41:55 +0000
commitd2c9289b2dc52324413eab4363e7f2cbef1f07ee (patch)
tree0c2d30977f52d7860362ff76b28ecc4d9a158421 /Kokyu/DSRT_Sched_Queue_T.cpp
parenta9886196297b83689fa1ad00642af7d2a5c5fa72 (diff)
downloadATCD-d2c9289b2dc52324413eab4363e7f2cbef1f07ee.tar.gz
ChangeLogTag: Fri Jul 25 17:41:08 2003 Venkita Subramonian <venkita@cse.wustl.edu>
Diffstat (limited to 'Kokyu/DSRT_Sched_Queue_T.cpp')
-rw-r--r--Kokyu/DSRT_Sched_Queue_T.cpp218
1 files changed, 218 insertions, 0 deletions
diff --git a/Kokyu/DSRT_Sched_Queue_T.cpp b/Kokyu/DSRT_Sched_Queue_T.cpp
new file mode 100644
index 00000000000..bd63267fc1d
--- /dev/null
+++ b/Kokyu/DSRT_Sched_Queue_T.cpp
@@ -0,0 +1,218 @@
+/* -*- C++ -*- */
+/**
+ * @file DSRT_Sched_Queue_T.cpp
+ *
+ * $Id$
+ *
+ * @author Venkita Subramonian (venkita@cs.wustl.edu)
+ *
+ */
+#ifndef DSRT_SCHED_QUEUE_T_CPP
+#define DSRT_SCHED_QUEUE_T_CPP
+
+#include "DSRT_Sched_Queue_T.h"
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#if !defined (__ACE_INLINE__)
+//#include "DSRT_Sched_Queue_T.i"
+#endif /* __ACE_INLINE__ */
+
+ACE_RCSID(Kokyu,
+ DSRT_Sched_Queue_T,
+ "$Id$")
+
+namespace Kokyu
+{
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+u_long
+Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+Guid_Hash::operator () (const Guid_t& id)
+{
+ typename DSRT_Scheduler_Traits::Guid_Hash guid_hash;
+ return guid_hash(id);
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+int Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+current_size ()
+{
+ return dispatch_items_prio_queue_.current_size ();
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+int Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+most_eligible (DSRT_Dispatch_Item_var<DSRT_Scheduler_Traits>& item)
+{
+ if (dispatch_items_prio_queue_.current_size () == 0)
+ return -1;
+
+ PRIO_QUEUE_ITERATOR start = dispatch_items_prio_queue_.begin ();
+ PRIO_QUEUE_ENTRY &ent = (*start);
+ item = ent.item ();
+ return 0;
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+int Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+find (Guid_t guid,
+ DSRT_Dispatch_Item_var<DSRT_Scheduler_Traits>& found_item)
+{
+ ACE_GUARD_RETURN (ACE_LOCK, mon, lock_, -1);
+ RB_Tree_Dispatch_Item_Node* rb_tree_node;
+
+ if (dispatch_items_hash_map_.find(guid, rb_tree_node) == -1)
+ {
+ return -1;
+ }
+ else
+ {
+ found_item = rb_tree_node->item ();
+ return 0;
+ }
+
+ return 0;
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+int Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+insert(Guid_t guid, const DSRT_QoSDescriptor_t& qos)
+{
+ DSRT_Dispatch_Item<DSRT_Scheduler_Traits>* item;
+ ACE_hthread_t thr_handle;
+ ACE_Thread::self (thr_handle);
+
+ ACE_NEW_RETURN (item,
+ DSRT_Dispatch_Item<DSRT_Scheduler_Traits> (guid, qos),
+ -1);
+ item->thread_handle (thr_handle);
+ item->insertion_time (ACE_OS::gettimeofday ());
+ DSRT_Dispatch_Item_var<DSRT_Scheduler_Traits> item_var(item);
+
+ ACE_GUARD_RETURN (ACE_LOCK, mon, lock_, -1);
+
+ RB_Tree_Dispatch_Item_Node* rb_tree_node;
+ if (dispatch_items_hash_map_.find(guid, rb_tree_node) == -1)
+ {
+ if (dispatch_items_prio_queue_.bind (item_var,
+ item_var,
+ rb_tree_node) == 0)
+ {
+ if (dispatch_items_hash_map_.bind (guid, rb_tree_node) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%t) insert item done\n"));
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents Begin===>\n"));
+ dispatch_items_hash_map_.dump ();
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents End=====>\n"));
+ return 0;
+ }
+ }
+ }
+ else
+ {
+ dispatch_items_hash_map_.unbind (guid);
+ dispatch_items_prio_queue_.unbind (rb_tree_node);
+ if (dispatch_items_prio_queue_.bind (item_var,
+ item_var,
+ rb_tree_node) == 0)
+ {
+ if (dispatch_items_hash_map_.bind (guid, rb_tree_node) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%t) insert item done\n"));
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents Begin===>\n"));
+ dispatch_items_hash_map_.dump ();
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents End===>\n"));
+ return 0;
+ }
+ }
+ }
+
+ return -1;
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator, class ACE_LOCK>
+int Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator, ACE_LOCK>::
+remove(Guid_t guid)
+{
+ ACE_GUARD_RETURN (ACE_LOCK, mon, lock_, -1);
+ RB_Tree_Dispatch_Item_Node* rb_tree_node;
+
+ if (dispatch_items_hash_map_.find(guid, rb_tree_node) == 0)
+ {
+ dispatch_items_hash_map_.unbind (guid);
+ dispatch_items_prio_queue_.unbind (rb_tree_node);
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents Begin===>\n"));
+ dispatch_items_hash_map_.dump ();
+ ACE_DEBUG ((LM_DEBUG,
+ "<===Hash Table contents End===>\n"));
+ return 0;
+ }
+
+ return -1;
+}
+
+template <class DSRT_Scheduler_Traits,
+ class More_Eligible_Comparator,
+ class ACE_LOCK>
+void Sched_Ready_Queue<DSRT_Scheduler_Traits,
+ More_Eligible_Comparator,
+ ACE_LOCK>::
+dump()
+{
+ ACE_GUARD (ACE_LOCK, mon, lock_);
+ if (dispatch_items_prio_queue_.current_size ())
+ {
+ PRIO_QUEUE_ITERATOR end_iter = dispatch_items_prio_queue_.end ();
+ PRIO_QUEUE_ITERATOR start;
+
+ start = dispatch_items_prio_queue_.begin ();
+ while( start != end_iter )
+ {
+ PRIO_QUEUE_ENTRY &ent = (*start);
+ DSRT_Dispatch_Item_var<DSRT_Scheduler_Traits>
+ item_var = ent.item ();
+ /*
+ int guid;
+ ACE_OS::memcpy (&guid,
+ item_var->guid ()->get_buffer (),
+ item_var->guid ()->length ());
+
+ ACE_DEBUG ((LM_DEBUG, "guid %d\n", guid));
+ */
+ ++start;
+ }
+ }
+}
+
+}
+
+#endif /* DSRT_SCHED_QUEUE_T_CPP */