blocking_sleep 0.1.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: 49021b725fda32ecf2c48f697a26aa1d52caf1d428a49abda08e80d036446d7c
4
- data.tar.gz: f6105859c43ad3dda70a43dbd90704cec6881529d7569dac5b9964c2b80e15a0
3
+ metadata.gz: 17830eaa86c8f78efe8add7945e210facf7a4928c7e387895b4f032d666a66a0
4
+ data.tar.gz: 31b23aff8a3d1e2a3cd2bfd185c451159669d41073b470c92ee351a5e9336ede
5
5
  SHA512:
6
- metadata.gz: 4f6745ec91a7569d338bfafb1123792ce0e29b888d1feda6a5ceee644d59240b5ac98ea97b7fe9cd1df0d6105fe73636be78b506f71f8041ef8dbb38a48fe012
7
- data.tar.gz: fe5d17257c6944d71cef1865f9f54b1d818b9d0d41ad256d8e9869146e60fe5f9db98b03dc8acbe6c0289f4886fa416103b03e43a7fc5912d292e6b822571f83
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
-
@@ -1,6 +1,5 @@
1
1
  require 'mkmf'
2
2
 
3
- extension_name = 'blocking_sleep'
4
-
5
- create_makefile(extension_name)
6
-
3
+ # Build the extension into blocking_sleep/blocking_sleep.so so the
4
+ # Ruby wrapper can load it via `require 'blocking_sleep/blocking_sleep'`.
5
+ create_makefile('blocking_sleep/blocking_sleep')
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.1.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: []
@@ -47,7 +61,7 @@ files:
47
61
  - ext/blocking_sleep/blocking_sleep.c
48
62
  - ext/blocking_sleep/extconf.rb
49
63
  - lib/blocking_sleep.rb
50
- homepage: https://example.com
64
+ homepage: https://github.com/vovanmozg/blocking_sleep
51
65
  licenses:
52
66
  - MIT
53
67
  metadata: {}
@@ -67,5 +81,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
81
  requirements: []
68
82
  rubygems_version: 3.6.8
69
83
  specification_version: 4
70
- summary: Native blocking sleep for Ruby thread experiments
84
+ summary: Native blocking sleep
71
85
  test_files: []