summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-09-06 23:42:05 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-09-06 23:42:05 +0900
commitfdaec907802c11867e977b30b2e1dddcb7a0ebcd (patch)
treeb64aa0250495ed64af4011bc239d823b78319800 /mrbgems
parent72522f8e0ecd7a94af4df0cf7c892fb5ed971deb (diff)
downloadmruby-fdaec907802c11867e977b30b2e1dddcb7a0ebcd.tar.gz
mruby-fdaec907802c11867e977b30b2e1dddcb7a0ebcd.zip
Make `Kernel#sleep` to accept float as a duration time.
But when `MRB_WITHOUT_FLOAT` is set, there's no way to sleep for sub seconds. So mruby specific `usleep` is provided.
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-sleep/src/mrb_sleep.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/mrbgems/mruby-sleep/src/mrb_sleep.c b/mrbgems/mruby-sleep/src/mrb_sleep.c
index 37d18e482..ce643cf12 100644
--- a/mrbgems/mruby-sleep/src/mrb_sleep.c
+++ b/mrbgems/mruby-sleep/src/mrb_sleep.c
@@ -37,25 +37,38 @@
#include "mruby.h"
+/* not implemented forever sleep (called without an argument)*/
static mrb_value
mrb_f_sleep(mrb_state *mrb, mrb_value self)
{
- time_t beg, end;
+ time_t beg = time(0);
+ time_t end;
+#ifndef MRB_WITHOUT_FLOAT
+ mrb_float sec;
+
+ mrb_get_args(mrb, "f", &sec);
+ if (sec >= 0) {
+ usleep(sec * 1000000);
+ }
+ else {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer");
+ }
+#else
mrb_int sec;
- beg = time(0);
- /* not implemented forever sleep (called without an argument)*/
mrb_get_args(mrb, "i", &sec);
if (sec >= 0) {
sleep(sec);
} else {
mrb_raise(mrb, E_ARGUMENT_ERROR, "time interval must be positive integer");
}
+#endif
end = time(0) - beg;
return mrb_fixnum_value(end);
}
+/* mruby special; needed for mruby without float numbers */
static mrb_value
mrb_f_usleep(mrb_state *mrb, mrb_value self)
{