[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 ();
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r30839 - msh/src,
gnunet <=