win32: fix argumentless sleep()
authorTomasz Konojacki <me@xenu.pl>
Sun, 15 Jul 2018 00:33:16 +0000 (02:33 +0200)
committerTony Cook <tony@develop-help.com>
Wed, 1 Aug 2018 06:42:30 +0000 (16:42 +1000)
Before this commit, pause() was implemented as a macro calling
win32_sleep((32767L << 16) + 32767), which was causing the following
problems with argumentless sleep():

- it was sleeping for 4262198 seconds (~50 days) instead of forever
- it was triggering "sleep(2147450879) too large" warning

This commit implements pause() as a proper function which calls
win32_msgwait() with an INFINITE timeout.

[perl #133376]

makedef.pl
win32/perlhost.h
win32/win32.c
win32/win32iop.h

index 661b71d..6b97ad0 100644 (file)
@@ -898,6 +898,7 @@ if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
                            win32_realloc
                            win32_free
                            win32_sleep
+                           win32_pause
                            win32_times
                            win32_access
                            win32_alarm
index 3260f62..6dd269e 100644 (file)
@@ -1605,7 +1605,7 @@ PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
 int
 PerlProcPauseProc(struct IPerlProc* piPerl)
 {
-    return win32_sleep((32767L << 16) + 32767);
+    return win32_pause();
 }
 
 PerlIO*
index c7656c6..769a0e1 100644 (file)
@@ -2455,6 +2455,14 @@ win32_sleep(unsigned int t)
     return win32_msgwait(aTHX_ 0, NULL, t * 1000, NULL) / 1000;
 }
 
+DllExport int
+win32_pause(void)
+{
+    dTHX;
+    win32_msgwait(aTHX_ 0, NULL, INFINITE, NULL);
+    return -1;
+}
+
 DllExport unsigned int
 win32_alarm(unsigned int sec)
 {
index 842bc07..a9235d3 100644 (file)
@@ -128,6 +128,7 @@ DllExport  char*    win32_getenv(const char *name);
 DllExport  int         win32_putenv(const char *name);
 
 DllExport  unsigned    win32_sleep(unsigned int);
+DllExport  int         win32_pause(void);
 DllExport  int         win32_times(struct tms *timebuf);
 DllExport  unsigned    win32_alarm(unsigned int sec);
 DllExport  char*       win32_longpath(char *path);
@@ -429,7 +430,7 @@ END_EXTERN_C
  */
 
 #define pipe(fd)               win32_pipe((fd), 512, O_BINARY)
-#define pause()                        win32_sleep((32767L << 16) + 32767)
+#define pause                  win32_pause
 #define sleep                  win32_sleep
 #define times                  win32_times
 #define ioctl                  win32_ioctl