Просмотр исходного кода

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 лет назад
Родитель
Сommit
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)