gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r30839 - msh/src


From: gnunet
Subject: [GNUnet-SVN] r30839 - msh/src
Date: Thu, 21 Nov 2013 16:24:22 +0100

Author: harsha
Date: 2013-11-21 16:24:21 +0100 (Thu, 21 Nov 2013)
New Revision: 30839

Modified:
   msh/src/mshd.c
   msh/src/server.c
Log:
- restart scheduler after fork


Modified: msh/src/mshd.c
===================================================================
--- msh/src/mshd.c      2013-11-21 09:57:55 UTC (rev 30838)
+++ msh/src/mshd.c      2013-11-21 15:24:21 UTC (rev 30839)
@@ -376,7 +376,7 @@
            (GNUNET_TIME_UNIT_FOREVER_REL, &do_shutdown, NULL);
       while (NULL != chld)
       {
-        GNUNET_break (0 == kill (chld->pid, SIGTERM));
+        GNUNET_break (0 == kill (chld->pid, GNUNET_TERM_SIG));
         chld = chld->next;
       }
       return;
@@ -385,7 +385,8 @@
     break;
   case MODE_LOCAL_SERV:
     shutdown_local_server ();
-    MSH_pmonitor_shutdown ();
+    if (0 == rank)
+      MSH_pmonitor_shutdown ();
     break;
   case MODE_WORKER:
     shutdown_daemon_server ();
@@ -512,17 +513,25 @@
  * it then forks and execs the remote command.
  */
 static pid_t
-spawn_worker (struct GNUNET_CONNECTION_Handle *conn)
+spawn_worker (struct GNUNET_NETWORK_Handle *sock)
 {
+  struct ChildProc *chld;
+  struct GNUNET_CONNECTION_Handle *conn;
   pid_t ret;
 
   ret = fork ();
   if (0 != ret)
+    return ret;
+  /* Child process continues here */
+  conn = GNUNET_CONNECTION_create_from_existing (sock);
+  sock = NULL;
+  GNUNET_log_setup ("mshd-worker", NULL, NULL);
+  /* cleanup child processes as we are now not their parent */
+  while (NULL != (chld = chld_head))
   {
-    GNUNET_CONNECTION_destroy (conn);
-    return ret;
+    GNUNET_CONTAINER_DLL_remove (chld_head, chld_tail, chld);
+    GNUNET_free (chld);
   }
-  /* Child process continues here */
   GNUNET_assert (MODE_SERV == mode);
   GNUNET_SCHEDULER_cancel (shutdown_task);
   shutdown_task = GNUNET_SCHEDULER_NO_TASK;
@@ -537,6 +546,23 @@
 
 
 /**
+ * A worker process we forked earlier has exited.
+ *
+ * @param cls the child context
+ * @param type the process status type
+ * @param long the return/exit code of the process
+ */
+static void
+worker_exit_cb (void *cls, enum GNUNET_OS_ProcessStatusType type, int code)
+{
+  struct ChildProc *chld = cls;
+
+  GNUNET_CONTAINER_DLL_remove (chld_head, chld_tail, chld);
+  GNUNET_free (chld);
+}
+
+
+/**
  * Task to call accept and close on a listening socket
  *
  * @param cls NULL
@@ -546,7 +572,9 @@
 accept_conn (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct ReadContext *rctx;
+  struct GNUNET_NETWORK_Handle *sock;
   struct GNUNET_CONNECTION_Handle *conn;
+  struct ChildProc *chld;
   pid_t pid;
 
   accept_task = GNUNET_SCHEDULER_NO_TASK;
@@ -572,16 +600,21 @@
     GNUNET_CONTAINER_DLL_insert_tail (rhead, rtail, rctx);    
     break;
   case MODE_SERV:
-    conn = GNUNET_CONNECTION_create_from_accept (NULL, NULL, listen_socket);
-    pid = spawn_worker (conn);
+    sock = GNUNET_NETWORK_socket_accept (listen_socket, NULL, NULL);
+    pid = spawn_worker (sock);
+    if (0 == pid)               /* state is cleared and hence we return */
+      return;
+    GNUNET_NETWORK_socket_close (sock);
     if (-1 == pid)
     {
       GNUNET_break (0);
       GNUNET_SCHEDULER_shutdown ();
       goto clo_ret;
     }
-    if (0 == pid)               /* state is cleared and hence we return */
-      return;
+    chld = GNUNET_new (struct ChildProc);
+    chld->pid = pid;
+    GNUNET_CONTAINER_DLL_insert (chld_head, chld_tail, chld);
+    MSH_monitor_process_pid (pid, worker_exit_cb, chld);
     break;
   case MODE_LOCAL_SERV:
     GNUNET_assert (0);
@@ -695,6 +728,39 @@
 
 
 /**
+ * Task which will initiate the local address lookup server
+ */
+static void
+local_server_run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  rmap = addressmap_create_reverse_mapping (addrmap);
+  init_local_server (unixpath);
+  GNUNET_NETWORK_socket_close (listen_socket);
+  listen_socket = NULL;
+  if (0 == rank)
+  {
+    MSH_pmonitor_init ();
+    proc = GNUNET_OS_start_process_vap (GNUNET_NO,
+                                        GNUNET_OS_INHERIT_STD_ALL,
+                                        NULL,
+                                        NULL,
+                                        run_args[0],
+                                        run_args);
+    if (NULL == proc)
+    {
+      LOG_ERROR ("Unable to start process `%s'\n", run_args[0]);
+      GNUNET_SCHEDULER_shutdown ();
+      return;
+    }
+    MSH_monitor_process (proc, &proc_exit_cb, NULL);
+  }
+  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == shutdown_task);
+  shutdown_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+                                                &do_shutdown, NULL);
+}
+
+
+/**
  * Task for running a round
  *
  * @param cls NULL
@@ -753,28 +819,11 @@
   if (0 == pid)
   {
     GNUNET_log_setup ("mshd-local-serv", NULL, NULL);
-    rmap = addressmap_create_reverse_mapping (addrmap);
-    init_local_server (unixpath);
     mode = MODE_LOCAL_SERV;
-    GNUNET_NETWORK_socket_close (listen_socket);
-    listen_socket = NULL;
-    if (0 == rank)
-    {
-      MSH_pmonitor_init ();
-      proc = GNUNET_OS_start_process_vap (GNUNET_NO,
-                                          GNUNET_OS_INHERIT_STD_ALL,
-                                          NULL,
-                                          NULL,
-                                          run_args[0],
-                                          run_args);
-      if (NULL == proc)
-      {
-        LOG_ERROR ("Unable to start process `%s'\n", run_args[0]);
-        GNUNET_SCHEDULER_shutdown ();
-        return;
-      }
-      MSH_monitor_process (proc, &proc_exit_cb, NULL);
-    }
+    GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != shutdown_task);
+    GNUNET_SCHEDULER_cancel (shutdown_task);
+    shutdown_task = GNUNET_SCHEDULER_NO_TASK;
+    GNUNET_SCHEDULER_shutdown ();
     return;
   }
   GNUNET_assert (NULL != addrmap);
@@ -1365,6 +1414,14 @@
     GNUNET_break (0);
     goto fail;
   }
+  switch (mode)
+  {
+  case MODE_LOCAL_SERV:
+    GNUNET_SCHEDULER_run (&local_server_run, NULL);
+    break;
+  default:
+    break;
+  }
   ret = 0;
   
  fail:

Modified: msh/src/server.c
===================================================================
--- msh/src/server.c    2013-11-21 09:57:55 UTC (rev 30838)
+++ msh/src/server.c    2013-11-21 15:24:21 UTC (rev 30839)
@@ -18,14 +18,14 @@
   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, s)
 
 #define LOG(kind,...)                           \
-  GNUNET_log_from (kind, "server", __VA_ARGS__)
+  GNUNET_log_from (kind, "mshd-server", __VA_ARGS__)
 
 #define LOG_DEBUG(...) LOG(GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
 
 #define LOG_ERROR(...) LOG(GNUNET_ERROR_TYPE_ERROR, __VA_ARGS__)
 
 #define LOG_STRERROR(kind,cmd)                  \
-  GNUNET_log_from_strerror (kind, "mshd-error", cmd)
+  GNUNET_log_from_strerror (kind, "mshd-server", cmd)
 
 /**
  * server handle for accepting requests from local MSH instances
@@ -441,6 +441,7 @@
 void
 shutdown_local_server ()
 {
+  LOG_DEBUG ("Shutting down address lookup server\n");
   if (NULL != local_serv)
   {
     GNUNET_SERVER_destroy (local_serv);
@@ -1057,10 +1058,11 @@
   
   if (NULL == client)
     return;
-  LOG_DEBUG ("A remote client has disconnected\n");
+  LOG_DEBUG ("Remote client has disconnected\n");
   exec_ctx = GNUNET_SERVER_client_get_user_context (client, struct ExecCtx);
   GNUNET_assert (NULL != exec_ctx);
   destroy_exec_ctx (exec_ctx);
+  GNUNET_SCHEDULER_shutdown ();
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]