various fixes
authorNils Durner <durner@gnunet.org>
Fri, 13 Nov 2009 21:49:46 +0000 (21:49 +0000)
committerNils Durner <durner@gnunet.org>
Fri, 13 Nov 2009 21:49:46 +0000 (21:49 +0000)
src/util/network.c
src/util/scheduler.c
src/util/test_scheduler.c

index 5d73700032fd75415eb89ec05c2d88316974a0aa..3d2ff51de8c9b982f04e3dc1d20b30d73ab19159 100644 (file)
@@ -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 /*  */
index 3f3b1437760fb7294a51fcef2d8dbd28fdf64bee..a8e5add3ee26d20664783e7ca6cf39f7cec13f3e 100644 (file)
@@ -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);
 }
index 74be056549d67e4a5dca18c403f2c90e01b252ae..dfc9d62331c7365081f74d92b1d81d52a63f2d0c 100644 (file)
@@ -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);