+ struct GNUNET_SCHEDULER_Task tsk;
+ const struct GNUNET_DISK_FileHandle *pr;
+ scheduler_driver = driver;
+
+ /* general set-up */
+ GNUNET_assert (NULL == active_task);
+ GNUNET_assert (NULL == shutdown_pipe_handle);
+ shutdown_pipe_handle = GNUNET_DISK_pipe (GNUNET_NO,
+ GNUNET_NO,
+ GNUNET_NO,
+ GNUNET_NO);
+ GNUNET_assert (NULL != shutdown_pipe_handle);
+ pr = GNUNET_DISK_pipe_handle (shutdown_pipe_handle,
+ GNUNET_DISK_PIPE_END_READ);
+ GNUNET_assert (NULL != pr);
+ my_pid = getpid ();
+
+ /* install signal handlers */
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Registering signal handlers\n");
+ shc_int = GNUNET_SIGNAL_handler_install (SIGINT,
+ &sighandler_shutdown);
+ shc_term = GNUNET_SIGNAL_handler_install (SIGTERM,
+ &sighandler_shutdown);
+#if (SIGTERM != GNUNET_TERM_SIG)
+ shc_gterm = GNUNET_SIGNAL_handler_install (GNUNET_TERM_SIG,
+ &sighandler_shutdown);
+#endif
+#ifndef MINGW
+ shc_pipe = GNUNET_SIGNAL_handler_install (SIGPIPE,
+ &sighandler_pipe);
+ shc_quit = GNUNET_SIGNAL_handler_install (SIGQUIT,
+ &sighandler_shutdown);
+ shc_hup = GNUNET_SIGNAL_handler_install (SIGHUP,
+ &sighandler_shutdown);
+#endif
+
+ /* Setup initial tasks */
+ current_priority = GNUNET_SCHEDULER_PRIORITY_DEFAULT;
+ current_lifeness = GNUNET_YES;
+ memset (&tsk,
+ 0,
+ sizeof (tsk));
+ active_task = &tsk;
+ tsk.sh = &sh;
+ GNUNET_SCHEDULER_add_with_reason_and_priority (task,
+ task_cls,
+ GNUNET_SCHEDULER_REASON_STARTUP,
+ GNUNET_SCHEDULER_PRIORITY_DEFAULT);
+ GNUNET_SCHEDULER_add_now_with_lifeness (GNUNET_NO,
+ &GNUNET_OS_install_parent_control_handler,
+ NULL);
+ active_task = NULL;
+ driver->set_wakeup (driver->cls,
+ GNUNET_TIME_absolute_get ());
+
+ /* begin main event loop */
+ sh.rs = GNUNET_NETWORK_fdset_create ();
+ sh.ws = GNUNET_NETWORK_fdset_create ();
+ GNUNET_NETWORK_fdset_handle_set (sh.rs, pr);
+ sh.driver = driver;
+ ret = driver->loop (driver->cls,
+ &sh);
+ GNUNET_NETWORK_fdset_destroy (sh.rs);
+ GNUNET_NETWORK_fdset_destroy (sh.ws);
+
+ /* uninstall signal handlers */
+ GNUNET_SIGNAL_handler_uninstall (shc_int);
+ GNUNET_SIGNAL_handler_uninstall (shc_term);
+#if (SIGTERM != GNUNET_TERM_SIG)
+ GNUNET_SIGNAL_handler_uninstall (shc_gterm);
+#endif
+#ifndef MINGW
+ GNUNET_SIGNAL_handler_uninstall (shc_pipe);
+ GNUNET_SIGNAL_handler_uninstall (shc_quit);
+ GNUNET_SIGNAL_handler_uninstall (shc_hup);
+#endif
+ GNUNET_DISK_pipe_close (shutdown_pipe_handle);
+ shutdown_pipe_handle = NULL;
+ return ret;
+}
+
+int
+select_add(void *cls,
+ struct GNUNET_SCHEDULER_Task *task,
+ struct GNUNET_SCHEDULER_FdInfo *fdi){
+
+ GNUNET_CONTAINER_DLL_insert (pending_head,
+ pending_tail,
+ task);
+
+}
+
+int
+select_del(void *cls,
+ struct GNUNET_SCHEDULER_Task *task,
+ struct GNUNET_SCHEDULER_FdInfo *fdi){
+
+ GNUNET_CONTAINER_DLL_remove (pending_head,
+ pending_tail,
+ task);
+
+}
+
+
+int
+select_loop(void *cls,
+ struct GNUNET_SCHEDULER_Handle *sh){
+
+ while_live(sh->rs, sh->ws);
+
+}
+
+static void
+select_set_wakeup(void *cls,
+ struct GNUNET_TIME_Absolute dt){
+
+
+
+}
+
+
+/**
+ * Obtain the driver for using select() as the event loop.
+ *
+ * @return NULL on error
+ */
+const struct GNUNET_SCHEDULER_Driver *
+GNUNET_SCHEDULER_driver_select ()
+{
+
+ struct GNUNET_SCHEDULER_Driver *select_driver;
+
+ select_driver = GNUNET_new (struct GNUNET_SCHEDULER_Driver);
+
+ select_driver->loop = &select_loop;
+ select_driver->add = &select_add;
+ select_driver->del = &select_del;
+ select_driver->set_wakeup = &select_set_wakeup;
+
+
+ return select_driver;