[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r26340 - gnunet/src/testbed
From: |
gnunet |
Subject: |
[GNUnet-SVN] r26340 - gnunet/src/testbed |
Date: |
Wed, 6 Mar 2013 16:17:14 +0100 |
Author: harsha
Date: 2013-03-06 16:17:14 +0100 (Wed, 06 Mar 2013)
New Revision: 26340
Modified:
gnunet/src/testbed/gnunet-helper-testbed.c
gnunet/src/testbed/test_gnunet_helper_testbed.c
Log:
Don't call gnunet scheduler from signal handler. Instead, write to a pipe
(ARM-style) to run a scheduler task when signal is received.
Modified: gnunet/src/testbed/gnunet-helper-testbed.c
===================================================================
--- gnunet/src/testbed/gnunet-helper-testbed.c 2013-03-06 14:55:27 UTC (rev
26339)
+++ gnunet/src/testbed/gnunet-helper-testbed.c 2013-03-06 15:17:14 UTC (rev
26340)
@@ -109,6 +109,11 @@
static struct GNUNET_OS_Process *testbed;
/**
+ * Pipe used to communicate shutdown via signal.
+ */
+static struct GNUNET_DISK_PipeHandle *sigpipe;
+
+/**
* Task identifier for the read task
*/
static GNUNET_SCHEDULER_TaskIdentifier read_task_id;
@@ -119,6 +124,11 @@
static GNUNET_SCHEDULER_TaskIdentifier write_task_id;
/**
+ * Task to kill the child
+ */
+static GNUNET_SCHEDULER_TaskIdentifier child_death_task_id;
+
+/**
* Are we done reading messages from stdin?
*/
static int done_reading;
@@ -166,15 +176,7 @@
{
LOG_DEBUG ("Killing testbed\n");
GNUNET_break (0 == GNUNET_OS_process_kill (testbed, SIGTERM));
- GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (testbed));
- GNUNET_OS_process_destroy (testbed);
- testbed = NULL;
}
- if (NULL != test_system)
- {
- GNUNET_TESTING_system_destroy (test_system, GNUNET_YES);
- test_system = NULL;
- }
}
@@ -414,6 +416,42 @@
/**
+ * Task triggered whenever we receive a SIGCHLD (child
+ * process died).
+ *
+ * @param cls closure, NULL if we need to self-restart
+ * @param tc context
+ */
+static void
+child_death_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ const struct GNUNET_DISK_FileHandle *pr;
+ char c[16];
+
+ pr = GNUNET_DISK_pipe_handle (sigpipe, GNUNET_DISK_PIPE_END_READ);
+ child_death_task_id = GNUNET_SCHEDULER_NO_TASK;
+ if (0 == (tc->reason & GNUNET_SCHEDULER_REASON_READ_READY))
+ {
+ child_death_task_id =
+ GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ pr, &child_death_task, NULL);
+ return;
+ }
+ /* consume the signal */
+ GNUNET_break (0 < GNUNET_DISK_file_read (pr, &c, sizeof (c)));
+ LOG_DEBUG ("Child died\n");
+ GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (testbed));
+ GNUNET_OS_process_destroy (testbed);
+ testbed = NULL;
+ if (NULL != test_system)
+ {
+ GNUNET_TESTING_system_destroy (test_system, GNUNET_YES);
+ test_system = NULL;
+ }
+}
+
+
+/**
* Main function that will be run.
*
* @param cls closure
@@ -434,6 +472,11 @@
&read_task, NULL);
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
NULL);
+ child_death_task_id =
+ GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ GNUNET_DISK_pipe_handle (sigpipe,
+
GNUNET_DISK_PIPE_END_READ),
+ &child_death_task, NULL);
}
@@ -443,14 +486,15 @@
static void
sighandler_child_death ()
{
- if ((NULL != testbed) && (GNUNET_NO == in_shutdown))
- {
- LOG_DEBUG ("Child died\n");
- GNUNET_assert (GNUNET_OK == GNUNET_OS_process_wait (testbed));
- GNUNET_OS_process_destroy (testbed);
- testbed = NULL;
- GNUNET_SCHEDULER_shutdown (); /* We are done too! */
- }
+ static char c;
+ int old_errno; /* back-up errno */
+
+ old_errno = errno;
+ GNUNET_break (1 ==
+ GNUNET_DISK_file_write (GNUNET_DISK_pipe_handle
+ (sigpipe, GNUNET_DISK_PIPE_END_WRITE),
+ &c, sizeof (c)));
+ errno = old_errno;
}
@@ -473,6 +517,13 @@
status = GNUNET_OK;
in_shutdown = GNUNET_NO;
+ if (NULL == (sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO,
+ GNUNET_NO, GNUNET_NO)))
+ {
+ GNUNET_break (0);
+ ret = GNUNET_SYSERR;
+ return 1;
+ }
shc_chld =
GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death);
ret =
@@ -481,6 +532,7 @@
&run, NULL);
GNUNET_SIGNAL_handler_uninstall (shc_chld);
shc_chld = NULL;
+ GNUNET_DISK_pipe_close (sigpipe);
if (GNUNET_OK != ret)
return 1;
return (GNUNET_OK == status) ? 0 : 1;
Modified: gnunet/src/testbed/test_gnunet_helper_testbed.c
===================================================================
--- gnunet/src/testbed/test_gnunet_helper_testbed.c 2013-03-06 14:55:27 UTC
(rev 26339)
+++ gnunet/src/testbed/test_gnunet_helper_testbed.c 2013-03-06 15:17:14 UTC
(rev 26340)
@@ -206,14 +206,14 @@
"gnunet-helper-testbed",
NULL
};
- const char *controller_name = "127.0.0.1";
+ const char *trusted_ip = "127.0.0.1";
helper =
GNUNET_HELPER_start (GNUNET_YES, "gnunet-helper-testbed", binary_argv,
&mst_cb, &exp_cb, NULL);
GNUNET_assert (NULL != helper);
cfg = GNUNET_CONFIGURATION_dup (cfg2);
- msg = GNUNET_TESTBED_create_helper_init_msg_ (controller_name, NULL, cfg);
+ msg = GNUNET_TESTBED_create_helper_init_msg_ (trusted_ip, NULL, cfg);
shandle =
GNUNET_HELPER_send (helper, &msg->header, GNUNET_NO, &cont_cb, NULL);
GNUNET_assert (NULL != shandle);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r26340 - gnunet/src/testbed,
gnunet <=