# New Ticket Created by Mark Glines
# Please include the string: [perl #53536]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=53536 >
The "sleep" op calls Parrot_cx_schedule_sleep(), which falls back to
Parrot_sleep() on non-threaded architectures. Here's a patch to
implement a Parrot_usleep() and call that instead, for those
platforms.
POSIX platforms have usleep(), with microsecond precision. Win32
has Sleep(), with millisecond precision. Are there any platforms which
*don't* have one of those? Such a platform can probably either use
select(), or some other platform-specific call.
I am having trouble finding a platform to test this on... everything
available to me seems to have threads, and I can't find a Configure.pl
option to disable them, so I can't test this effectively.
Anyway, it turns out I didn't need to shave this yak, but it might be
useful for someone else. I'm posting the patch for review, hopefully
someone smarter than me will speak up. :)
Mark
Index: src/scheduler.c
===================================================================
--- src/scheduler.c (revision 27229)
+++ src/scheduler.c (working copy)
@@ -655,7 +655,13 @@
MUTEX_DESTROY(lock);
#else
/* A more primitive, platform-specific, non-threaded form of sleep. */
- Parrot_sleep((UINTVAL) ceil(time));
+ if(time > 1000) {
+ /* prevent integer overflow when converting to microseconds */
+ int seconds = floor(time);
+ Parrot_sleep(seconds);
+ time -= seconds;
+ }
+ Parrot_usleep((UINTVAL) time*1000000);
#endif
return next;
}
Index: config/gen/platform/win32/time.c
===================================================================
--- config/gen/platform/win32/time.c (revision 27229)
+++ config/gen/platform/win32/time.c (working copy)
@@ -91,6 +91,22 @@
/*
+=item C<void Parrot_usleep(unsigned int microseconds)>
+
+RT#48260: Not yet documented!!!
+
+=cut
+
+*/
+
+void
+Parrot_usleep(unsigned int microseconds)
+{
+ Sleep(microseconds / 1000);
+}
+
+/*
+
=item C<struct tm * Parrot_gmtime_r(const time_t *t, struct tm *tm)>
RT#48260: Not yet documented!!!
Index: config/gen/platform/ansi/time.c
===================================================================
--- config/gen/platform/ansi/time.c (revision 27229)
+++ config/gen/platform/ansi/time.c (working copy)
@@ -79,6 +79,23 @@
/*
+=item C<void Parrot_usleep(unsigned int microseconds)>
+
+RT#48260: Not yet documented!!!
+
+=cut
+
+*/
+
+void
+Parrot_usleep(unsigned int microseconds)
+{
+ Parrot_warn(NULL, PARROT_WARNINGS_PLATFORM_FLAG, "Parrot_usleep not
implemented");
+ return;
+}
+
+/*
+
=back
=cut
Index: config/gen/platform/platform_interface.h
===================================================================
--- config/gen/platform/platform_interface.h (revision 27229)
+++ config/gen/platform/platform_interface.h (working copy)
@@ -72,6 +72,7 @@
*/
void Parrot_sleep(unsigned int seconds);
+void Parrot_usleep(unsigned int microseconds);
INTVAL Parrot_intval_time(void);
FLOATVAL Parrot_floatval_time(void);
struct tm * Parrot_gmtime_r(const time_t *, struct tm *);
Index: config/gen/platform/generic/time.c
===================================================================
--- config/gen/platform/generic/time.c (revision 27229)
+++ config/gen/platform/generic/time.c (working copy)
@@ -80,6 +80,23 @@
/*
+=item C<void
+Parrot_usleep(unsigned int microseconds)>
+
+RT#48260: Not yet documented!!!
+
+=cut
+
+*/
+
+void
+Parrot_usleep(unsigned int microseconds)
+{
+ usleep(microseconds);
+}
+
+/*
+
=item C<struct tm *
Parrot_gmtime_r(const time_t *t, struct tm *tm)>
Index: config/gen/platform/solaris/time.c
===================================================================
--- config/gen/platform/solaris/time.c (revision 27229)
+++ config/gen/platform/solaris/time.c (working copy)
@@ -80,6 +80,23 @@
/*
+=item C<void
+Parrot_usleep(unsigned int microseconds)>
+
+RT#48260: Not yet documented!!!
+
+=cut
+
+*/
+
+void
+Parrot_usleep(unsigned int microseconds)
+{
+ usleep(microseconds);
+}
+
+/*
+
=item C<struct tm *
Parrot_gmtime_r(const time_t *t, struct tm *tm)>