summaryrefslogtreecommitdiff
path: root/protocols/ace
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-10-11 00:57:08 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-10-11 00:57:08 +0000
commit6345981a237967e0ba2849ded171c85af0c91eaa (patch)
treee4147344f26f8064491ad6f2d5eb847f32307e10 /protocols/ace
parent6ef8157e014a7204e1d2439fdfa28330a35bc579 (diff)
downloadATCD-6345981a237967e0ba2849ded171c85af0c91eaa.tar.gz
ChangeLogTag:Tue Oct 10 17:25:32 2000 Carlos O'Ryan <coryan@uci.edu>
Diffstat (limited to 'protocols/ace')
-rw-r--r--protocols/ace/RMCast/Makefile799
-rw-r--r--protocols/ace/RMCast/RMCast.h44
-rw-r--r--protocols/ace/RMCast/RMCast_Ack_Worker.cpp25
-rw-r--r--protocols/ace/RMCast/RMCast_Ack_Worker.h47
-rw-r--r--protocols/ace/RMCast/RMCast_Ack_Worker.i12
-rw-r--r--protocols/ace/RMCast/RMCast_Control_Splitter.cpp37
-rw-r--r--protocols/ace/RMCast/RMCast_Control_Splitter.h49
-rw-r--r--protocols/ace/RMCast/RMCast_Control_Splitter.i21
-rw-r--r--protocols/ace/RMCast/RMCast_Fork.cpp112
-rw-r--r--protocols/ace/RMCast/RMCast_Fork.h55
-rw-r--r--protocols/ace/RMCast/RMCast_Fork.i21
-rw-r--r--protocols/ace/RMCast/RMCast_Fragment.cpp2
-rw-r--r--protocols/ace/RMCast/RMCast_IO_UDP.cpp55
-rw-r--r--protocols/ace/RMCast/RMCast_Membership.cpp155
-rw-r--r--protocols/ace/RMCast/RMCast_Membership.h42
-rw-r--r--protocols/ace/RMCast/RMCast_Module.cpp4
-rw-r--r--protocols/ace/RMCast/RMCast_Reassembly.cpp75
-rw-r--r--protocols/ace/RMCast/RMCast_Reassembly.h6
-rw-r--r--protocols/ace/RMCast/RMCast_Receiver_Module.cpp157
-rw-r--r--protocols/ace/RMCast/RMCast_Receiver_Module.h108
-rw-r--r--protocols/ace/RMCast/RMCast_Receiver_Module.i7
-rw-r--r--protocols/ace/RMCast/RMCast_Reliable_Factory.cpp12
-rw-r--r--protocols/ace/RMCast/RMCast_Reordering.cpp47
-rw-r--r--protocols/ace/RMCast/RMCast_Reordering.h34
-rw-r--r--protocols/ace/RMCast/RMCast_Resend_Handler.cpp2
-rw-r--r--protocols/ace/RMCast/RMCast_Resend_Worker.cpp31
-rw-r--r--protocols/ace/RMCast/RMCast_Resend_Worker.h49
-rw-r--r--protocols/ace/RMCast/RMCast_Resend_Worker.i12
-rw-r--r--protocols/ace/RMCast/RMCast_Retransmission.cpp85
-rw-r--r--protocols/ace/RMCast/RMCast_Retransmission.h48
-rw-r--r--protocols/ace/RMCast/RMCast_Sequencer.cpp25
-rw-r--r--protocols/ace/RMCast/RMCast_Sequencer.h54
-rw-r--r--protocols/ace/RMCast/RMCast_Sequencer.i7
-rw-r--r--protocols/ace/RMCast/RMCast_UDP_Proxy.cpp22
-rw-r--r--protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.cpp29
-rw-r--r--protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.h15
-rw-r--r--protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.i12
37 files changed, 1913 insertions, 404 deletions
diff --git a/protocols/ace/RMCast/Makefile b/protocols/ace/RMCast/Makefile
index fb270696c5d..2523110be5e 100644
--- a/protocols/ace/RMCast/Makefile
+++ b/protocols/ace/RMCast/Makefile
@@ -18,11 +18,15 @@ FILES= \
RMCast_Proxy \
RMCast_Membership \
RMCast_Retransmission \
+ RMCast_Resend_Worker \
+ RMCast_Ack_Worker \
RMCast_Reordering \
RMCast_Reliable_Factory \
- RMcast_Singleton_Factory \
- RMCast_Control_Splitter \
- RMcast_Resend_Handler \
+ RMCast_Singleton_Factory \
+ RMCast_Resend_Handler \
+ RMCast_Receiver_Module \
+ RMCast_Sequencer \
+ RMCast_Fork \
\
RMCast_IO_UDP \
RMCast_UDP_Event_Handler \
@@ -62,6 +66,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -87,6 +92,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -113,6 +119,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -138,6 +145,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -225,6 +233,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -373,6 +382,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/Task.h \
$(ACE_ROOT)/ace/Service_Object.h \
$(ACE_ROOT)/ace/Shared_Object.h \
@@ -520,6 +530,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -545,6 +556,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -628,6 +640,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -711,20 +724,73 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Memory_Pool.i \
$(ACE_ROOT)/ace/RB_Tree.cpp \
RMCast_Retransmission.i RMCast_Proxy.h RMCast_Proxy.i \
+ RMCast_Ack_Worker.h RMCast_Ack_Worker.i RMCast_Resend_Worker.h \
+ RMCast_Resend_Worker.i \
$(ACE_ROOT)/ace/Message_Block.h \
$(ACE_ROOT)/ace/Message_Block.i \
$(ACE_ROOT)/ace/Message_Block_T.h \
$(ACE_ROOT)/ace/Message_Block_T.i \
$(ACE_ROOT)/ace/Message_Block_T.cpp
-.obj/RMCast_Reordering.o .obj/RMCast_Reordering.so .shobj/RMCast_Reordering.o .shobj/RMCast_Reordering.so: RMCast_Reordering.cpp RMCast_Reordering.h \
+.obj/RMCast_Resend_Worker.o .obj/RMCast_Resend_Worker.so .shobj/RMCast_Resend_Worker.o .shobj/RMCast_Resend_Worker.so: RMCast_Resend_Worker.cpp \
+ RMCast_Resend_Worker.h \
$(ACE_ROOT)/ace/pre.h \
- RMCast_Module.h RMCast.h \
+ RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Copy_On_Write.h RMCast_Worker.h \
+ RMCast_Worker.i RMCast_Worker.cpp \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.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_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ RMCast_Copy_On_Write.i RMCast_Copy_On_Write.cpp \
+ RMCast_Resend_Worker.i RMCast_Module.h RMCast_Module.i
+
+.obj/RMCast_Ack_Worker.o .obj/RMCast_Ack_Worker.so .shobj/RMCast_Ack_Worker.o .shobj/RMCast_Ack_Worker.so: RMCast_Ack_Worker.cpp RMCast_Ack_Worker.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Retransmission.h RMCast_Module.h RMCast.h \
$(ACE_ROOT)/ace/OS.h \
$(ACE_ROOT)/ace/post.h \
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -807,14 +873,14 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/SV_Semaphore_Complex.i \
$(ACE_ROOT)/ace/Memory_Pool.i \
$(ACE_ROOT)/ace/RB_Tree.cpp \
- RMCast_Reordering.i RMCast_Proxy.h RMCast_Proxy.i \
+ RMCast_Retransmission.i RMCast_Ack_Worker.i \
$(ACE_ROOT)/ace/Message_Block.h \
$(ACE_ROOT)/ace/Message_Block.i \
$(ACE_ROOT)/ace/Message_Block_T.h \
$(ACE_ROOT)/ace/Message_Block_T.i \
$(ACE_ROOT)/ace/Message_Block_T.cpp
-.obj/RMCast_IO_UDP.o .obj/RMCast_IO_UDP.so .shobj/RMCast_IO_UDP.o .shobj/RMCast_IO_UDP.so: RMCast_IO_UDP.cpp RMCast_IO_UDP.h \
+.obj/RMCast_Reordering.o .obj/RMCast_Reordering.so .shobj/RMCast_Reordering.o .shobj/RMCast_Reordering.so: RMCast_Reordering.cpp RMCast_Reordering.h \
$(ACE_ROOT)/ace/pre.h \
RMCast_Module.h RMCast.h \
$(ACE_ROOT)/ace/OS.h \
@@ -822,6 +888,221 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module.i \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(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_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.i \
+ $(ACE_ROOT)/ace/Based_Pointer_T.cpp \
+ $(ACE_ROOT)/ace/Based_Pointer_Repository.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(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/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(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/Memory_Pool.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ RMCast_Reordering.i RMCast_Proxy.h RMCast_Proxy.i \
+ $(ACE_ROOT)/ace/Message_Block.h \
+ $(ACE_ROOT)/ace/Message_Block.i \
+ $(ACE_ROOT)/ace/Message_Block_T.h \
+ $(ACE_ROOT)/ace/Message_Block_T.i \
+ $(ACE_ROOT)/ace/Message_Block_T.cpp
+
+.obj/RMCast_Reliable_Factory.o .obj/RMCast_Reliable_Factory.so .shobj/RMCast_Reliable_Factory.o .shobj/RMCast_Reliable_Factory.so: RMCast_Reliable_Factory.cpp \
+ RMCast_Reliable_Factory.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module_Factory.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module_Factory.i \
+ RMCast_Reliable_Factory.i RMCast_Receiver_Module.h RMCast_Module.h \
+ RMCast_Module.i RMCast_Receiver_Module.i RMCast_Reassembly.h \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(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_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(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/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.i \
+ $(ACE_ROOT)/ace/Based_Pointer_T.cpp \
+ $(ACE_ROOT)/ace/Based_Pointer_Repository.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(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/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(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/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/SString.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/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ RMCast_Reassembly.i RMCast_Reordering.h \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ RMCast_Reordering.i
+
+.obj/RMCast_Singleton_Factory.o .obj/RMCast_Singleton_Factory.so .shobj/RMCast_Singleton_Factory.o .shobj/RMCast_Singleton_Factory.so: RMCast_Singleton_Factory.cpp \
+ RMCast_Singleton_Factory.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module_Factory.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -837,15 +1118,239 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Basic_Types.i \
$(ACE_ROOT)/ace/Trace.h \
$(ACE_ROOT)/ace/OS.i \
- RMCast_Export.h RMCast.i RMCast_Module.i RMCast_UDP_Event_Handler.h \
+ RMCast_Export.h RMCast.i RMCast_Module_Factory.i \
+ RMCast_Singleton_Factory.i
+
+.obj/RMCast_Resend_Handler.o .obj/RMCast_Resend_Handler.so .shobj/RMCast_Resend_Handler.o .shobj/RMCast_Resend_Handler.so: RMCast_Resend_Handler.cpp \
+ RMCast_Resend_Handler.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Export.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Event_Handler.i \
+ RMCast_Resend_Handler.i RMCast_Retransmission.h RMCast_Module.h \
+ RMCast.h RMCast.i RMCast_Module.i RMCast_Copy_On_Write.h \
+ RMCast_Worker.h RMCast_Worker.i RMCast_Worker.cpp \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ RMCast_Copy_On_Write.i RMCast_Copy_On_Write.cpp \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.i \
+ $(ACE_ROOT)/ace/Based_Pointer_T.cpp \
+ $(ACE_ROOT)/ace/Based_Pointer_Repository.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(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/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Signal.h \
+ $(ACE_ROOT)/ace/Containers.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(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/Memory_Pool.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ RMCast_Retransmission.i
+
+.obj/RMCast_Receiver_Module.o .obj/RMCast_Receiver_Module.so .shobj/RMCast_Receiver_Module.o .shobj/RMCast_Receiver_Module.so: RMCast_Receiver_Module.cpp \
+ RMCast_Receiver_Module.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module.i RMCast_Receiver_Module.i \
+ RMCast_Proxy.h RMCast_Proxy.i \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i
+
+.obj/RMCast_Sequencer.o .obj/RMCast_Sequencer.so .shobj/RMCast_Sequencer.o .shobj/RMCast_Sequencer.so: RMCast_Sequencer.cpp RMCast_Sequencer.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module.i \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(ACE_ROOT)/ace/ACE.h \
$(ACE_ROOT)/ace/ACE.i \
+ $(ACE_ROOT)/ace/Synch.i \
+ $(ACE_ROOT)/ace/Synch_T.h \
+ $(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/Event_Handler.i \
- RMCast_UDP_Event_Handler.i \
+ $(ACE_ROOT)/ace/Synch_T.i \
+ $(ACE_ROOT)/ace/Thread.h \
+ $(ACE_ROOT)/ace/Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ RMCast_Sequencer.i
+
+.obj/RMCast_Fork.o .obj/RMCast_Fork.so .shobj/RMCast_Fork.o .shobj/RMCast_Fork.so: RMCast_Fork.cpp RMCast_Fork.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module.i RMCast_Fork.i
+
+.obj/RMCast_IO_UDP.o .obj/RMCast_IO_UDP.so .shobj/RMCast_IO_UDP.o .shobj/RMCast_IO_UDP.so: RMCast_IO_UDP.cpp RMCast_IO_UDP.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Module.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module.i \
$(ACE_ROOT)/ace/SOCK_Dgram_Mcast.h \
$(ACE_ROOT)/ace/SOCK_Dgram.h \
$(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.i \
$(ACE_ROOT)/ace/Addr.h \
$(ACE_ROOT)/ace/Addr.i \
$(ACE_ROOT)/ace/IPC_SAP.h \
@@ -871,6 +1376,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Synch.h \
$(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_Adapter.h \
@@ -951,6 +1458,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/Event_Handler.h \
$(ACE_ROOT)/ace/ACE.h \
$(ACE_ROOT)/ace/OS.h \
@@ -1075,6 +1583,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/ACE_export.h \
$(ACE_ROOT)/ace/svc_export.h \
$(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
$(ACE_ROOT)/ace/OS_Dirent.h \
$(ACE_ROOT)/ace/OS_Export.h \
$(ACE_ROOT)/ace/OS_Dirent.inl \
@@ -1097,10 +1606,7 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Addr.h \
$(ACE_ROOT)/ace/Addr.i \
$(ACE_ROOT)/ace/INET_Addr.i \
- RMCast_UDP_Proxy.i RMCast_IO_UDP.h RMCast_UDP_Event_Handler.h \
- $(ACE_ROOT)/ace/Event_Handler.h \
- $(ACE_ROOT)/ace/Event_Handler.i \
- RMCast_UDP_Event_Handler.i \
+ RMCast_UDP_Proxy.i RMCast_IO_UDP.h \
$(ACE_ROOT)/ace/SOCK_Dgram_Mcast.h \
$(ACE_ROOT)/ace/SOCK_Dgram.h \
$(ACE_ROOT)/ace/SOCK.h \
@@ -1125,6 +1631,8 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Synch.h \
$(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_Adapter.h \
@@ -1196,4 +1704,269 @@ include $(ACE_ROOT)/include/makeinclude/rules.local.GNU
$(ACE_ROOT)/ace/Message_Block_T.i \
$(ACE_ROOT)/ace/Message_Block_T.cpp
+.obj/RMCast_UDP_Reliable_Receiver.o .obj/RMCast_UDP_Reliable_Receiver.so .shobj/RMCast_UDP_Reliable_Receiver.o .shobj/RMCast_UDP_Reliable_Receiver.so: RMCast_UDP_Reliable_Receiver.cpp \
+ RMCast_UDP_Reliable_Receiver.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Singleton_Factory.h RMCast_Module_Factory.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module_Factory.i \
+ RMCast_Singleton_Factory.i RMCast_Reliable_Factory.h \
+ RMCast_Reliable_Factory.i RMCast_IO_UDP.h RMCast_Module.h \
+ RMCast_Module.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.h \
+ $(ACE_ROOT)/ace/SOCK_Dgram.h \
+ $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(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/QoS_Session.h \
+ $(ACE_ROOT)/ace/INET_Addr.h \
+ $(ACE_ROOT)/ace/INET_Addr.i \
+ $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(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_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(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/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.i \
+ $(ACE_ROOT)/ace/Based_Pointer_T.cpp \
+ $(ACE_ROOT)/ace/Based_Pointer_Repository.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(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/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(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/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/SString.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/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ RMCast_IO_UDP.i RMCast_UDP_Reliable_Receiver.i \
+ RMCast_UDP_Event_Handler.h RMCast_UDP_Event_Handler.i
+
+.obj/RMCast_UDP_Reliable_Sender.o .obj/RMCast_UDP_Reliable_Sender.so .shobj/RMCast_UDP_Reliable_Sender.o .shobj/RMCast_UDP_Reliable_Sender.so: RMCast_UDP_Reliable_Sender.cpp \
+ RMCast_UDP_Reliable_Sender.h \
+ $(ACE_ROOT)/ace/pre.h \
+ RMCast_Singleton_Factory.h RMCast_Module_Factory.h RMCast.h \
+ $(ACE_ROOT)/ace/OS.h \
+ $(ACE_ROOT)/ace/post.h \
+ $(ACE_ROOT)/ace/ACE_export.h \
+ $(ACE_ROOT)/ace/svc_export.h \
+ $(ACE_ROOT)/ace/ace_wchar.h \
+ $(ACE_ROOT)/ace/ace_wchar.inl \
+ $(ACE_ROOT)/ace/OS_Dirent.h \
+ $(ACE_ROOT)/ace/OS_Export.h \
+ $(ACE_ROOT)/ace/OS_Dirent.inl \
+ $(ACE_ROOT)/ace/OS_String.h \
+ $(ACE_ROOT)/ace/OS_String.inl \
+ $(ACE_ROOT)/ace/OS_Memory.h \
+ $(ACE_ROOT)/ace/OS_Memory.inl \
+ $(ACE_ROOT)/ace/OS_TLI.h \
+ $(ACE_ROOT)/ace/OS_TLI.inl \
+ $(ACE_ROOT)/ace/Min_Max.h \
+ $(ACE_ROOT)/ace/streams.h \
+ $(ACE_ROOT)/ace/Basic_Types.h \
+ $(ACE_ROOT)/ace/Basic_Types.i \
+ $(ACE_ROOT)/ace/Trace.h \
+ $(ACE_ROOT)/ace/OS.i \
+ RMCast_Export.h RMCast.i RMCast_Module_Factory.i \
+ RMCast_Singleton_Factory.i RMCast_IO_UDP.h RMCast_Module.h \
+ RMCast_Module.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.h \
+ $(ACE_ROOT)/ace/SOCK_Dgram.h \
+ $(ACE_ROOT)/ace/SOCK.h \
+ $(ACE_ROOT)/ace/ACE.h \
+ $(ACE_ROOT)/ace/ACE.i \
+ $(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/QoS_Session.h \
+ $(ACE_ROOT)/ace/INET_Addr.h \
+ $(ACE_ROOT)/ace/INET_Addr.i \
+ $(ACE_ROOT)/ace/SOCK.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram.i \
+ $(ACE_ROOT)/ace/SOCK_Dgram_Mcast.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager.h \
+ $(ACE_ROOT)/ace/Functor.h \
+ $(ACE_ROOT)/ace/Functor.i \
+ $(ACE_ROOT)/ace/Functor_T.h \
+ $(ACE_ROOT)/ace/Functor_T.i \
+ $(ACE_ROOT)/ace/Functor_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.h \
+ $(ACE_ROOT)/ace/Log_Msg.h \
+ $(ACE_ROOT)/ace/Log_Record.h \
+ $(ACE_ROOT)/ace/Log_Priority.h \
+ $(ACE_ROOT)/ace/Log_Record.i \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.i \
+ $(ACE_ROOT)/ace/Synch.h \
+ $(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_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.h \
+ $(ACE_ROOT)/ace/Base_Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread_Adapter.inl \
+ $(ACE_ROOT)/ace/Thread.i \
+ $(ACE_ROOT)/ace/Atomic_Op.i \
+ $(ACE_ROOT)/ace/Synch_T.cpp \
+ $(ACE_ROOT)/ace/Hash_Map_Manager_T.cpp \
+ $(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/Malloc_Base.h \
+ $(ACE_ROOT)/ace/Containers.i \
+ $(ACE_ROOT)/ace/Containers_T.h \
+ $(ACE_ROOT)/ace/Containers_T.i \
+ $(ACE_ROOT)/ace/Containers_T.cpp \
+ $(ACE_ROOT)/ace/Malloc.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.h \
+ $(ACE_ROOT)/ace/Based_Pointer_T.i \
+ $(ACE_ROOT)/ace/Based_Pointer_T.cpp \
+ $(ACE_ROOT)/ace/Based_Pointer_Repository.h \
+ $(ACE_ROOT)/ace/Singleton.h \
+ $(ACE_ROOT)/ace/Singleton.i \
+ $(ACE_ROOT)/ace/Singleton.cpp \
+ $(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/Managed_Object.cpp \
+ $(ACE_ROOT)/ace/Malloc.i \
+ $(ACE_ROOT)/ace/Malloc_T.h \
+ $(ACE_ROOT)/ace/Free_List.h \
+ $(ACE_ROOT)/ace/Free_List.i \
+ $(ACE_ROOT)/ace/Free_List.cpp \
+ $(ACE_ROOT)/ace/Malloc_T.i \
+ $(ACE_ROOT)/ace/Malloc_T.cpp \
+ $(ACE_ROOT)/ace/Memory_Pool.h \
+ $(ACE_ROOT)/ace/Mem_Map.h \
+ $(ACE_ROOT)/ace/Mem_Map.i \
+ $(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/Memory_Pool.i \
+ $(ACE_ROOT)/ace/Signal.i \
+ $(ACE_ROOT)/ace/SString.h \
+ $(ACE_ROOT)/ace/SString.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/Timer_Queue_T.cpp \
+ $(ACE_ROOT)/ace/Reactor.i \
+ $(ACE_ROOT)/ace/Reactor_Impl.h \
+ $(ACE_ROOT)/ace/Svc_Conf_Tokens.h \
+ RMCast_IO_UDP.i RMCast_Sequencer.h RMCast_Sequencer.i \
+ RMCast_Retransmission.h RMCast_Copy_On_Write.h RMCast_Worker.h \
+ RMCast_Worker.i RMCast_Worker.cpp RMCast_Copy_On_Write.i \
+ RMCast_Copy_On_Write.cpp \
+ $(ACE_ROOT)/ace/RB_Tree.h \
+ $(ACE_ROOT)/ace/RB_Tree.i \
+ $(ACE_ROOT)/ace/RB_Tree.cpp \
+ RMCast_Retransmission.i RMCast_Membership.h RMCast_Membership.i \
+ RMCast_Fragment.h RMCast_Fragment.i RMCast_Fork.h RMCast_Fork.i \
+ RMCast_UDP_Reliable_Sender.i RMCast_UDP_Event_Handler.h \
+ RMCast_UDP_Event_Handler.i RMCast_Resend_Handler.h \
+ RMCast_Resend_Handler.i
+
# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/protocols/ace/RMCast/RMCast.h b/protocols/ace/RMCast/RMCast.h
index 55e9b5d0368..95f44b27a54 100644
--- a/protocols/ace/RMCast/RMCast.h
+++ b/protocols/ace/RMCast/RMCast.h
@@ -58,50 +58,6 @@ public:
MT_LAST
};
- //! Simple enum used to describe the receiver state transitions
- /*!
- Receivers go through several states before they can fully accept
- messages, the following comments describe those states, as well as
- the possible transitions
- This configuration is pesimistic, any invalid message is cause
- enough to reclaim all the resources. This partially addresses
- situations where either accidentally or intentionally a sender is
- multicasting packets to the wrong group.
-
- <CODE>
- NON_EXISTENT JOINING JOINED LEAVING<BR>
- ----------------------------------------------------------------<BR>
- POLL JOINING JOINING JOINED LEAVING<BR>
- Send/Join Send/Join Send/Ack Send/Leave<BR>
- <BR>
- ACK NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
- Noop Destroy Destroy Destroy<BR>
- <BR>
- JOIN NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
- Noop Destroy Destroy Destroy<BR>
- <BR>
- LEAVE NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
- Noop Destroy Destroy Destroy<BR>
- <BR>
- ACK_JOIN JOINING JOINED JOINED LEAVING<BR>
- Send/Join Update ACT Update ACT Send/Leave<BR>
- <BR>
- ACK_LEAVE NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
- Noop Destroy Destroy Destroy<BR>
- <BR>
- SEND_DATA JOINING JOINING JOINED LEAVING<BR>
- Send/Join Send/Join Recv/Data Send/Leave<BR>
- </CODE>
- */
- enum Receiver_State
- {
- RS_NON_EXISTENT,
- RS_JOINING,
- RS_JOINED,
- RS_LEAVING
- };
-
-
//! Simle enum used to describe the state transitions for senders
/*!
State transition (and actions) for the senders.
diff --git a/protocols/ace/RMCast/RMCast_Ack_Worker.cpp b/protocols/ace/RMCast/RMCast_Ack_Worker.cpp
new file mode 100644
index 00000000000..d9843ebe93b
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Ack_Worker.cpp
@@ -0,0 +1,25 @@
+//
+// $Id$
+//
+
+#include "RMCast_Ack_Worker.h"
+#include "ace/Message_Block.h"
+
+#if !defined (__ACE_INLINE__)
+# include "RMCast_Ack_Worker.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(ace, RMCast_Ack_Worker, "$Id$")
+
+int
+ACE_RMCast_Ack_Worker::work (ACE_UINT32 const & key,
+ ACE_RMCast::Data const &item)
+{
+ if (key >= this->ack_.next_expected)
+ return 0;
+ // ACE_DEBUG ((LM_DEBUG,
+ // " Retransmission::ack - message %d erased\n",
+ // key));
+ ACE_Message_Block::release (item.payload);
+ return this->messages_->unbind_i (this->ace_mon_, key);
+}
diff --git a/protocols/ace/RMCast/RMCast_Ack_Worker.h b/protocols/ace/RMCast/RMCast_Ack_Worker.h
new file mode 100644
index 00000000000..565ef7feed8
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Ack_Worker.h
@@ -0,0 +1,47 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef ACE_RMCAST_ACK_WORKER_H
+#define ACE_RMCAST_ACK_WORKER_H
+#include "ace/pre.h"
+
+#include "RMCast_Retransmission.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/// Process an Ack message in the ACE_RMCast_Retransmission module
+/**
+ * The retransmission module uses internal iterators, thus it needs to
+ * create helper Worker classes to process some messages.
+ */
+class ACE_RMCast_Ack_Worker
+ : public ACE_RMCast_Worker<ACE_UINT32,ACE_RMCast::Data>
+{
+public:
+ ACE_RMCast_Ack_Worker (ACE_RMCast::Ack &ack,
+ ACE_RMCast_Retransmission::Messages::Write_Guard &g,
+ ACE_RMCast_Retransmission::Messages *messages);
+
+ virtual int work (ACE_UINT32 const & key,
+ ACE_RMCast::Data const &item);
+
+private:
+ ACE_RMCast_Ack_Worker (const ACE_RMCast_Ack_Worker&);
+ ACE_RMCast_Ack_Worker& operator= (const ACE_RMCast_Ack_Worker&);
+
+private:
+ ACE_RMCast::Ack &ack_;
+
+ ACE_RMCast_Retransmission::Messages::Write_Guard &ace_mon_;
+
+ ACE_RMCast_Retransmission::Messages *messages_;
+};
+
+#if defined (__ACE_INLINE__)
+#include "RMCast_Ack_Worker.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* ACE_RMCAST_ACK_WORKER_H */
diff --git a/protocols/ace/RMCast/RMCast_Ack_Worker.i b/protocols/ace/RMCast/RMCast_Ack_Worker.i
new file mode 100644
index 00000000000..54d94d21167
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Ack_Worker.i
@@ -0,0 +1,12 @@
+// $Id$
+
+ACE_INLINE
+ACE_RMCast_Ack_Worker::
+ACE_RMCast_Ack_Worker (ACE_RMCast::Ack &ack,
+ ACE_RMCast_Retransmission::Messages::Write_Guard &g,
+ ACE_RMCast_Retransmission::Messages *messages)
+ : ack_ (ack)
+ , ace_mon_ (g)
+ , messages_ (messages)
+{
+}
diff --git a/protocols/ace/RMCast/RMCast_Control_Splitter.cpp b/protocols/ace/RMCast/RMCast_Control_Splitter.cpp
deleted file mode 100644
index b06e9bfc467..00000000000
--- a/protocols/ace/RMCast/RMCast_Control_Splitter.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-// $Id$
-
-#include "RMCast_Control_Splitter.h"
-
-#if !defined (__ACE_INLINE__)
-# include "RMCast_Control_Splitter.i"
-#endif /* ! __ACE_INLINE__ */
-
-ACE_RCSID(ace, RMCast_Control_Splitter, "$Id$")
-
-ACE_RMCast_Control_Splitter::~ACE_RMCast_Control_Splitter (void)
-{
-}
-
-int
-ACE_RMCast_Control_Splitter::ack (ACE_RMCast::Ack &ack)
-{
- if (this->control_module () != 0)
- return this->control_module ()->ack (ack);
- return 0;
-}
-
-int
-ACE_RMCast_Control_Splitter::join (ACE_RMCast::Join &join)
-{
- if (this->control_module () != 0)
- return this->control_module ()->join (join);
- return 0;
-}
-
-int
-ACE_RMCast_Control_Splitter::leave (ACE_RMCast::Leave &leave)
-{
- if (this->control_module () != 0)
- return this->control_module ()->leave (leave);
- return 0;
-}
diff --git a/protocols/ace/RMCast/RMCast_Control_Splitter.h b/protocols/ace/RMCast/RMCast_Control_Splitter.h
deleted file mode 100644
index d1c0b5df3a0..00000000000
--- a/protocols/ace/RMCast/RMCast_Control_Splitter.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- C++ -*- */
-// $Id$
-
-#ifndef ACE_RMCAST_CONTROL_SPLITTER_H
-#define ACE_RMCAST_CONTROL_SPLITTER_H
-#include "ace/pre.h"
-
-#include "RMCast_Module.h"
-
-#if !defined (ACE_LACKS_PRAGMA_ONCE)
-# pragma once
-#endif /* ACE_LACKS_PRAGMA_ONCE */
-
-/// Split control and data messages different modules in the stack
-/**
- * In some instances the control messages must go a destination
- * different from the regular data flow. This class performs this
- * separation.
- */
-class ACE_RMCast_Export ACE_RMCast_Control_Splitter : public ACE_RMCast_Module
-{
-public:
- //! Constructor
- ACE_RMCast_Control_Splitter (void);
-
- //! Destructor
- virtual ~ACE_RMCast_Control_Splitter (void);
-
- /// Set the control module, all incoming control messages go to it
- void control_module (ACE_RMCast_Module *module);
-
- /// Return the current control module
- ACE_RMCast_Module *control_module (void) const;
-
- virtual int ack (ACE_RMCast::Ack &);
- virtual int join (ACE_RMCast::Join &);
- virtual int leave (ACE_RMCast::Leave &);
-
-private:
- /// The control module
- ACE_RMCast_Module *control_module_;
-};
-
-#if defined (__ACE_INLINE__)
-#include "RMCast_Control_Splitter.i"
-#endif /* __ACE_INLINE__ */
-
-#include "ace/post.h"
-#endif /* ACE_RMCAST_CONTROL_SPLITTER_H */
diff --git a/protocols/ace/RMCast/RMCast_Control_Splitter.i b/protocols/ace/RMCast/RMCast_Control_Splitter.i
deleted file mode 100644
index 7cc8205fcce..00000000000
--- a/protocols/ace/RMCast/RMCast_Control_Splitter.i
+++ /dev/null
@@ -1,21 +0,0 @@
-// $Id$
-
-ACE_INLINE
-ACE_RMCast_Control_Splitter::ACE_RMCast_Control_Splitter (void)
- : ACE_RMCast_Module ()
- , control_module_ (0)
-{
-}
-
-ACE_INLINE void
-ACE_RMCast_Control_Splitter::control_module (ACE_RMCast_Module *module)
-{
- this->control_module_ = module;
-}
-
-
-ACE_INLINE ACE_RMCast_Module *
-ACE_RMCast_Control_Splitter::control_module (void) const
-{
- return this->control_module_;
-}
diff --git a/protocols/ace/RMCast/RMCast_Fork.cpp b/protocols/ace/RMCast/RMCast_Fork.cpp
new file mode 100644
index 00000000000..928d34cb411
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Fork.cpp
@@ -0,0 +1,112 @@
+// $Id$
+
+#include "RMCast_Fork.h"
+
+#if !defined (__ACE_INLINE__)
+# include "RMCast_Fork.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(ace, RMCast_Fork, "$Id$")
+
+ACE_RMCast_Fork::~ACE_RMCast_Fork (void)
+{
+}
+
+int
+ACE_RMCast_Fork::open (void)
+{
+ int r = this->ACE_RMCast_Module::open ();
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->open ();
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::close (void)
+{
+ int r = this->ACE_RMCast_Module::close ();
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->close ();
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::data (ACE_RMCast::Data &data)
+{
+ int r = this->ACE_RMCast_Module::data (data);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->data (data);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::poll (ACE_RMCast::Poll &poll)
+{
+ int r = this->ACE_RMCast_Module::poll (poll);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->poll (poll);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::ack_join (ACE_RMCast::Ack_Join &ack_join)
+{
+ int r = this->ACE_RMCast_Module::ack_join (ack_join);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->ack_join (ack_join);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::ack_leave (ACE_RMCast::Ack_Leave &ack_leave)
+{
+ int r = this->ACE_RMCast_Module::ack_leave (ack_leave);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->ack_leave (ack_leave);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::ack (ACE_RMCast::Ack &ack)
+{
+ int r = this->ACE_RMCast_Module::ack (ack);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->ack (ack);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::join (ACE_RMCast::Join &join)
+{
+ int r = this->ACE_RMCast_Module::join (join);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->join (join);
+ return 0;
+}
+
+int
+ACE_RMCast_Fork::leave (ACE_RMCast::Leave &leave)
+{
+ int r = this->ACE_RMCast_Module::leave (leave);
+ if (r != 0)
+ return r;
+ if (this->secondary () != 0)
+ return this->secondary ()->leave (leave);
+ return 0;
+}
diff --git a/protocols/ace/RMCast/RMCast_Fork.h b/protocols/ace/RMCast/RMCast_Fork.h
new file mode 100644
index 00000000000..5fd216d68f3
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Fork.h
@@ -0,0 +1,55 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef ACE_RMCAST_FORK_H
+#define ACE_RMCAST_FORK_H
+#include "ace/pre.h"
+
+#include "RMCast_Module.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/// Fork messages to multiple destinations
+/**
+ * In some instances the messages must be sent to multiple
+ * destinations, this module is a generic component to duplicate such
+ * messages.
+ */
+class ACE_RMCast_Export ACE_RMCast_Fork : public ACE_RMCast_Module
+{
+public:
+ //! Constructor
+ ACE_RMCast_Fork (void);
+
+ //! Destructor
+ virtual ~ACE_RMCast_Fork (void);
+
+ /// Set the control module, all incoming control messages go to it
+ void secondary (ACE_RMCast_Module *module);
+
+ /// Return the current control module
+ ACE_RMCast_Module *secondary (void) const;
+
+ virtual int open (void);
+ virtual int close (void);
+ virtual int data (ACE_RMCast::Data &);
+ virtual int poll (ACE_RMCast::Poll &);
+ virtual int ack_join (ACE_RMCast::Ack_Join &);
+ virtual int ack_leave (ACE_RMCast::Ack_Leave &);
+ virtual int ack (ACE_RMCast::Ack &);
+ virtual int join (ACE_RMCast::Join &);
+ virtual int leave (ACE_RMCast::Leave &);
+
+private:
+ /// The control module
+ ACE_RMCast_Module *secondary_;
+};
+
+#if defined (__ACE_INLINE__)
+#include "RMCast_Fork.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* ACE_RMCAST_FORK_H */
diff --git a/protocols/ace/RMCast/RMCast_Fork.i b/protocols/ace/RMCast/RMCast_Fork.i
new file mode 100644
index 00000000000..bbcd4f23ae1
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Fork.i
@@ -0,0 +1,21 @@
+// $Id$
+
+ACE_INLINE
+ACE_RMCast_Fork::ACE_RMCast_Fork (void)
+ : ACE_RMCast_Module ()
+ , secondary_ (0)
+{
+}
+
+ACE_INLINE void
+ACE_RMCast_Fork::secondary (ACE_RMCast_Module *module)
+{
+ this->secondary_ = module;
+}
+
+
+ACE_INLINE ACE_RMCast_Module *
+ACE_RMCast_Fork::secondary (void) const
+{
+ return this->secondary_;
+}
diff --git a/protocols/ace/RMCast/RMCast_Fragment.cpp b/protocols/ace/RMCast/RMCast_Fragment.cpp
index 976def7a241..2d4389c1a92 100644
--- a/protocols/ace/RMCast/RMCast_Fragment.cpp
+++ b/protocols/ace/RMCast/RMCast_Fragment.cpp
@@ -36,7 +36,7 @@ ACE_RMCast_Fragment::data (ACE_RMCast::Data &received_data)
ACE_Message_Block *mb = data.payload;
// @@ We should keep the total size precomputed
- data.total_size = mb->total_size ();
+ data.total_size = mb->total_length ();
// We must leave room for the header
#if defined (ACE_HAS_BROKEN_DGRAM_SENDV)
diff --git a/protocols/ace/RMCast/RMCast_IO_UDP.cpp b/protocols/ace/RMCast/RMCast_IO_UDP.cpp
index 4fe1488bad0..ca8af1bfb39 100644
--- a/protocols/ace/RMCast/RMCast_IO_UDP.cpp
+++ b/protocols/ace/RMCast/RMCast_IO_UDP.cpp
@@ -91,7 +91,7 @@ ACE_RMCast_IO_UDP::handle_input (ACE_HANDLE)
if (r == -1)
{
// @@ LOG??
- ACE_DEBUG ((LM_DEBUG,
+ ACE_ERROR ((LM_ERROR,
"RMCast_IO_UDP::handle_input () - "
"error in recv %p\n", ""));
return -1;
@@ -127,7 +127,10 @@ ACE_RMCast_IO_UDP::handle_input (ACE_HANDLE)
ACE_RMCast_UDP_Proxy *proxy;
if (this->map_.find (from_address, proxy) != 0)
{
- // State == RS_NON_EXISTENT
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::handle_input - new proxy from <%s:%d>\n",
+ // from_address.get_host_addr (),
+ // from_address.get_port_number ()));
// @@ We should validate the message *before* creating the
// object, all we need is some sort of validation strategy, a
@@ -145,8 +148,6 @@ ACE_RMCast_IO_UDP::handle_input (ACE_HANDLE)
}
#endif /* 0 */
- // The message type is valid, we must create a new proxy,
- // initially in the JOINING state...
ACE_RMCast_Module *module = this->factory_->create ();
if (module == 0)
{
@@ -170,7 +171,14 @@ ACE_RMCast_IO_UDP::handle_input (ACE_HANDLE)
}
// Have the proxy process the message and do the right thing.
- return proxy->receive_message (buffer, r);
+ if (proxy->receive_message (buffer, r) != 0)
+ {
+ (void) this->map_.unbind (from_address);
+ this->factory_->destroy (proxy->next ());
+ delete proxy;
+ }
+
+ return 0;
}
ACE_HANDLE
@@ -225,6 +233,11 @@ int
ACE_RMCast_IO_UDP::send_data (ACE_RMCast::Data &data,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_data - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// The first message block contains the header
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
@@ -283,6 +296,11 @@ int
ACE_RMCast_IO_UDP::send_poll (ACE_RMCast::Poll &,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_poll - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
@@ -301,6 +319,11 @@ int
ACE_RMCast_IO_UDP::send_ack_join (ACE_RMCast::Ack_Join &ack_join,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_ack_join - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
@@ -322,6 +345,11 @@ int
ACE_RMCast_IO_UDP::send_ack_leave (ACE_RMCast::Ack_Leave &,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_ack_leave - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
@@ -340,6 +368,13 @@ int
ACE_RMCast_IO_UDP::send_ack (ACE_RMCast::Ack &ack,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_ack - pushing (%d:%d) out to <%s:%d>\n",
+ // ack.next_expected,
+ // ack.highest_received,
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
@@ -365,6 +400,11 @@ int
ACE_RMCast_IO_UDP::send_join (ACE_RMCast::Join &,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_join - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
@@ -383,6 +423,11 @@ int
ACE_RMCast_IO_UDP::send_leave (ACE_RMCast::Leave &,
const ACE_INET_Addr &to)
{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "IO_UDP::send_leave - pushing out to <%s:%d>\n",
+ // to.get_host_addr (),
+ // to.get_port_number ()));
+
// @@ TODO: We could keep the header pre-initialized, and only
// update the portions that do change...
char header[16];
diff --git a/protocols/ace/RMCast/RMCast_Membership.cpp b/protocols/ace/RMCast/RMCast_Membership.cpp
index a23d7a756e5..91c9b1a9cea 100644
--- a/protocols/ace/RMCast/RMCast_Membership.cpp
+++ b/protocols/ace/RMCast/RMCast_Membership.cpp
@@ -16,15 +16,21 @@ ACE_RMCast_Membership::~ACE_RMCast_Membership (void)
}
int
-ACE_RMCast_Membership::ack (ACE_RMCast::Ack &ack)
+ACE_RMCast_Membership::has_members (void)
{
- // ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack\n"));
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
+
Proxy_Iterator end = this->proxies_.end ();
Proxy_Iterator i = this->proxies_.begin ();
- if (i == end)
- return 0;
+ return (i != end);
+}
+
+int
+ACE_RMCast_Membership::ack (ACE_RMCast::Ack &ack)
+{
+ //ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack (%d:%d)\n",
+ // ack.next_expected, ack.highest_received));
- // ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[2]\n"));
ACE_RMCast::Ack next_ack;
{
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
@@ -32,53 +38,27 @@ ACE_RMCast_Membership::ack (ACE_RMCast::Ack &ack)
{
// @@ This violates an invariant of the class, shouldn't
// happen...
- // ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[3]\n"));
- return -1;
+ //ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[2]\n"));
+ return 0;
}
else if (ack.next_expected == this->next_expected_)
{
// Nothing new, just continue....
- // ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[4]\n"));
+ //ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[3]\n"));
return 0;
}
- // Possible update, re-evaluate the story...
-
- ACE_UINT32 next_expected = (*i)->next_expected ();
- ACE_UINT32 highest_received = (*i)->highest_received ();
- ++i;
- for (; i != end; ++i)
- {
- ACE_UINT32 s = (*i)->next_expected ();
- if (s < next_expected)
- next_expected = s;
- ACE_UINT32 r = (*i)->highest_received ();
- if (r > highest_received)
- highest_received = r;
- }
-#if 0
- // @@TODO: this is an important feature, disabled until it is
- // fully debugged
- if (this->next_expected_ >= next_expected
- || this->highest_received_ >= highest_received)
- {
- // No change....
- // ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[5]\n"));
- return 0;
- }
-#endif /* 0 */
- this->next_expected_ = next_expected;
- this->highest_received_ = highest_received;
- if (this->next () == 0)
+ int r = this->compute_ack_i (ack.source, next_ack);
+ if (r < 0)
+ return r;
+ if (r == 1)
return 0;
- next_ack.source = ack.source;
- next_ack.next_expected = this->next_expected_;
- next_ack.highest_received = this->highest_received_;
}
- // @@ This looks like a race condition, next() is checked inside the
- // lock and used outside, but it is not: the application is only
- // supposed to change next() at construction time.
- return this->next ()->ack (next_ack);
+
+ //ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[4] (%d:%d)\n",
+ // next_ack.next_expected, next_ack.highest_received));
+
+ return this->ACE_RMCast_Module::ack (next_ack);
}
int
@@ -88,12 +68,15 @@ ACE_RMCast_Membership::join (ACE_RMCast::Join &join)
return 0;
{
+ // ACE_DEBUG ((LM_DEBUG,
+ // "RMCast_Membership::join - %d\n",
+ // long(join.source)));
+
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
if (this->proxies_.insert (join.source) == -1)
return -1;
- // @@TODO: This may change the next Ack to send up, should
- // recompute and send the right message if that was the case.
}
+ (void) this->generate_ack (join.source);
return this->ACE_RMCast_Module::join (join);
}
@@ -107,13 +90,91 @@ ACE_RMCast_Membership::leave (ACE_RMCast::Leave &leave)
{
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
(void) this->proxies_.remove (leave.source);
- // @@TODO: This may change the next Ack to send up, should
- // recompute and send the right message if that was the case.
}
+ (void) this->generate_ack (leave.source);
return this->ACE_RMCast_Module::leave (leave);
}
+int
+ACE_RMCast_Membership::generate_ack (ACE_RMCast_Proxy *proxy)
+{
+ ACE_RMCast::Ack next_ack;
+ {
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
+ int r = this->compute_ack_i (proxy, next_ack);
+ if (r < 0)
+ return r;
+ if (r == 1)
+ return 0;
+ }
+
+ //ACE_DEBUG ((LM_DEBUG, "ACE_RMCast_Membership::ack[6] (%d:%d)\n",
+ // next_ack.next_expected, next_ack.highest_received));
+
+ return this->ACE_RMCast_Module::ack (next_ack);
+}
+
+int
+ACE_RMCast_Membership::compute_ack_i (ACE_RMCast_Proxy *source,
+ ACE_RMCast::Ack &next_ack)
+{
+ Proxy_Iterator end = this->proxies_.end ();
+ Proxy_Iterator i = this->proxies_.begin ();
+ if (i == end)
+ return 1;
+
+ //ACE_DEBUG ((LM_DEBUG,
+ // "RMCast_Membership::generate_ack[1] - %d -> (%d:%d)\n",
+ // long(*i),
+ // (*i)->next_expected (),
+ // (*i)->highest_received ()));
+
+ ACE_UINT32 next_expected = (*i)->next_expected ();
+ ACE_UINT32 highest_received = (*i)->highest_received ();
+ ++i;
+
+ for (; i != end; ++i)
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // "RMCast_Membership::generate_ack[2] - %d -> (%d:%d)\n",
+ // long(*i),
+ // (*i)->next_expected (),
+ // (*i)->highest_received ()));
+
+ ACE_UINT32 s = (*i)->next_expected ();
+ if (s < next_expected)
+ next_expected = s;
+ ACE_UINT32 r = (*i)->highest_received ();
+ if (r > highest_received)
+ highest_received = r;
+ }
+#if 0
+ // @@TODO: this is an important feature, disabled until it is
+ // fully debugged
+ if (this->next_expected_ >= next_expected
+ || this->highest_received_ >= highest_received)
+ {
+ // No change....
+ ACE_DEBUG ((LM_DEBUG,
+ "RMCast_Membership::generate_ack[3]\n"));
+ return 1;
+ }
+#endif /* 0 */
+ this->next_expected_ = next_expected;
+ this->highest_received_ = highest_received;
+ next_ack.source = source;
+ next_ack.next_expected = this->next_expected_;
+ next_ack.highest_received = this->highest_received_;
+
+ //ACE_DEBUG ((LM_DEBUG,
+ // "RMCast_Membership::generate_ack[4] - (%d:%d)\n",
+ // next_ack.next_expected,
+ // next_ack.highest_received));
+
+ return 0;
+}
+
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Unbounded_Set<ACE_RMCast_Proxy*>;
diff --git a/protocols/ace/RMCast/RMCast_Membership.h b/protocols/ace/RMCast/RMCast_Membership.h
index 21ee1bea97b..07f9aab593c 100644
--- a/protocols/ace/RMCast/RMCast_Membership.h
+++ b/protocols/ace/RMCast/RMCast_Membership.h
@@ -28,8 +28,8 @@
class ACE_RMCast_Proxy;
-//! Track peer membership
-/*!
+/// Track peer membership
+/**
* Reliable senders of events need to know exactly how many peers are
* receiving the events, and how many events has each peer received so
* far.
@@ -40,14 +40,17 @@ class ACE_RMCast_Proxy;
class ACE_RMCast_Export ACE_RMCast_Membership : public ACE_RMCast_Module
{
public:
- //! Constructor
+ /// Constructor
ACE_RMCast_Membership (void);
- //! Destructor
+ /// Destructor
virtual ~ACE_RMCast_Membership (void);
- //! Receive an process an Ack message
- /*!
+ /// Return 1 if there are still members in the group
+ int has_members (void);
+
+ /// Receive an process an Ack message
+ /**
* After receiving the Ack message we find out what is the lowest
* sequence number received in order among all the acks received by
* the proxies in the collection. We also find out what is the
@@ -57,29 +60,38 @@ public:
*/
virtual int ack (ACE_RMCast::Ack &);
- //! Add a new member to the collection, using the <source> field in
- //! the Join message
+ /// Add a new member to the collection, using the <source> field in
+ /// the Join message
virtual int join (ACE_RMCast::Join &);
- //! Remove a member from the collection, using the <source> field in
- //! the Join message
+ /// Remove a member from the collection, using the <source> field in
+ /// the Join message
virtual int leave (ACE_RMCast::Leave &);
+private:
+ /// Generate an Ack message, normally due to changes in the
+ /// collection, such as new proxys joining or leaving
+ int generate_ack (ACE_RMCast_Proxy *proxy);
+
+ /// Compute an Ack message to propagate to the upper layers.
+ int compute_ack_i (ACE_RMCast_Proxy *source,
+ ACE_RMCast::Ack &next_ack);
+
protected:
- //! Use an unbounded set to maintain the collection of proxies.
+ /// Use an unbounded set to maintain the collection of proxies.
typedef ACE_Unbounded_Set<ACE_RMCast_Proxy*> Proxy_Collection;
typedef ACE_Unbounded_Set_Iterator<ACE_RMCast_Proxy*> Proxy_Iterator;
- //! The collection of proxies
+ /// The collection of proxies
Proxy_Collection proxies_;
- //! The smallest value of \param next_expected for all the proxies
+ /// The smallest value of \param next_expected for all the proxies
ACE_UINT32 next_expected_;
- //! The highest value of \param highest_received for all the proxies
+ /// The highest value of \param highest_received for all the proxies
ACE_UINT32 highest_received_;
- //! Synchronization
+ /// Synchronization
ACE_SYNCH_MUTEX mutex_;
};
diff --git a/protocols/ace/RMCast/RMCast_Module.cpp b/protocols/ace/RMCast/RMCast_Module.cpp
index 08ff971f039..727ef631d9d 100644
--- a/protocols/ace/RMCast/RMCast_Module.cpp
+++ b/protocols/ace/RMCast/RMCast_Module.cpp
@@ -32,12 +32,16 @@ ACE_RMCast_Module::next (void) const
int
ACE_RMCast_Module::open (void)
{
+ if (this->next () != 0)
+ return this->next ()->open ();
return 0;
}
int
ACE_RMCast_Module::close (void)
{
+ if (this->next () != 0)
+ return this->next ()->close ();
return 0;
}
diff --git a/protocols/ace/RMCast/RMCast_Reassembly.cpp b/protocols/ace/RMCast/RMCast_Reassembly.cpp
index ed488341bae..5d4cc34b4c8 100644
--- a/protocols/ace/RMCast/RMCast_Reassembly.cpp
+++ b/protocols/ace/RMCast/RMCast_Reassembly.cpp
@@ -22,19 +22,18 @@ ACE_RMCast_Reassembly (void)
ACE_RMCast_Reassembly::~ACE_RMCast_Reassembly (void)
{
- /*!<
- We cleanup the resources in the destructor
- <B color=red>@@ TODO</B> Why not in the close() operation?
- */
- for (Message_Map_Iterator i = this->messages_.begin ();
- i != this->messages_.end ();
- ++i)
- {
- ACE_RMCast_Partial_Message *message = (*i).int_id_;
- if (message != 0)
- delete message;
- }
- this->messages_.unbind_all ();
+ (void) this->close_i ();
+}
+
+/**
+ *
+ * We cleanup the resources in the destructor
+ */
+int
+ACE_RMCast_Reassembly::close ()
+{
+ this->close_i ();
+ return this->ACE_RMCast_Module::close ();
}
int
@@ -43,9 +42,15 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
if (this->next () == 0)
return 0;
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - %d,%d,%d\n",
+ // data.sequence_number,
+ // data.total_size,
+ // data.fragment_offset));
+
if (data.payload->length () + data.fragment_offset > data.total_size)
{
- ACE_DEBUG ((LM_DEBUG,
+ ACE_ERROR ((LM_ERROR,
"RMCast_Reassembly::data - invalid size\n"));
return -1; // Corrupt message?
}
@@ -60,33 +65,35 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
ACE_RMCast_Partial_Message (data.total_size),
-1);
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - new message\n"));
if (this->messages_.bind (data.sequence_number,
message) == -1)
return -1; // Internal error?
}
- // The message was in the collection, but it has been received
- // already, this is a duplicate fragment, just drop it.
- if (message == 0)
- return 0;
-
if (message->fragment_received (data.total_size,
data.fragment_offset,
data.payload) == -1)
{
- ACE_DEBUG ((LM_DEBUG,
- "Error in fragment_received\n"));
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Error in fragment_received\n"));
return -1;
}
if (!message->is_complete ())
- return 0;
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - message still incomplete\n"));
+ return 0;
+ }
- // Remove the message from the collection, but leave a marker
- // to indicate that it was already received...
- if (this->messages_.rebind (data.sequence_number,
- (ACE_RMCast_Partial_Message*)0) == -1)
- return -1;
+ if (this->messages_.unbind (data.sequence_number) == -1)
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Reassembly::data - message now complete\n"));
+ return -1;
+ }
}
// Push the message...
@@ -104,6 +111,20 @@ ACE_RMCast_Reassembly::data (ACE_RMCast::Data &data)
return r;
}
+void
+ACE_RMCast_Reassembly::close_i (void)
+{
+ for (Message_Map_Iterator i = this->messages_.begin ();
+ i != this->messages_.end ();
+ ++i)
+ {
+ ACE_RMCast_Partial_Message *message = (*i).int_id_;
+ if (message != 0)
+ delete message;
+ }
+ this->messages_.unbind_all ();
+}
+
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Hash_Map_Manager<ACE_UINT32,ACE_RMCast_Partial_Message*,ACE_Null_Mutex>;
diff --git a/protocols/ace/RMCast/RMCast_Reassembly.h b/protocols/ace/RMCast/RMCast_Reassembly.h
index 6dc37e1ae19..a9ebb480ac3 100644
--- a/protocols/ace/RMCast/RMCast_Reassembly.h
+++ b/protocols/ace/RMCast/RMCast_Reassembly.h
@@ -42,9 +42,15 @@ public:
virtual ~ACE_RMCast_Reassembly (void);
// = The ACE_RMCast_Module methods
+ virtual int close (void);
virtual int data (ACE_RMCast::Data &data);
private:
+ /// Cleanup resources, but do not close the other modules in the
+ /// stack
+ void close_i (void);
+
+private:
//! A mutex used to synchronize all the internal operations.
ACE_SYNCH_MUTEX mutex_;
typedef
diff --git a/protocols/ace/RMCast/RMCast_Receiver_Module.cpp b/protocols/ace/RMCast/RMCast_Receiver_Module.cpp
new file mode 100644
index 00000000000..2d08ca4bb02
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Receiver_Module.cpp
@@ -0,0 +1,157 @@
+//
+// $Id$
+//
+
+#include "RMCast_Receiver_Module.h"
+#include "RMCast_Proxy.h"
+#include "ace/Log_Msg.h"
+
+#if !defined (__ACE_INLINE__)
+# include "RMCast_Receiver_Module.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(ace, RMCast_Receiver_Module, "$Id$")
+
+ACE_RMCast_Receiver_Module::~ACE_RMCast_Receiver_Module (void)
+{
+}
+
+int
+ACE_RMCast_Receiver_Module::data (ACE_RMCast::Data &data)
+{
+ switch (this->state_)
+ {
+ case RS_NON_EXISTENT:
+ case RS_JOINING:
+ if (data.source != 0)
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "Receiver_Module::data - joining\n"));
+
+ this->state_ = RS_JOINING;
+ ACE_RMCast::Join join;
+ if (data.source->reply_join (join) != 0)
+ this->leaving (data.source);
+ }
+ break;
+
+ case RS_JOINED:
+ // ACE_DEBUG ((LM_DEBUG,
+ // "Receiver_Module::data - joined\n"));
+ if (this->ACE_RMCast_Module::data (data) != 0)
+ this->leaving (data.source);
+ break;
+
+ default:
+ case RS_LEAVING:
+ this->leaving (data.source);
+ break;
+ }
+ return 0;
+}
+
+int
+ACE_RMCast_Receiver_Module::poll (ACE_RMCast::Poll &poll)
+{
+ switch (this->state_)
+ {
+ case RS_NON_EXISTENT:
+ case RS_JOINING:
+ if (poll.source != 0)
+ {
+ this->state_ = RS_JOINING;
+ ACE_RMCast::Join join;
+ if (poll.source->reply_join (join) != 0)
+ this->leaving (poll.source);
+ }
+ break;
+
+ case RS_JOINED:
+ if (this->ACE_RMCast_Module::poll (poll) != 0)
+ this->leaving (poll.source);
+
+ default:
+ case RS_LEAVING:
+ this->leaving (poll.source);
+ break;
+ }
+ return 0;
+}
+
+int
+ACE_RMCast_Receiver_Module::ack_join (ACE_RMCast::Ack_Join &ack_join)
+{
+ switch (this->state_)
+ {
+ case RS_NON_EXISTENT:
+ if (ack_join.source != 0)
+ {
+ //ACE_DEBUG ((LM_DEBUG,
+ // "Receiver_Module::ack_join - joining\n"));
+
+ this->state_ = RS_JOINING;
+ ACE_RMCast::Join join;
+ if (ack_join.source->reply_join (join) != 0)
+ this->leaving (ack_join.source);
+ }
+ break;
+
+ case RS_JOINING:
+ case RS_JOINED:
+ //ACE_DEBUG ((LM_DEBUG,
+ // "Receiver_Module::ack_join - joined\n"));
+
+ this->state_ = RS_JOINED;
+ if (this->ACE_RMCast_Module::ack_join (ack_join) != 0)
+ this->leaving (ack_join.source);
+ break;
+
+ default:
+ case RS_LEAVING:
+ this->leaving (ack_join.source);
+ break;
+ }
+ return 0;
+}
+
+int
+ACE_RMCast_Receiver_Module::ack_leave (ACE_RMCast::Ack_Leave &ack_leave)
+{
+ //ACE_DEBUG ((LM_DEBUG,
+ // "Receiver_Module::ack_leave\n"));
+
+ (void) this->ACE_RMCast_Module::ack_leave (ack_leave);
+
+ // Returning -1 should remove the Proxy from the local set
+ return -1;
+}
+
+int
+ACE_RMCast_Receiver_Module::ack (ACE_RMCast::Ack &)
+{
+ return -1;
+}
+
+int
+ACE_RMCast_Receiver_Module::join (ACE_RMCast::Join &)
+{
+ return -1;
+}
+
+int
+ACE_RMCast_Receiver_Module::leave (ACE_RMCast::Leave &)
+{
+ return -1;
+}
+
+void
+ACE_RMCast_Receiver_Module::leaving (ACE_RMCast_Proxy *proxy)
+{
+ this->state_ = RS_LEAVING;
+ if (proxy != 0)
+ {
+ ACE_RMCast::Leave leave;
+ (void) proxy->reply_leave (leave);
+ }
+ (void) this->close ();
+}
diff --git a/protocols/ace/RMCast/RMCast_Receiver_Module.h b/protocols/ace/RMCast/RMCast_Receiver_Module.h
new file mode 100644
index 00000000000..35ae8c642c7
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Receiver_Module.h
@@ -0,0 +1,108 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// ace/RMCast
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu>
+//
+// ============================================================================
+
+#ifndef ACE_RMCAST_RECEIVER_MODULE_H
+#define ACE_RMCAST_RECEIVER_MODULE_H
+#include "ace/pre.h"
+
+#include "RMCast_Module.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/// Keep track of the receiver module.
+/**
+ * A receiver proxy must reject invalid messages and communicate with
+ * the sender to join and leave the multicast group.
+ *
+ * This module performs all the task related to
+ *
+ */
+class ACE_RMCast_Export ACE_RMCast_Receiver_Module : public ACE_RMCast_Module
+{
+public:
+ //! Constructor
+ ACE_RMCast_Receiver_Module (void);
+
+ //! Destructor
+ virtual ~ACE_RMCast_Receiver_Module (void);
+
+ virtual int data (ACE_RMCast::Data &);
+ virtual int poll (ACE_RMCast::Poll &);
+ virtual int ack_join (ACE_RMCast::Ack_Join &);
+ virtual int ack_leave (ACE_RMCast::Ack_Leave &);
+ virtual int ack (ACE_RMCast::Ack &);
+ virtual int join (ACE_RMCast::Join &);
+ virtual int leave (ACE_RMCast::Leave &);
+
+ /// Simple enum used to describe the receiver state transitions
+ /**
+ * Receivers go through several states before they can fully accept
+ * messages, the following comments describe those states, as well as
+ * the possible transitions
+ * This configuration is pesimistic, any invalid message is cause
+ * enough to reclaim all the resources. This partially addresses
+ * situations where either accidentally or intentionally a sender is
+ * multicasting packets to the wrong group.
+
+ <CODE>
+ NON_EXISTENT JOINING JOINED LEAVING<BR>
+ ----------------------------------------------------------------<BR>
+ <BR>
+ DATA JOINING JOINING JOINED LEAVING<BR>
+ Send/Join Send/Join Recv/Data Send/Leave<BR>
+ <BR>
+ POLL JOINING JOINING JOINED LEAVING<BR>
+ Send/Join Send/Join Send/Ack Send/Leave<BR>
+ <BR>
+ ACK_JOIN JOINING JOINED JOINED LEAVING<BR>
+ Send/Join Receive Msg Receive Msg Send/Leave<BR>
+ <BR>
+ ACK_LEAVE NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
+ Noop Destroy Destroy Destroy<BR>
+ <BR>
+ ACK NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
+ Noop Destroy Destroy Destroy<BR>
+ <BR>
+ JOIN NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
+ Noop Destroy Destroy Destroy<BR>
+ <BR>
+ LEAVE NON_EXISTENT NON_EXISTENT NON_EXISTENT NON_EXISTENT<BR>
+ Noop Destroy Destroy Destroy<BR>
+ <BR>
+ </CODE>
+ */
+ enum Receiver_State
+ {
+ RS_NON_EXISTENT,
+ RS_JOINING,
+ RS_JOINED,
+ RS_LEAVING
+ };
+
+private:
+ /// Enter the leaving state, prepare for termination
+ void leaving (ACE_RMCast_Proxy *proxy);
+
+private:
+ /// The current state of the receiver
+ int state_;
+};
+
+#if defined (__ACE_INLINE__)
+#include "RMCast_Receiver_Module.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* ACE_RMCAST_RECEIVER_MODULE_H */
diff --git a/protocols/ace/RMCast/RMCast_Receiver_Module.i b/protocols/ace/RMCast/RMCast_Receiver_Module.i
new file mode 100644
index 00000000000..6662f7f048a
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Receiver_Module.i
@@ -0,0 +1,7 @@
+// $Id$
+
+ACE_INLINE
+ACE_RMCast_Receiver_Module::ACE_RMCast_Receiver_Module (void)
+ : state_ (ACE_RMCast_Receiver_Module::RS_NON_EXISTENT)
+{
+}
diff --git a/protocols/ace/RMCast/RMCast_Reliable_Factory.cpp b/protocols/ace/RMCast/RMCast_Reliable_Factory.cpp
index b06b9d0953d..6140c685153 100644
--- a/protocols/ace/RMCast/RMCast_Reliable_Factory.cpp
+++ b/protocols/ace/RMCast/RMCast_Reliable_Factory.cpp
@@ -1,6 +1,7 @@
// $Id$
#include "RMCast_Reliable_Factory.h"
+#include "RMCast_Receiver_Module.h"
#include "RMCast_Reassembly.h"
#include "RMCast_Reordering.h"
@@ -17,6 +18,9 @@ ACE_RMCast_Reliable_Factory::~ACE_RMCast_Reliable_Factory (void)
ACE_RMCast_Module*
ACE_RMCast_Reliable_Factory::create (void)
{
+ ACE_RMCast_Module *receiver;
+ ACE_NEW_RETURN (receiver, ACE_RMCast_Receiver_Module, 0);
+
ACE_RMCast_Module *reassembly;
ACE_NEW_RETURN (reassembly, ACE_RMCast_Reassembly, 0);
@@ -26,21 +30,25 @@ ACE_RMCast_Reliable_Factory::create (void)
ACE_RMCast_Module *user = this->factory_->create ();
if (user == 0)
{
+ delete receiver;
delete reordering;
delete reassembly;
return 0;
}
+ receiver->next (reassembly);
reassembly->next (reordering);
reordering->next (user);
- return reassembly;
+ return receiver;
}
void
-ACE_RMCast_Reliable_Factory::destroy (ACE_RMCast_Module *reassembly)
+ACE_RMCast_Reliable_Factory::destroy (ACE_RMCast_Module *receiver)
{
+ ACE_RMCast_Module *reassembly = receiver->next ();
ACE_RMCast_Module *reordering = reassembly->next ();
ACE_RMCast_Module *user = reordering->next ();
this->factory_->destroy (user);
delete reordering;
delete reassembly;
+ delete receiver;
}
diff --git a/protocols/ace/RMCast/RMCast_Reordering.cpp b/protocols/ace/RMCast/RMCast_Reordering.cpp
index a984fa9b989..5a81a360783 100644
--- a/protocols/ace/RMCast/RMCast_Reordering.cpp
+++ b/protocols/ace/RMCast/RMCast_Reordering.cpp
@@ -19,17 +19,26 @@ ACE_RMCast_Reordering::~ACE_RMCast_Reordering (void)
int
ACE_RMCast_Reordering::close (void)
{
- // @@
- return 0;
+ Messages_Iterator i = this->messages_.begin ();
+ Messages_Iterator end = this->messages_.end ();
+
+ while (i != end)
+ {
+ ACE_Message_Block::release ((*i).item ().payload);
+ this->messages_.unbind ((*i).key ());
+ i = this->messages_.begin ();
+ }
+ return this->ACE_RMCast_Module::close ();
}
int
ACE_RMCast_Reordering::data (ACE_RMCast::Data &data)
{
int must_ack = 0;
+ int result = 0;
ACE_RMCast::Ack ack;
- // ACE_DEBUG ((LM_DEBUG, "Received message (%d)\n", data.sequence_number));
+ //ACE_DEBUG ((LM_DEBUG, "Received message (%d)\n", data.sequence_number));
{
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
@@ -39,12 +48,12 @@ ACE_RMCast_Reordering::data (ACE_RMCast::Data &data)
// of this block).
must_ack = 1;
- // ACE_DEBUG ((LM_DEBUG, ".... old message is ignored\n"));
+ //ACE_DEBUG ((LM_DEBUG, ".... old message is ignored\n"));
}
else if (data.sequence_number == this->next_expected_)
{
- // ACE_DEBUG ((LM_DEBUG, ".... message is in order, received\n"));
+ //ACE_DEBUG ((LM_DEBUG, ".... message is in order, received\n"));
// Accept the message, the current thread will dispatch it, so
// it is marked as accepted (using the <next_expected> field).
@@ -61,11 +70,14 @@ ACE_RMCast_Reordering::data (ACE_RMCast::Data &data)
// delivering messages out of order? I.E. what if the
// next thread receives the next message?
if (this->next () != 0)
- (void) this->next ()->data (data);
+ {
+ result = this->next ()->data (data);
+ }
// After delivering one message there may be more messages
// pending
- this->push_queued_messages ();
+ if (result == 0)
+ result = this->push_queued_messages ();
//@@ This should be strategized, for example, only Ack if
// there is a message out of order or something, otherwise
@@ -76,7 +88,7 @@ ACE_RMCast_Reordering::data (ACE_RMCast::Data &data)
else
{
- // ACE_DEBUG ((LM_DEBUG, ".... message out of sequence, saved\n"));
+ //ACE_DEBUG ((LM_DEBUG, ".... message out of sequence, saved\n"));
// Out of sequence.
if (this->highest_received_ < data.sequence_number)
@@ -93,14 +105,19 @@ ACE_RMCast_Reordering::data (ACE_RMCast::Data &data)
ack.highest_received = this->highest_received_;
}
- if (!must_ack || data.source == 0)
- return 0;
- return data.source->reply_ack (ack);
+ if (must_ack && data.source != 0)
+ (void) data.source->reply_ack (ack);
+
+ return result;
}
int
ACE_RMCast_Reordering::ack_join (ACE_RMCast::Ack_Join &ack_join)
{
+ //ACE_DEBUG ((LM_DEBUG, "RMCast_Reordering::ack_join - <%d,%d>\n",
+ // this->next_expected_,
+ // ack_join.next_sequence_number));
+
{
ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
if (this->next_expected_ >= ack_join.next_sequence_number)
@@ -130,7 +147,7 @@ ACE_RMCast_Reordering::ack_join (ACE_RMCast::Ack_Join &ack_join)
return 0;
}
-void
+int
ACE_RMCast_Reordering::push_queued_messages (void)
{
Messages_Iterator i = this->messages_.begin ();
@@ -139,17 +156,21 @@ ACE_RMCast_Reordering::push_queued_messages (void)
while (i != end
&& (*i).key () == this->next_expected_)
{
+ int r = 0;
if (this->next () != 0)
{
ACE_RMCast::Data data = (*i).item ();
- this->next ()->data (data);
+ r = this->next ()->data (data);
}
ACE_Message_Block::release ((*i).item ().payload);
this->messages_.unbind ((*i).key ());
i = this->messages_.begin ();
this->next_expected_++;
+ if (r != 0)
+ return r;
}
+ return 0;
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
diff --git a/protocols/ace/RMCast/RMCast_Reordering.h b/protocols/ace/RMCast/RMCast_Reordering.h
index 0f6c777913c..5647e35a585 100644
--- a/protocols/ace/RMCast/RMCast_Reordering.h
+++ b/protocols/ace/RMCast/RMCast_Reordering.h
@@ -25,8 +25,8 @@
class ACE_RMCast_Proxy;
-//! Pass messages up in sent order
-/*!
+/// Pass messages up in sent order
+/**
* Some applications require receivers to process messages in the same
* order that messages are sent. This module buffers out of order
* messages and only delivers a message if:
@@ -44,45 +44,47 @@ class ACE_RMCast_Proxy;
class ACE_RMCast_Export ACE_RMCast_Reordering : public ACE_RMCast_Module
{
public:
- //! Constructor
+ /// Constructor
ACE_RMCast_Reordering (void);
- //! Destructor
+ /// Destructor
virtual ~ACE_RMCast_Reordering (void);
- //! Use a Red-Black Tree to keep the queue of messages
+ /// Use a Red-Black Tree to keep the queue of messages
+ //@{
typedef ACE_RB_Tree<ACE_UINT32,ACE_RMCast::Data,ACE_Less_Than<ACE_UINT32>,ACE_Null_Mutex> Messages;
typedef ACE_RB_Tree_Iterator<ACE_UINT32,ACE_RMCast::Data,ACE_Less_Than<ACE_UINT32>,ACE_Null_Mutex> Messages_Iterator;
+ //@}
- //! Remove messages still pending
+ /// Remove messages still pending
virtual int close (void);
- //! Process a Data message.
- /*!
+ /// Process a Data message.
+ /**
* Process a Data message, sending the right Ack message back.
* The message is passed up only if it is in order.
*/
virtual int data (ACE_RMCast::Data &);
- //! During the join process the server informs us of the next
- //! expected message
+ /// During the join process the server informs us of the next
+ /// expected message
virtual int ack_join (ACE_RMCast::Ack_Join &);
private:
- //! Push any messages that are pending in the queue
- void push_queued_messages (void);
+ /// Push any messages that are pending in the queue
+ int push_queued_messages (void);
protected:
- //! The reordering buffer
+ /// The reordering buffer
Messages messages_;
- //! The smallest value of \param next_expected for all the proxies
+ /// The smallest value of \param next_expected for all the proxies
ACE_UINT32 next_expected_;
- //! The highest value of \param highest_received for all the proxies
+ /// The highest value of \param highest_received for all the proxies
ACE_UINT32 highest_received_;
- //! Synchronization
+ /// Synchronization
ACE_SYNCH_MUTEX mutex_;
};
diff --git a/protocols/ace/RMCast/RMCast_Resend_Handler.cpp b/protocols/ace/RMCast/RMCast_Resend_Handler.cpp
index 130a1d6b5ca..c8597b301f0 100644
--- a/protocols/ace/RMCast/RMCast_Resend_Handler.cpp
+++ b/protocols/ace/RMCast/RMCast_Resend_Handler.cpp
@@ -17,6 +17,6 @@ int
ACE_RMCast_Resend_Handler::handle_timeout (const ACE_Time_Value &,
const void *)
{
- (void) this->retransmission_->resend (0 /* @@ TODO */);
+ (void) this->retransmission_->resend_all ();
return 0;
}
diff --git a/protocols/ace/RMCast/RMCast_Resend_Worker.cpp b/protocols/ace/RMCast/RMCast_Resend_Worker.cpp
new file mode 100644
index 00000000000..a4acbeff0cd
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Resend_Worker.cpp
@@ -0,0 +1,31 @@
+//
+// $Id$
+//
+
+#include "RMCast_Resend_Worker.h"
+#include "RMCast_Module.h"
+
+#if !defined (__ACE_INLINE__)
+# include "RMCast_Resend_Worker.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(ace, RMCast_Resend_Worker, "$Id$")
+
+int
+ACE_RMCast_Resend_Worker::work (ACE_UINT32 const & key,
+ ACE_RMCast::Data const &item)
+{
+ if (key > this->max_sequence_number_)
+ return 0;
+ //ACE_DEBUG ((LM_DEBUG,
+ // "RMCast_Resend_Worker::work - message %d resent\n",
+ // key));
+
+ ACE_RMCast::Data data = item;
+ int r = this->next_->data (data);
+ if (r != 0)
+ return r;
+ this->n++;
+
+ return 1; // @@ Stop after the first message...
+}
diff --git a/protocols/ace/RMCast/RMCast_Resend_Worker.h b/protocols/ace/RMCast/RMCast_Resend_Worker.h
new file mode 100644
index 00000000000..03fd81e2a05
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Resend_Worker.h
@@ -0,0 +1,49 @@
+/* -*- C++ -*- */
+// $Id$
+
+#ifndef ACE_RMCAST_RESEND_WORKER_H
+#define ACE_RMCAST_RESEND_WORKER_H
+#include "ace/pre.h"
+
+#include "RMCast.h"
+#include "RMCast_Copy_On_Write.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+class ACE_RMCast_Module;
+
+/// Process an Ack message in the ACE_RMCast_Retransmission module
+/**
+ * The retransmission module uses internal iterators, thus it needs to
+ * create helper Worker classes to process some messages.
+ */
+class ACE_RMCast_Resend_Worker
+ : public ACE_RMCast_Worker<ACE_UINT32,ACE_RMCast::Data>
+{
+public:
+ ACE_RMCast_Resend_Worker (ACE_RMCast_Module *next,
+ ACE_UINT32 max_sequence_number);
+
+ virtual int work (ACE_UINT32 const & key,
+ ACE_RMCast::Data const &item);
+
+ int n;
+
+private:
+ ACE_RMCast_Module *next_;
+
+ ACE_UINT32 max_sequence_number_;
+
+private:
+ ACE_RMCast_Resend_Worker (const ACE_RMCast_Resend_Worker&);
+ ACE_RMCast_Resend_Worker& operator= (const ACE_RMCast_Resend_Worker&);
+};
+
+#if defined (__ACE_INLINE__)
+#include "RMCast_Resend_Worker.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* ACE_RMCAST_RESEND_WORKER_H */
diff --git a/protocols/ace/RMCast/RMCast_Resend_Worker.i b/protocols/ace/RMCast/RMCast_Resend_Worker.i
new file mode 100644
index 00000000000..d609c27f006
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Resend_Worker.i
@@ -0,0 +1,12 @@
+// $Id$
+
+ACE_INLINE
+
+ACE_RMCast_Resend_Worker::
+ACE_RMCast_Resend_Worker (ACE_RMCast_Module *next,
+ ACE_UINT32 max_sequence_number)
+ : n (0)
+ , next_ (next)
+ , max_sequence_number_ (max_sequence_number)
+{
+}
diff --git a/protocols/ace/RMCast/RMCast_Retransmission.cpp b/protocols/ace/RMCast/RMCast_Retransmission.cpp
index a23829cd54e..7b626a4ef7d 100644
--- a/protocols/ace/RMCast/RMCast_Retransmission.cpp
+++ b/protocols/ace/RMCast/RMCast_Retransmission.cpp
@@ -4,6 +4,8 @@
#include "RMCast_Retransmission.h"
#include "RMCast_Proxy.h"
+#include "RMCast_Ack_Worker.h"
+#include "RMCast_Resend_Worker.h"
#include "ace/Message_Block.h"
#if !defined (__ACE_INLINE__)
@@ -16,42 +18,6 @@ ACE_RMCast_Retransmission::~ACE_RMCast_Retransmission (void)
{
}
-class ACE_RMCast_Resend_Worker
- : public ACE_RMCast_Worker<ACE_UINT32,ACE_RMCast::Data>
-{
-public:
- ACE_RMCast_Resend_Worker (ACE_RMCast_Module *next,
- ACE_UINT32 max_sequence_number)
- : n (0)
- , next_ (next)
- , max_sequence_number_ (max_sequence_number)
- {
- }
-
- int work (ACE_UINT32 const & key,
- ACE_RMCast::Data const & item)
- {
- if (key > this->max_sequence_number_)
- return 0;
- // ACE_DEBUG ((LM_DEBUG,
- // " Retransmission::resend - message %d resent\n",
- // key));
- ACE_RMCast::Data data = item;
- int r = this->next_->data (data);
- if (r != 0)
- return r;
- n++;
- return 0;
- }
-
- int n;
-
-private:
- ACE_RMCast_Module *next_;
-
- ACE_UINT32 max_sequence_number_;
-};
-
int
ACE_RMCast_Retransmission::resend (ACE_UINT32 max_sequence_number)
{
@@ -126,42 +92,19 @@ ACE_RMCast_Retransmission::join (ACE_RMCast::Join &join)
return 0;
}
-class ACE_RMCast_Ack_Worker
- : public ACE_RMCast_Worker<ACE_UINT32,ACE_RMCast::Data>
+int
+ACE_RMCast_Retransmission::leave (ACE_RMCast::Leave &leave)
{
-public:
- ACE_RMCast_Ack_Worker (ACE_RMCast::Ack &ack,
- ACE_RMCast_Retransmission::Messages::Write_Guard &g,
- ACE_RMCast_Retransmission::Messages *messages)
- : ack_ (ack)
- , ace_mon_ (g)
- , messages_ (messages)
- {
- }
-
- int work (ACE_UINT32 const & key,
- ACE_RMCast::Data const &item)
- {
- if (key >= this->ack_.next_expected)
- return 0;
- // ACE_DEBUG ((LM_DEBUG,
- // " Retransmission::ack - message %d erased\n",
- // key));
- ACE_Message_Block::release (item.payload);
- return this->messages_->unbind_i (this->ace_mon_, key);
- }
-
-private:
- ACE_RMCast_Ack_Worker (const ACE_RMCast_Ack_Worker&);
- ACE_RMCast_Ack_Worker& operator= (const ACE_RMCast_Ack_Worker&);
-
-private:
- ACE_RMCast::Ack &ack_;
-
- ACE_RMCast_Retransmission::Messages::Write_Guard &ace_mon_;
-
- ACE_RMCast_Retransmission::Messages *messages_;
-};
+ if (leave.source == 0)
+ return 0;
+
+ ACE_RMCast::Ack_Leave ack_leave;
+ ack_leave.source = 0;
+
+ (void) leave.source->reply_ack_leave (ack_leave);
+
+ return 0;
+}
int
ACE_RMCast_Retransmission::ack (ACE_RMCast::Ack &ack)
diff --git a/protocols/ace/RMCast/RMCast_Retransmission.h b/protocols/ace/RMCast/RMCast_Retransmission.h
index f49c0a73f9c..89b431917b3 100644
--- a/protocols/ace/RMCast/RMCast_Retransmission.h
+++ b/protocols/ace/RMCast/RMCast_Retransmission.h
@@ -27,8 +27,8 @@
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
-//! Store messages for retransmission in reliable configurations
-/*!
+/// Store messages for retransmission in reliable configurations
+/**
* Reliable configurations of the RMCast framework need to store
* messages on the sender side to resend them if one or more clients
* do not receive them successfully.
@@ -37,30 +37,30 @@ class ACE_RMCast_Export ACE_RMCast_Retransmission : public ACE_RMCast_Module
{
public:
// = Initialization and termination methods.
- //! Constructor
+ /// Constructor
ACE_RMCast_Retransmission (void);
- //! Destructor
+ /// Destructor
virtual ~ACE_RMCast_Retransmission (void);
- //! Use a Red-Black Tree to keep the queue of messages
+ /// Use a Red-Black Tree to keep the queue of messages
typedef ACE_RB_Tree<ACE_UINT32,ACE_RMCast::Data,ACE_Less_Than<ACE_UINT32>,ACE_Null_Mutex> Collection;
typedef ACE_RB_Tree_Iterator<ACE_UINT32,ACE_RMCast::Data,ACE_Less_Than<ACE_UINT32>,ACE_Null_Mutex> Collection_Iterator;
- //! The messages are stored in the Copy_On_Write wrapper to provide
- //! an efficient, but thread safe interface.
+ /// The messages are stored in the Copy_On_Write wrapper to provide
+ /// an efficient, but thread safe interface.
typedef ACE_RMCast_Copy_On_Write<ACE_UINT32,ACE_RMCast::Data,Collection,Collection_Iterator> Messages;
- //! Resend messages
- /*!
+ /// Resend messages
+ /**
* Resends all the messages up to \param max_sequence_number
* Returns the number of messages sent, or -1 if there where any
* errors.
*/
int resend (ACE_UINT32 max_sequence_number);
- //! Resend all messages
- /*!
+ /// Resend all messages
+ /**
* Resends all the messages currently in the queue.
*/
int resend_all (void);
@@ -68,12 +68,12 @@ public:
/// Return 0 if there is no pending data to send
int has_data (void);
- //! Cleanup all the stored messages
+ /// Cleanup all the stored messages
virtual int close (void);
- //! Pass the message downstream, but also save it in the
- //! retransmission queue
- /*!
+ /// Pass the message downstream, but also save it in the
+ /// retransmission queue
+ /**
* Sequence number are assigned by the ACE_RMCast_Fragmentation
* class, consequently this class first passes the message
* downstream, to obtain the sequence number and then stores the
@@ -81,15 +81,15 @@ public:
*/
virtual int data (ACE_RMCast::Data &data);
- //! Process an Ack message from the remote receivers.
- /*!
+ /// Process an Ack message from the remote receivers.
+ /**
* Normally this Ack message will be a summary of all the Ack
* messages received by the ACE_RMCast_Membership class
*/
virtual int ack (ACE_RMCast::Ack &);
- //! Detect when new members join the group and Ack_Join them
- /*!
+ /// Detect when new members join the group and Ack_Join them
+ /**
* When a new receiver joins the group this module sends an Ack_Join
* message with the next sequence number that the receiver should
* expect.
@@ -98,9 +98,17 @@ public:
*/
virtual int join (ACE_RMCast::Join &);
+ /// A receiver is leaving
+ /**
+ * Normally the ACE_RMCast_Membership module could do this, but,
+ * because this module processes the Join messages, it seems more
+ * natural to process the Leave messages too.
+ */
+ virtual int leave (ACE_RMCast::Leave &);
+
protected:
- //! The retransmission buffer
+ /// The retransmission buffer
Messages messages_;
};
diff --git a/protocols/ace/RMCast/RMCast_Sequencer.cpp b/protocols/ace/RMCast/RMCast_Sequencer.cpp
new file mode 100644
index 00000000000..f8bc0e6c57d
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Sequencer.cpp
@@ -0,0 +1,25 @@
+//
+// $Id$
+//
+
+#include "RMCast_Sequencer.h"
+
+#if !defined (__ACE_INLINE__)
+# include "RMCast_Sequencer.i"
+#endif /* ! __ACE_INLINE__ */
+
+ACE_RCSID(ace, RMCast_Sequencer, "$Id$")
+
+ACE_RMCast_Sequencer::~ACE_RMCast_Sequencer (void)
+{
+}
+
+int
+ACE_RMCast_Sequencer::data (ACE_RMCast::Data &data)
+{
+ {
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->mutex_, -1);
+ data.sequence_number = this->sequence_number_generator_++;
+ }
+ return this->ACE_RMCast_Module::data (data);
+}
diff --git a/protocols/ace/RMCast/RMCast_Sequencer.h b/protocols/ace/RMCast/RMCast_Sequencer.h
new file mode 100644
index 00000000000..321d778853e
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Sequencer.h
@@ -0,0 +1,54 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// ace/RMCast
+//
+// = AUTHOR
+// Carlos O'Ryan <coryan@uci.edu>
+//
+// ============================================================================
+
+#ifndef ACE_RMCAST_SEQUENCER_H
+#define ACE_RMCAST_SEQUENCER_H
+#include "ace/pre.h"
+
+#include "RMCast_Module.h"
+#include "ace/Synch.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/// Assign sequence numbers to outgoing messages
+/**
+ * On the sender side we must assign sequence numbers to the messages
+ * <B>before</B> they are put in the retransmission queue.
+ */
+class ACE_RMCast_Export ACE_RMCast_Sequencer : public ACE_RMCast_Module
+{
+public:
+ /// Constructor
+ ACE_RMCast_Sequencer (void);
+
+ /// Destructor
+ virtual ~ACE_RMCast_Sequencer (void);
+
+ virtual int data (ACE_RMCast::Data &);
+
+protected:
+ /// Create the sequence numbers
+ ACE_UINT32 sequence_number_generator_;
+
+ /// Synchronization
+ ACE_SYNCH_MUTEX mutex_;
+};
+
+#if defined (__ACE_INLINE__)
+#include "RMCast_Sequencer.i"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+#endif /* ACE_RMCAST_SEQUENCER_H */
diff --git a/protocols/ace/RMCast/RMCast_Sequencer.i b/protocols/ace/RMCast/RMCast_Sequencer.i
new file mode 100644
index 00000000000..e7b7ff0f492
--- /dev/null
+++ b/protocols/ace/RMCast/RMCast_Sequencer.i
@@ -0,0 +1,7 @@
+// $Id$
+
+ACE_INLINE
+ACE_RMCast_Sequencer::ACE_RMCast_Sequencer (void)
+ : sequence_number_generator_ (0)
+{
+}
diff --git a/protocols/ace/RMCast/RMCast_UDP_Proxy.cpp b/protocols/ace/RMCast/RMCast_UDP_Proxy.cpp
index fbb37eca2d6..c84b8c0f2ef 100644
--- a/protocols/ace/RMCast/RMCast_UDP_Proxy.cpp
+++ b/protocols/ace/RMCast/RMCast_UDP_Proxy.cpp
@@ -35,12 +35,15 @@ ACE_RMCast_UDP_Proxy::receive_message (char *buffer, size_t size)
if (type == ACE_RMCast::MT_POLL)
{
ACE_RMCast::Poll poll;
- return this->next ()->poll (poll);
+ poll.source = this;
+ return this->poll (poll);
}
else if (type == ACE_RMCast::MT_ACK_JOIN)
{
ACE_RMCast::Ack_Join ack_join;
+ ack_join.source = this;
+
const size_t header_size = 1 + sizeof(ACE_UINT32);
if (size < header_size)
{
@@ -53,18 +56,20 @@ ACE_RMCast_UDP_Proxy::receive_message (char *buffer, size_t size)
ACE_OS::memcpy (&tmp, buffer + 1,
sizeof(tmp));
ack_join.next_sequence_number = ACE_NTOHL (tmp);
- return this->next ()->ack_join (ack_join);
+ return this->ack_join (ack_join);
}
else if (type == ACE_RMCast::MT_ACK_LEAVE)
{
ACE_RMCast::Ack_Leave ack_leave;
- return this->next ()->ack_leave (ack_leave);
+ ack_leave.source = this;
+ return this->ack_leave (ack_leave);
}
else if (type == ACE_RMCast::MT_DATA)
{
ACE_RMCast::Data data;
+ data.source = this;
const size_t header_size = 1 + 3 * sizeof(ACE_UINT32);
if (size < header_size)
{
@@ -93,24 +98,27 @@ ACE_RMCast_UDP_Proxy::receive_message (char *buffer, size_t size)
mb->copy (buffer + header_size, size - header_size);
data.payload = mb;
- return this->next ()->data (data);
+ return this->data (data);
}
else if (type == ACE_RMCast::MT_JOIN)
{
ACE_RMCast::Join join;
- return this->next ()->join (join);
+ join.source = this;
+ return this->join (join);
}
else if (type == ACE_RMCast::MT_LEAVE)
{
ACE_RMCast::Leave leave;
- return this->next ()->leave (leave);
+ leave.source = this;
+ return this->leave (leave);
}
else if (type == ACE_RMCast::MT_ACK)
{
ACE_RMCast::Ack ack;
+ ack.source = this;
const size_t header_size = 1 + sizeof(ACE_UINT32);
if (size < header_size)
@@ -128,7 +136,7 @@ ACE_RMCast_UDP_Proxy::receive_message (char *buffer, size_t size)
sizeof(tmp));
ack.highest_received = ACE_NTOHL (tmp);
- return this->next ()->ack (ack);
+ return this->ack (ack);
}
return 0;
diff --git a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.cpp b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.cpp
index 4659050ebb3..cc5d896e6a6 100644
--- a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.cpp
+++ b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.cpp
@@ -16,18 +16,27 @@ ACE_RMCast_UDP_Reliable_Sender::ACE_RMCast_UDP_Reliable_Sender (ACE_RMCast_Modul
// We use a singleton factory, all proxys send their messages to the
// retransmission module. There should be only control messages
// coming back, so this is OK.
- , factory_ (&retransmission_)
+ , factory_ (&membership_)
, io_udp_ (&factory_)
{
- // Messages are passed down to the retransmission module.
- this->next (&this->retransmission_);
+ // Control messages are received by the membership module and passed
+ // up to the both the retransmission and user modules, we use a fork
+ // module to do that
+ this->membership_.next (&this->fork_);
- // Then to the splitter, at this point control messages are sent
+ this->fork_.next (&this->retransmission_);
+ this->fork_.secondary (user_control);
+
+ // Messages are passed down to the sequencer module
+ this->next (&this->sequencer_);
+
+ // then to the retransmission module
+ this->sequencer_.next (&this->retransmission_);
+
+ // Then fork the messages, at this point control messages are sent
// back to the user, other messages continue down to the
// fragmentation layer.
- this->retransmission_.next (&this->splitter_);
- this->splitter_.next (&this->fragment_);
- this->splitter_.control_module (this->user_control_);
+ this->retransmission_.next (&this->fragment_);
// The fragmentation layer delegates all messages to the UDP I/O
// module, that sends every message back to the application.
@@ -58,9 +67,3 @@ ACE_RMCast_UDP_Reliable_Sender::reactive_resends (ACE_Reactor *reactor,
/// @@ TODO make sure it is removed from the Reactor at some point
(void) reactor->schedule_timer (eh, 0, period, period);
}
-
-int
-ACE_RMCast_UDP_Reliable_Sender::has_data (void)
-{
- return this->retransmission_.has_data ();
-}
diff --git a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.h b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.h
index 3269c7cb304..d84a070ef08 100644
--- a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.h
+++ b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.h
@@ -7,9 +7,11 @@
#include "RMCast_Singleton_Factory.h"
#include "RMCast_IO_UDP.h"
+#include "RMCast_Sequencer.h"
#include "RMCast_Retransmission.h"
+#include "RMCast_Membership.h"
#include "RMCast_Fragment.h"
-#include "RMCast_Control_Splitter.h"
+#include "RMCast_Fork.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
@@ -39,10 +41,16 @@ public:
/// Check if there is still some messages to send, return 0 if not.
int has_data (void);
+ /// Check if there are any members still connected
+ int has_members (void);
+
private:
/// The application-level control module
ACE_RMCast_Module *user_control_;
+ /// Assign sequence numbers
+ ACE_RMCast_Sequencer sequencer_;
+
/// The retransmission module
ACE_RMCast_Retransmission retransmission_;
@@ -52,11 +60,14 @@ private:
/// Handle all the UDP I/O
ACE_RMCast_IO_UDP io_udp_;
+ /// The membership module
+ ACE_RMCast_Membership membership_;
+
/// The fragmentation module
ACE_RMCast_Fragment fragment_;
/// Redirect control messages to the user supplied module
- ACE_RMCast_Control_Splitter splitter_;
+ ACE_RMCast_Fork fork_;
};
#if defined (__ACE_INLINE__)
diff --git a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.i b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.i
index bab679aa0f2..fc5f29a818d 100644
--- a/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.i
+++ b/protocols/ace/RMCast/RMCast_UDP_Reliable_Sender.i
@@ -5,3 +5,15 @@ ACE_RMCast_UDP_Reliable_Sender::open (const ACE_INET_Addr &mcast_group)
{
return this->io_udp_.open (mcast_group, ACE_Addr::sap_any);
}
+
+ACE_INLINE int
+ACE_RMCast_UDP_Reliable_Sender::has_data (void)
+{
+ return this->retransmission_.has_data ();
+}
+
+ACE_INLINE int
+ACE_RMCast_UDP_Reliable_Sender::has_members (void)
+{
+ return this->membership_.has_members ();
+}