summaryrefslogtreecommitdiff
path: root/protocols/ace/RMCast/Retransmit.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/ace/RMCast/Retransmit.h')
-rw-r--r--protocols/ace/RMCast/Retransmit.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/protocols/ace/RMCast/Retransmit.h b/protocols/ace/RMCast/Retransmit.h
new file mode 100644
index 00000000000..6348ba66009
--- /dev/null
+++ b/protocols/ace/RMCast/Retransmit.h
@@ -0,0 +1,97 @@
+// file : ace/RMCast/Retransmit.h
+// author : Boris Kolpackov <boris@kolpackov.net>
+// cvs-id : $Id$
+
+#ifndef ACE_RMCAST_RETRANSMIT_H
+#define ACE_RMCAST_RETRANSMIT_H
+
+#include <ace/Hash_Map_Manager.h>
+
+#include <ace/Thread_Manager.h>
+
+#include <ace/RMCast/Stack.h>
+#include <ace/RMCast/Protocol.h>
+#include <ace/RMCast/Bits.h>
+
+namespace ACE_RMCast
+{
+ class Retransmit : public Element
+ {
+ public:
+ Retransmit ();
+
+ virtual void
+ out_start (Out_Element* out);
+
+ virtual void
+ out_stop ();
+
+ public:
+ virtual void
+ send (Message_ptr m);
+
+ virtual void
+ recv (Message_ptr m);
+
+ private:
+ struct Descr
+ {
+ // Shouldn't be available but ACE_Hash_Map needs it.
+ //
+ Descr ()
+ : data_ (), count_ (0)
+ {
+ }
+
+ Descr (Data_ptr d)
+ : data_ (d), count_ (0)
+ {
+ }
+
+ unsigned long
+ inc ()
+ {
+ return ++count_;
+ }
+
+ void
+ reset ()
+ {
+ count_ = 0;
+ }
+
+ // It would be logical to return data_ptr but ACE ref_auto_ptr
+ // hasn't learned how to convert between pointers yet.
+ //
+ Profile_ptr
+ data () const
+ {
+ return Profile_ptr (new Data (*data_));
+ }
+
+ private:
+ Data_ptr data_;
+ unsigned long count_;
+ };
+
+ typedef
+ ACE_Hash_Map_Manager<u64, Descr, ACE_Null_Mutex>
+ Queue;
+
+ private:
+ void
+ track ();
+
+ static ACE_THR_FUNC_RETURN
+ track_thunk (void* obj);
+
+ private:
+ Queue queue_;
+ Mutex mutex_;
+
+ ACE_Thread_Manager tracker_mgr_;
+ };
+}
+
+
+#endif // ACE_RMCAST_RETRANSMIT_H