create_timer is not available on OSX which means the older setitimer is being used. For small times we could either cancel the timer or sleep a very long time.
* If nsTime < now we would sleep a very long time. * If deltaMilli == 0 we could cancel the timer and never wake up. If the delta is smaller than what can be expressed in milliseconds sleep the shortest time possible as it is too late to cancel everything. This could be easily reproduced using the following code which would be unlikely to run to the end. (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait (Delay forMilliseconds: 1) wait --- libgst/ChangeLog | 5 +++++ libgst/sysdep/posix/timer.c | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libgst/ChangeLog b/libgst/ChangeLog index 9c648c9..6724338 100644 --- a/libgst/ChangeLog +++ b/libgst/ChangeLog @@ -1,3 +1,8 @@ +2015-04-17 Holger Hans Peter Freyther <[email protected]> + + * sysdep/posix/timer.c: Fix handling small sleeping + intervals. + 2015-02-03 Holger Hans Peter Freyther <[email protected]> * files.c: Include SmallInt.st before Float.st. diff --git a/libgst/sysdep/posix/timer.c b/libgst/sysdep/posix/timer.c index c47ae91..6be4376 100644 --- a/libgst/sysdep/posix/timer.c +++ b/libgst/sysdep/posix/timer.c @@ -117,12 +117,22 @@ _gst_sigalrm_at (int64_t nsTime) else #endif { - int64_t deltaMilli = (nsTime - _gst_get_ns_time()) / 1000000; + uint64_t now = _gst_get_ns_time(); + int64_t deltaNano = nsTime - now; struct itimerval value; - value.it_interval.tv_sec = value.it_interval.tv_usec = 0; - value.it_value.tv_sec = deltaMilli / 1000; - value.it_value.tv_usec = (deltaMilli % 1000) * 1000; + + if (deltaNano <= 1000000) + { + value.it_value.tv_sec = 0; + value.it_value.tv_usec = 1; + } + else + { + int64_t deltaMilli = deltaNano / 1000000; + value.it_value.tv_sec = deltaMilli / 1000; + value.it_value.tv_usec = (deltaMilli % 1000) * 1000; + } setitimer (ITIMER_REAL, &value, (struct itimerval *) 0); } } -- 2.3.5 _______________________________________________ help-smalltalk mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-smalltalk
