فهرست منبع

server: do cleanup in one place (error and normal exit). This is possible now that all processing is done using jobs, and there are no error reporters enforcing
immediate cleanup with dead vars.

ambrop7 15 سال پیش
والد
کامیت
0b916dfca2
1فایلهای تغییر یافته به همراه25 افزوده شده و 85 حذف شده
  1. 25 85
      server/server.c

+ 25 - 85
server/server.c

@@ -490,75 +490,9 @@ int main (int argc, char *argv[])
         num_listeners++;
     }
     
-    goto event_loop;
-    
-    // cleanup on error
-fail7:
-    while (num_listeners > 0) {
-        num_listeners--;
-        Listener_Free(&listeners[num_listeners]);
-    }
-fail6:
-    if (options.ssl) {
-        ASSERT_FORCE(PR_Close(model_prfd) == PR_SUCCESS)
-fail5:
-        CERT_DestroyCertificate(server_cert);
-        SECKEY_DestroyPrivateKey(server_key);
-fail4a:
-        SSL_ShutdownServerSessionIDCache();
-fail4:
-        ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
-fail3:
-        ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
-        PL_ArenaFinish();
-    }
-    BSignal_Finish();
-fail2a:
-    BReactor_Free(&ss);
-fail2:
-    if (options.relay_predicate) {
-        BPredicateFunction_Free(&relay_predicate_func_raddr);
-        BPredicateFunction_Free(&relay_predicate_func_paddr);
-        BPredicateFunction_Free(&relay_predicate_func_rname);
-        BPredicateFunction_Free(&relay_predicate_func_pname);
-        BPredicate_Free(&relay_predicate);
-    }
-fail1_1:
-    if (options.comm_predicate) {
-        BPredicateFunction_Free(&comm_predicate_func_p2addr);
-        BPredicateFunction_Free(&comm_predicate_func_p1addr);
-        BPredicateFunction_Free(&comm_predicate_func_p2name);
-        BPredicateFunction_Free(&comm_predicate_func_p1name);
-        BPredicate_Free(&comm_predicate);
-    }
-fail1:
-    BLog(BLOG_ERROR, "initialization failed");
-    BLog_Free();
-fail0:
-    DebugObjectGlobal_Finish();
-    return 1;
-    
-event_loop:
     // enter event loop
     BLog(BLOG_NOTICE, "entering event loop");
-    int ret = BReactor_Exec(&ss);
-    
-    // free reactor
-    BReactor_Free(&ss);
-    
-    // free logger
-    BLog(BLOG_NOTICE, "exiting");
-    BLog_Free();
-    
-    // finish objects
-    DebugObjectGlobal_Finish();
-    
-    return ret;
-}
-
-void terminate (void)
-{
-    BLog(BLOG_NOTICE, "tearing down");
+    BReactor_Exec(&ss);
     
     // free clients
     LinkedList2Node *node;
@@ -595,36 +529,31 @@ void terminate (void)
         // deallocate client
         client_dealloc(client);
     }
-    
-    // free listeners
+fail7:
     while (num_listeners > 0) {
         num_listeners--;
         Listener_Free(&listeners[num_listeners]);
     }
     
     if (options.ssl) {
-        // free model
+fail6:
         ASSERT_FORCE(PR_Close(model_prfd) == PR_SUCCESS)
-        
-        // free certificate and private key
+fail5:
         CERT_DestroyCertificate(server_cert);
         SECKEY_DestroyPrivateKey(server_key);
-        
-        // free server cache
-        SSL_ShutdownServerSessionIDCache();
-        
-        // free NSS
+fail4a:
+        ASSERT_FORCE(SSL_ShutdownServerSessionIDCache() == SECSuccess)
+fail4:
         ASSERT_FORCE(NSS_Shutdown() == SECSuccess)
-        
-        // free NSPR
+fail3:
         ASSERT_FORCE(PR_Cleanup() == PR_SUCCESS)
         PL_ArenaFinish();
     }
     
-    // remove signal handler
     BSignal_Finish();
-    
-    // free relay predicate
+fail2a:
+    BReactor_Free(&ss);
+fail2:
     if (options.relay_predicate) {
         BPredicateFunction_Free(&relay_predicate_func_raddr);
         BPredicateFunction_Free(&relay_predicate_func_paddr);
@@ -632,8 +561,7 @@ void terminate (void)
         BPredicateFunction_Free(&relay_predicate_func_pname);
         BPredicate_Free(&relay_predicate);
     }
-    
-    // free communication predicate
+fail1_1:
     if (options.comm_predicate) {
         BPredicateFunction_Free(&comm_predicate_func_p2addr);
         BPredicateFunction_Free(&comm_predicate_func_p1addr);
@@ -641,9 +569,21 @@ void terminate (void)
         BPredicateFunction_Free(&comm_predicate_func_p1name);
         BPredicate_Free(&comm_predicate);
     }
+fail1:
+    BLog(BLOG_NOTICE, "exiting");
+    BLog_Free();
+fail0:
+    DebugObjectGlobal_Finish();
+    
+    return 1;
+}
+
+void terminate (void)
+{
+    BLog(BLOG_NOTICE, "tearing down");
     
     // exit event loop
-    BReactor_Quit(&ss, 1);
+    BReactor_Quit(&ss, 0);
 }
 
 void print_help (const char *name)