diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-10-11 00:57:08 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-10-11 00:57:08 +0000 |
commit | 6345981a237967e0ba2849ded171c85af0c91eaa (patch) | |
tree | e4147344f26f8064491ad6f2d5eb847f32307e10 /protocols/ace | |
parent | 6ef8157e014a7204e1d2439fdfa28330a35bc579 (diff) | |
download | ATCD-6345981a237967e0ba2849ded171c85af0c91eaa.tar.gz |
ChangeLogTag:Tue Oct 10 17:25:32 2000 Carlos O'Ryan <coryan@uci.edu>
Diffstat (limited to 'protocols/ace')
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 (); +} |