Przeglądaj źródła

DatagramPeerIO: init persistent I/O objects directly in Init

ambrop7 15 lat temu
rodzic
commit
eddb706974
1 zmienionych plików z 75 dodań i 96 usunięć
  1. 75 96
      client/DatagramPeerIO.c

+ 75 - 96
client/DatagramPeerIO.c

@@ -36,8 +36,6 @@
 #define DATAGRAMPEERIO_COMPONENT_SINK 1
 #define DATAGRAMPEERIO_COMPONENT_SOURCE 2
 
-static int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif, int otp_warning_count, DatagramPeerIO_handler_otp_warning handler_otp_warning, void *user);
-static void free_persistent_io (DatagramPeerIO *o);
 static void init_sending (DatagramPeerIO *o, BAddr addr, BIPAddr local_addr);
 static void free_sending (DatagramPeerIO *o);
 static void init_receiving (DatagramPeerIO *o);
@@ -46,91 +44,6 @@ static void error_handler (DatagramPeerIO *o, int component, const void *data);
 static void reset_mode (DatagramPeerIO *o);
 static void recv_decoder_notifier_handler (DatagramPeerIO *o, uint8_t *data, int data_len);
 
-int init_persistent_io (DatagramPeerIO *o, btime_t latency, int num_frames, PacketPassInterface *recv_userif, int otp_warning_count, DatagramPeerIO_handler_otp_warning handler_otp_warning, void *user)
-{
-    // init error domain
-    FlowErrorDomain_Init(&o->domain, (FlowErrorDomain_handler)error_handler, o);
-    
-    // init receiving
-    
-    // init assembler
-    if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, num_frames, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
-        BLog(BLOG_ERROR, "FragmentProtoAssembler_Init failed");
-        goto fail0;
-    }
-    
-    // init notifier
-    PacketPassNotifier_Init(&o->recv_notifier, FragmentProtoAssembler_GetInput(&o->recv_assembler), BReactor_PendingGroup(o->reactor));
-    
-    // init decoder
-    if (!SPProtoDecoder_Init(&o->recv_decoder, PacketPassNotifier_GetInput(&o->recv_notifier), o->sp_params, 2, BReactor_PendingGroup(o->reactor))) {
-        BLog(BLOG_ERROR, "SPProtoDecoder_Init failed");
-        goto fail1;
-    }
-    
-    // init connector
-    PacketRecvConnector_Init(&o->recv_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
-    
-    // init buffer
-    if (!SinglePacketBuffer_Init(&o->recv_buffer, PacketRecvConnector_GetOutput(&o->recv_connector), SPProtoDecoder_GetInput(&o->recv_decoder), BReactor_PendingGroup(o->reactor))) {
-        BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
-        goto fail2;
-    }
-    
-    // init sending base
-    
-    // init disassembler
-    FragmentProtoDisassembler_Init(&o->send_disassembler, o->reactor, o->payload_mtu, o->spproto_payload_mtu, -1, latency);
-    
-    // init encoder
-    if (!SPProtoEncoder_Init(&o->send_encoder, FragmentProtoDisassembler_GetOutput(&o->send_disassembler), o->sp_params, otp_warning_count, handler_otp_warning, user, BReactor_PendingGroup(o->reactor))) {
-        BLog(BLOG_ERROR, "SPProtoEncoder_Init failed");
-        goto fail3;
-    }
-    
-    // init connector
-    PacketPassConnector_Init(&o->send_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
-    
-    // init buffer
-    if (!SinglePacketBuffer_Init(&o->send_buffer, SPProtoEncoder_GetOutput(&o->send_encoder), PacketPassConnector_GetInput(&o->send_connector), BReactor_PendingGroup(o->reactor))) {
-        BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
-        goto fail4;
-    }
-    
-    return 1;
-
-fail4:
-    PacketPassConnector_Free(&o->send_connector);
-    SPProtoEncoder_Free(&o->send_encoder);
-fail3:
-    FragmentProtoDisassembler_Free(&o->send_disassembler);
-    SinglePacketBuffer_Free(&o->recv_buffer);
-fail2:
-    PacketRecvConnector_Free(&o->recv_connector);
-    SPProtoDecoder_Free(&o->recv_decoder);
-fail1:
-    PacketPassNotifier_Free(&o->recv_notifier);
-    FragmentProtoAssembler_Free(&o->recv_assembler);
-fail0:
-    return 0;
-}
-
-void free_persistent_io (DatagramPeerIO *o)
-{
-    // free sending base
-    SinglePacketBuffer_Free(&o->send_buffer);
-    PacketPassConnector_Free(&o->send_connector);
-    SPProtoEncoder_Free(&o->send_encoder);
-    FragmentProtoDisassembler_Free(&o->send_disassembler);
-    
-    // free receiving
-    SinglePacketBuffer_Free(&o->recv_buffer);
-    PacketRecvConnector_Free(&o->recv_connector);
-    SPProtoDecoder_Free(&o->recv_decoder);
-    PacketPassNotifier_Free(&o->recv_notifier);
-    FragmentProtoAssembler_Free(&o->recv_assembler);
-}
-
 void init_sending (DatagramPeerIO *o, BAddr addr, BIPAddr local_addr)
 {
     // init sink
@@ -282,34 +195,90 @@ int DatagramPeerIO_Init (
     // check payload MTU (for FragmentProto)
     if (o->payload_mtu > UINT16_MAX) {
         BLog(BLOG_ERROR, "payload MTU is too big");
-        goto fail1;
+        goto fail0;
     }
     
     // calculate SPProto payload MTU
     if ((o->spproto_payload_mtu = spproto_payload_mtu_for_carrier_mtu(o->sp_params, socket_mtu)) <= (int)sizeof(struct fragmentproto_chunk_header)) {
         BLog(BLOG_ERROR, "socket MTU is too small");
-        goto fail1;
+        goto fail0;
     }
     
     // calculate effective socket MTU
     if ((o->effective_socket_mtu = spproto_carrier_mtu_for_payload_mtu(o->sp_params, o->spproto_payload_mtu)) < 0) {
         BLog(BLOG_ERROR, "spproto_carrier_mtu_for_payload_mtu failed !?");
-        goto fail1;
+        goto fail0;
     }
     
-    // set mode none
-    o->mode = DATAGRAMPEERIO_MODE_NONE;
+    // init error domain
+    FlowErrorDomain_Init(&o->domain, (FlowErrorDomain_handler)error_handler, o);
     
-    // init persistent I/O objects
-    if (!init_persistent_io(o, latency, num_frames, recv_userif, otp_warning_count, handler_otp_warning, user)) {
+    // init receiving
+    
+    // init assembler
+    if (!FragmentProtoAssembler_Init(&o->recv_assembler, o->spproto_payload_mtu, recv_userif, num_frames, fragmentproto_max_chunks_for_frame(o->spproto_payload_mtu, o->payload_mtu), BReactor_PendingGroup(o->reactor))) {
+        BLog(BLOG_ERROR, "FragmentProtoAssembler_Init failed");
+        goto fail0;
+    }
+    
+    // init notifier
+    PacketPassNotifier_Init(&o->recv_notifier, FragmentProtoAssembler_GetInput(&o->recv_assembler), BReactor_PendingGroup(o->reactor));
+    
+    // init decoder
+    if (!SPProtoDecoder_Init(&o->recv_decoder, PacketPassNotifier_GetInput(&o->recv_notifier), o->sp_params, 2, BReactor_PendingGroup(o->reactor))) {
+        BLog(BLOG_ERROR, "SPProtoDecoder_Init failed");
         goto fail1;
     }
     
+    // init connector
+    PacketRecvConnector_Init(&o->recv_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
+    
+    // init buffer
+    if (!SinglePacketBuffer_Init(&o->recv_buffer, PacketRecvConnector_GetOutput(&o->recv_connector), SPProtoDecoder_GetInput(&o->recv_decoder), BReactor_PendingGroup(o->reactor))) {
+        BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
+        goto fail2;
+    }
+    
+    // init sending base
+    
+    // init disassembler
+    FragmentProtoDisassembler_Init(&o->send_disassembler, o->reactor, o->payload_mtu, o->spproto_payload_mtu, -1, latency);
+    
+    // init encoder
+    if (!SPProtoEncoder_Init(&o->send_encoder, FragmentProtoDisassembler_GetOutput(&o->send_disassembler), o->sp_params, otp_warning_count, handler_otp_warning, user, BReactor_PendingGroup(o->reactor))) {
+        BLog(BLOG_ERROR, "SPProtoEncoder_Init failed");
+        goto fail3;
+    }
+    
+    // init connector
+    PacketPassConnector_Init(&o->send_connector, o->effective_socket_mtu, BReactor_PendingGroup(o->reactor));
+    
+    // init buffer
+    if (!SinglePacketBuffer_Init(&o->send_buffer, SPProtoEncoder_GetOutput(&o->send_encoder), PacketPassConnector_GetInput(&o->send_connector), BReactor_PendingGroup(o->reactor))) {
+        BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed");
+        goto fail4;
+    }
+    
+    // set mode
+    o->mode = DATAGRAMPEERIO_MODE_NONE;
+    
     DebugObject_Init(&o->d_obj);
     
     return 1;
     
+fail4:
+    PacketPassConnector_Free(&o->send_connector);
+    SPProtoEncoder_Free(&o->send_encoder);
+fail3:
+    FragmentProtoDisassembler_Free(&o->send_disassembler);
+    SinglePacketBuffer_Free(&o->recv_buffer);
+fail2:
+    PacketRecvConnector_Free(&o->recv_connector);
+    SPProtoDecoder_Free(&o->recv_decoder);
 fail1:
+    PacketPassNotifier_Free(&o->recv_notifier);
+    FragmentProtoAssembler_Free(&o->recv_assembler);
+fail0:
     return 0;
 }
 
@@ -320,8 +289,18 @@ void DatagramPeerIO_Free (DatagramPeerIO *o)
     // reset mode
     reset_mode(o);
     
-    // free persistent I/O objects
-    free_persistent_io(o);
+    // free sending base
+    SinglePacketBuffer_Free(&o->send_buffer);
+    PacketPassConnector_Free(&o->send_connector);
+    SPProtoEncoder_Free(&o->send_encoder);
+    FragmentProtoDisassembler_Free(&o->send_disassembler);
+    
+    // free receiving
+    SinglePacketBuffer_Free(&o->recv_buffer);
+    PacketRecvConnector_Free(&o->recv_connector);
+    SPProtoDecoder_Free(&o->recv_decoder);
+    PacketPassNotifier_Free(&o->recv_notifier);
+    FragmentProtoAssembler_Free(&o->recv_assembler);
 }
 
 PacketPassInterface * DatagramPeerIO_GetSendInput (DatagramPeerIO *o)