Sfoglia il codice sorgente

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 anni fa
parent
commit
0b916dfca2
1 ha cambiato i file con 25 aggiunte e 85 eliminazioni
  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)