blocking_sleep 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b014964dba5d2c76c0ea36d295cea9480333ff45e1c4c99489682cabc15bf44b
4
- data.tar.gz: 82d996cdf94c65c3cf40eef0c993d35a4768b6c0aba6583df7e1fec7119c31db
3
+ metadata.gz: 17830eaa86c8f78efe8add7945e210facf7a4928c7e387895b4f032d666a66a0
4
+ data.tar.gz: 31b23aff8a3d1e2a3cd2bfd185c451159669d41073b470c92ee351a5e9336ede
5
5
  SHA512:
6
- metadata.gz: 5cecc9d947e6ae1942caea0f977f84f854b10e2efd254bbd7c625c2f811947f6d335ce1beb967c4fc71cec2543c8e1e9079ff9f7ccd13d1df2c58bb393955c16
7
- data.tar.gz: 00a1f2f9fc065407884b7f7a7e038c02b64ddf1a8e3114036919e02913358527fbe78d3203541d7178e3e67dd2bd9cab8721b299f551d69dc4263153687d1bcb
6
+ metadata.gz: 79ced7900aeb8ed7cc773918227f34cf5cb03c4dcba3ad312a08b4ff51d1893517a0b2f7b7793e14c8522bfd5b11a9e65985af8c3afb379e1925b295a0015c68
7
+ data.tar.gz: aa771d76d3672dd28ce403e8483eee0f6dc4338a58de00cb06944fb418859526f4455da886e5f74b433a045ee0722ac9414c48d6ce4520395752fcc457b28123
@@ -1,5 +1,8 @@
1
1
  #include <ruby.h>
2
2
  #include <unistd.h>
3
+ #include <time.h>
4
+ #include <errno.h>
5
+ #include <math.h>
3
6
 
4
7
  /*
5
8
  * Call native sleep() function without releasing GVL.
@@ -8,14 +11,38 @@
8
11
  static VALUE
9
12
  blocking_sleep_sleep(VALUE self, VALUE seconds)
10
13
  {
11
- unsigned int sleep_time;
12
-
13
- // Convert Ruby number to C unsigned int
14
- sleep_time = NUM2UINT(seconds);
15
-
16
- // Call native sleep() - this blocks without releasing GVL
17
- sleep(sleep_time);
18
-
14
+ double sleep_time;
15
+ double integral;
16
+ double fractional;
17
+ struct timespec req;
18
+ struct timespec rem;
19
+
20
+ // Convert Ruby number to C double
21
+ sleep_time = NUM2DBL(seconds);
22
+
23
+ if (sleep_time < 0.0) {
24
+ rb_raise(rb_eArgError, "sleep duration must be non-negative");
25
+ }
26
+
27
+ fractional = modf(sleep_time, &integral);
28
+
29
+ req.tv_sec = (time_t)integral;
30
+ req.tv_nsec = (long)(fractional * 1e9 + 0.5);
31
+
32
+ if (req.tv_nsec >= 1000000000L) {
33
+ req.tv_sec += 1;
34
+ req.tv_nsec -= 1000000000L;
35
+ }
36
+
37
+ // Call native nanosleep() - this blocks without releasing GVL
38
+ while (nanosleep(&req, &rem) == -1) {
39
+ if (errno == EINTR) {
40
+ req = rem;
41
+ continue;
42
+ }
43
+ rb_sys_fail("nanosleep");
44
+ }
45
+
19
46
  return Qnil;
20
47
  }
21
48
 
@@ -30,4 +57,3 @@ Init_blocking_sleep(void)
30
57
  // Define BlockingSleep.sleep method
31
58
  rb_define_module_function(mBlockingSleep, "sleep", blocking_sleep_sleep, 1);
32
59
  }
33
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blocking_sleep
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Polukhin
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: minitest
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  description: A simple C extension that provides blocking sleep without releasing GVL
41
55
  email: vovanmozg@gmail.com
42
56
  executables: []