]> sjero.net Git - wget/blobdiff - src/mswindows.c
[svn] New function xsleep that resumes sleeps interrupted by signals
[wget] / src / mswindows.c
index 09a3383a6c323d77336bbe16816d7677a3fd6cf6..36aef00f8317fb33b12554f65bcf58ecfcb82d63 100644 (file)
@@ -74,35 +74,23 @@ static DWORD set_sleep_mode (DWORD mode);
 static DWORD pwr_mode = 0;
 static int windows_nt_p;
 
-#ifndef HAVE_SLEEP
+/* Windows version of xsleep in utils.c.  */
 
-/* Emulation of Unix sleep.  */
-
-unsigned int
-sleep (unsigned seconds)
-{
-  return SleepEx (1000 * seconds, TRUE) ? 0U : 1000 * seconds;
-}
-#endif
-
-#ifndef HAVE_USLEEP
-/* Emulation of Unix usleep().  This has a granularity of
-   milliseconds, but that's ok because:
-
-   a) Wget is only using it with milliseconds [not anymore, but b)
-      still applies];
-
-   b) You can't rely on usleep's granularity anyway.  If a caller
-   expects usleep to respect every microsecond, he's in for a
-   surprise.  */
-
-int
-usleep (unsigned long usec)
+void
+xsleep (double seconds)
 {
-  SleepEx (usec / 1000, TRUE);
-  return 0;
+#ifdef HAVE_USLEEP
+  if (seconds > 1000)
+    {
+      /* Explained in utils.c. */
+      sleep (seconds);
+      seconds -= (long) seconds;
+    }
+  usleep (seconds * 1000000L);
+#else  /* not HAVE_USLEEP */
+  SleepEx (seconds * 1000, FALSE);
+#endif /* not HAVE_USLEEP */
 }
-#endif  /* HAVE_USLEEP */
 
 void
 windows_main_junk (int *argc, char **argv, char **exec_name)
@@ -315,9 +303,10 @@ borland_utime (const char *path, const struct utimbuf *times)
 #endif
 
 /*
- * Prevent Windows entering sleep/hibernation-mode while wget is doing a lengthy transfer.
- * Windows does by default not consider network activity in console-programs as activity !
- * Works on Win-98/ME/2K and up.
+ * Prevent Windows entering sleep/hibernation-mode while wget is doing
+ * a lengthy transfer.  Windows does by default not consider network
+ * activity in console-programs as activity !  Works on Win-98/ME/2K
+ * and up.
  */
 static DWORD
 set_sleep_mode (DWORD mode)
@@ -327,7 +316,8 @@ set_sleep_mode (DWORD mode)
   DWORD rc = (DWORD)-1;
 
   if (mod)
-     (void*)_SetThreadExecutionState = GetProcAddress ((HINSTANCE)mod, "SetThreadExecutionState");
+     (void *)_SetThreadExecutionState
+       = GetProcAddress ((HINSTANCE)mod, "SetThreadExecutionState");
 
   if (_SetThreadExecutionState)
     {
@@ -377,15 +367,16 @@ thread_helper (void *arg)
 
   /* Return Winsock error to the caller, in case FUN ran Winsock
      code.  */
-  td->ws_error = WSAGetLastError();
+  td->ws_error = WSAGetLastError ();
   return 0; 
 }
 
-/*
- * Run FUN with timeout.  This is done by creating a thread for 'fun'
- * to run in and terminating the thread if it doesn't finish in
- * SECONDS time.
- */
+/* Call FUN(ARG), but don't allow it to run for more than TIMEOUT
+   seconds.  Returns non-zero if the function was interrupted with a
+   timeout, zero otherwise.
+
+   This works by running FUN in a separate thread and terminating the
+   thread if it doesn't finish in the specified time.  */
 
 int
 run_with_timeout (double seconds, void (*fun) (void *), void *arg)
@@ -414,16 +405,17 @@ run_with_timeout (double seconds, void (*fun) (void *), void *arg)
                             &thread_arg, 0, &thread_id); 
   if (!thread_hnd)
     {
-      DEBUGP (("CreateThread() failed; %s\n", strerror(GetLastError())));
+      DEBUGP (("CreateThread() failed; %s\n", strerror (GetLastError ())));
       goto blocking_fallback;
     }
 
-  if (WaitForSingleObject(thread_hnd, (DWORD)(1000*seconds)) == WAIT_OBJECT_0)
+  if (WaitForSingleObject (thread_hnd, (DWORD)(1000 * seconds))
+      == WAIT_OBJECT_0)
     {
       /* Propagate error state (which is per-thread) to this thread,
         so the caller can inspect it.  */
       WSASetLastError (thread_arg.ws_error);
-      DEBUGP (("Winsock error: %d\n", WSAGetLastError()));
+      DEBUGP (("Winsock error: %d\n", WSAGetLastError ()));
       rc = 0;
     }
   else