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 +4 -4
- data/ext/blocking_sleep/blocking_sleep.c +35 -9
- data/ext/blocking_sleep/extconf.rb +3 -4
- metadata +17 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 17830eaa86c8f78efe8add7945e210facf7a4928c7e387895b4f032d666a66a0
|
|
4
|
+
data.tar.gz: 31b23aff8a3d1e2a3cd2bfd185c451159669d41073b470c92ee351a5e9336ede
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
create_makefile(
|
|
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.
|
|
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://
|
|
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
|
|
84
|
+
summary: Native blocking sleep
|
|
71
85
|
test_files: []
|