fix comment about mq allocation
[oweals/gnunet.git] / src / util / service_new.c
index 9929341f46e408870283a118c52f74c5fd43e325..744adc387dff2f3324e899ba7f09aeb325b7d697 100644 (file)
@@ -136,7 +136,7 @@ struct GNUNET_SERVICE_Handle
   /**
    * Message handlers to use for all clients.
    */
-  const struct GNUNET_MQ_MessageHandler *handlers;
+  struct GNUNET_MQ_MessageHandler *handlers;
 
   /**
    * Closure for @e task.
@@ -1616,12 +1616,24 @@ GNUNET_SERVICE_starT (const char *service_name,
   sh->connect_cb = connect_cb;
   sh->disconnect_cb = disconnect_cb;
   sh->cb_cls = cls;
-  sh->handlers = handlers;
+  if (NULL != handlers)
+  {
+    unsigned int i;
+
+    for (i=0;NULL != handlers[i].cb; i++) ;
+    sh->handlers = GNUNET_new_array (i + 1,
+                                    struct GNUNET_MQ_MessageHandler);
+    GNUNET_memcpy (sh->handlers,
+                   handlers,
+                   i * sizeof (struct GNUNET_MQ_MessageHandler));
+  }
   if (GNUNET_OK != setup_service (sh))
   {
+    GNUNET_free (sh->handlers);
     GNUNET_free (sh);
     return NULL;
   }
+  GNUNET_SERVICE_resume (sh);
   return sh;
 }
 
@@ -1634,7 +1646,13 @@ GNUNET_SERVICE_starT (const char *service_name,
 void
 GNUNET_SERVICE_stoP (struct GNUNET_SERVICE_Handle *srv)
 {
+  struct GNUNET_SERVICE_Client *client;
+
+  GNUNET_SERVICE_suspend (srv);
+  while (NULL != (client = srv->clients_head))
+    GNUNET_SERVICE_client_drop (client);
   teardown_service (srv);
+  GNUNET_free (srv->handlers);
   GNUNET_free (srv);
 }
 
@@ -1736,7 +1754,17 @@ GNUNET_SERVICE_ruN_ (int argc,
   sh.connect_cb = connect_cb;
   sh.disconnect_cb = disconnect_cb;
   sh.cb_cls = cls;
-  sh.handlers = handlers;
+  if (NULL != handlers)
+  {
+    unsigned int i;
+
+    for (i=0;NULL != handlers[i].cb; i++) ;
+    sh.handlers = GNUNET_new_array (i + 1,
+                                    struct GNUNET_MQ_MessageHandler);
+    GNUNET_memcpy (sh.handlers,
+                   handlers,
+                   i * sizeof (struct GNUNET_MQ_MessageHandler));
+  }
   sh.service_name = service_name;
 
   /* setup subsystems */
@@ -1867,7 +1895,7 @@ shutdown:
   }
 #endif
   teardown_service (&sh);
-
+  GNUNET_free (sh.handlers);
   GNUNET_SPEEDUP_stop_ ();
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (logfile);