From 9edcee802d2b2e1b2ce73f840c84ab84544093b5 Mon Sep 17 00:00:00 2001 From: Nils Durner Date: Fri, 13 Nov 2009 21:49:46 +0000 Subject: [PATCH] various fixes --- src/util/network.c | 99 ++++++++++++++++++++++----------------- src/util/scheduler.c | 4 +- src/util/test_scheduler.c | 6 +-- 3 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/util/network.c b/src/util/network.c index 5d7370003..3d2ff51de 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -636,6 +636,9 @@ GNUNET_NETWORK_fdset_add (struct GNUNET_NETWORK_FDSet *dst, if (nfds + 1 > dst->nsds) dst->nsds = nfds + 1; } +#ifdef MINGW + GNUNET_CONTAINER_slist_append (dst->handles, src->handles); +#endif } @@ -652,21 +655,8 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to, to->nsds = from->nsds; #ifdef MINGW - struct GNUNET_CONTAINER_SList_Iterator *iter; GNUNET_CONTAINER_slist_clear (to->handles); - for (iter = GNUNET_CONTAINER_slist_begin (from->handles); - GNUNET_CONTAINER_slist_end (iter) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (iter)) - - { - void *handle; - size_t len; - handle = GNUNET_CONTAINER_slist_get (iter, &len); - GNUNET_CONTAINER_slist_add (to->handles, - GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, - handle, len); - } - GNUNET_CONTAINER_slist_iter_destroy (iter); + GNUNET_CONTAINER_slist_append (to->handles, from->handles); #endif /* */ } @@ -697,7 +687,7 @@ GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds, #ifdef MINGW HANDLE hw; GNUNET_DISK_internal_file_handle_ (h, &hw, sizeof (HANDLE)); - GNUNET_CONTAINER_slist_add (fds->handles, GNUNET_NO, &hw, sizeof (HANDLE)); + GNUNET_CONTAINER_slist_add (fds->handles, GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &hw, sizeof (HANDLE)); #else /* */ int fd; @@ -722,7 +712,7 @@ GNUNET_NETWORK_fdset_handle_isset (const struct GNUNET_NETWORK_FDSet *fds, { #ifdef MINGW - return GNUNET_CONTAINER_slist_contains (fds->handles, h->h, + return GNUNET_CONTAINER_slist_contains (fds->handles, &h->h, sizeof (HANDLE)); #else /* */ @@ -749,6 +739,24 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, for (; nfds >= 0; nfds--) if (FD_ISSET (nfds, &fds1->sds) && FD_ISSET (nfds, &fds2->sds)) return GNUNET_YES; +#ifdef MINGW + { + struct GNUNET_CONTAINER_SList_Iterator *it; + + for(it = GNUNET_CONTAINER_slist_begin (fds1->handles); GNUNET_CONTAINER_slist_end (it) != GNUNET_YES; GNUNET_CONTAINER_slist_next (it)) + { + HANDLE *h; + + h = GNUNET_CONTAINER_slist_get (it, NULL); + if (GNUNET_CONTAINER_slist_contains (fds2->handles, h, sizeof (HANDLE))) + { + GNUNET_CONTAINER_slist_iter_destroy (it); + return GNUNET_YES; + } + } + GNUNET_CONTAINER_slist_iter_destroy (it); + } +#endif return GNUNET_NO; } @@ -859,6 +867,8 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, DWORD limit; fd_set sock_read, sock_write, sock_except; fd_set aread, awrite, aexcept; + struct GNUNET_CONTAINER_SList *handles_read, *handles_write, *handles_except; + int i; struct timeval tvslice; int retcode; @@ -880,6 +890,11 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, Sleep (ms_total); return 0; } + + handles_read = GNUNET_CONTAINER_slist_create (); + handles_write = GNUNET_CONTAINER_slist_create (); + handles_except = GNUNET_CONTAINER_slist_create (); + if (rfds) sock_read = rfds->sds; else @@ -936,22 +951,16 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, { struct GNUNET_CONTAINER_SList_Iterator *i; - int on_next; - on_next = GNUNET_NO; for (i = GNUNET_CONTAINER_slist_begin (rfds->handles); GNUNET_CONTAINER_slist_end (i) != GNUNET_YES; - on_next || GNUNET_CONTAINER_slist_next (i)) + GNUNET_CONTAINER_slist_next (i)) { HANDLE h; DWORD dwBytes; h = *(HANDLE *) GNUNET_CONTAINER_slist_get (i, NULL); - on_next = GNUNET_NO; if (!PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL)) - { - GNUNET_CONTAINER_slist_erase (i); - on_next = GNUNET_YES; retcode = -1; SetErrnoFromWinError (GetLastError ()); @@ -962,19 +971,14 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, #endif /* */ goto select_loop_end; } - else if (dwBytes) { + GNUNET_CONTAINER_slist_add (handles_read, + GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &h, + sizeof (HANDLE)); retcode++; } - - else - - { - GNUNET_CONTAINER_slist_erase (i); - on_next = GNUNET_YES; - } } GNUNET_CONTAINER_slist_iter_destroy (i); } @@ -984,33 +988,31 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, { struct GNUNET_CONTAINER_SList_Iterator *i; - int on_next; - on_next = GNUNET_NO; for (i = GNUNET_CONTAINER_slist_begin (efds->handles); GNUNET_CONTAINER_slist_end (i) != GNUNET_YES; - on_next || GNUNET_CONTAINER_slist_next (i)) + GNUNET_CONTAINER_slist_next (i)) { HANDLE h; DWORD dwBytes; h = *(HANDLE *) GNUNET_CONTAINER_slist_get (i, NULL); - if (PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL)) + if (!PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL)) { - GNUNET_CONTAINER_slist_erase (i); - on_next = GNUNET_YES; + GNUNET_CONTAINER_slist_add (handles_except, + GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &h, + sizeof (HANDLE)); retcode++; } - - else - on_next = GNUNET_NO; } GNUNET_CONTAINER_slist_iter_destroy (i); } - /* FIXME */ if (wfds) - GNUNET_assert (GNUNET_CONTAINER_slist_count (wfds->handles) == 0); + { + GNUNET_CONTAINER_slist_append (handles_write, wfds->handles); + retcode += GNUNET_CONTAINER_slist_count (wfds->handles); + } /* Check for closed sockets */ for (i = 0; i < nfds; i++) @@ -1046,6 +1048,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, Sleep (GNUNET_MIN (100, limit - GetTickCount ())); } while (retcode == 0 && (ms_total == INFINITE || GetTickCount () < limit)); + if (retcode != -1) { @@ -1054,20 +1057,32 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, { GNUNET_NETWORK_fdset_zero (rfds); GNUNET_NETWORK_fdset_copy_native (rfds, &aread, retcode); + GNUNET_CONTAINER_slist_clear (rfds->handles); + GNUNET_CONTAINER_slist_append (rfds->handles, handles_read); + } if (wfds) { GNUNET_NETWORK_fdset_zero (wfds); GNUNET_NETWORK_fdset_copy_native (wfds, &awrite, retcode); + GNUNET_CONTAINER_slist_clear (wfds->handles); + GNUNET_CONTAINER_slist_append (wfds->handles, handles_write); } if (efds) { GNUNET_NETWORK_fdset_zero (efds); GNUNET_NETWORK_fdset_copy_native (efds, &aexcept, retcode); + GNUNET_CONTAINER_slist_clear (efds->handles); + GNUNET_CONTAINER_slist_append (efds->handles, handles_except); } } + + GNUNET_CONTAINER_slist_destroy (handles_read); + GNUNET_CONTAINER_slist_destroy (handles_write); + GNUNET_CONTAINER_slist_destroy (handles_except); + return retcode; #endif /* */ diff --git a/src/util/scheduler.c b/src/util/scheduler.c index 3f3b14377..a8e5add3e 100644 --- a/src/util/scheduler.c +++ b/src/util/scheduler.c @@ -608,14 +608,14 @@ GNUNET_SCHEDULER_run (GNUNET_SCHEDULER_Task task, void *task_cls) check_ready (&sched, rs, ws); run_ready (&sched); } -#ifndef MINGW GNUNET_SIGNAL_handler_uninstall (shc_int); GNUNET_SIGNAL_handler_uninstall (shc_term); +#ifndef MINGW GNUNET_SIGNAL_handler_uninstall (shc_quit); GNUNET_SIGNAL_handler_uninstall (shc_hup); +#endif GNUNET_DISK_pipe_close (sigpipe); sigpipe = NULL; -#endif GNUNET_NETWORK_fdset_destroy (rs); GNUNET_NETWORK_fdset_destroy (ws); } diff --git a/src/util/test_scheduler.c b/src/util/test_scheduler.c index 74be05654..dfc9d6233 100644 --- a/src/util/test_scheduler.c +++ b/src/util/test_scheduler.c @@ -197,11 +197,7 @@ taskSig (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) *ok = 8; GNUNET_SCHEDULER_add_delayed (tc->sched, GNUNET_TIME_UNIT_FOREVER_REL, &taskLast, cls); -#ifndef MINGW GNUNET_break (0 == PLIBC_KILL (getpid (), SIGTERM)); -#else - GNUNET_SCHEDULER_shutdown (tc->sched); -#endif } @@ -257,7 +253,9 @@ main (int argc, char *argv[]) GNUNET_log_setup ("test_scheduler", "WARNING", NULL); ret += check (); +#ifndef MINGW ret += checkSignal (); +#endif ret += checkShutdown (); ret += checkCancel (); GNUNET_DISK_pipe_close (p); -- 2.25.1