timeout_ext 0.0.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.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/COPYING +510 -0
  4. data/MANIFEST +51 -0
  5. data/README +15 -0
  6. data/Rakefile +28 -0
  7. data/ext/timeout_ext/.gitignore +3 -0
  8. data/ext/timeout_ext/ccan-bits.c +7 -0
  9. data/ext/timeout_ext/ccan/array_size/LICENSE +28 -0
  10. data/ext/timeout_ext/ccan/array_size/_info +46 -0
  11. data/ext/timeout_ext/ccan/array_size/array_size.h +26 -0
  12. data/ext/timeout_ext/ccan/build_assert/LICENSE +28 -0
  13. data/ext/timeout_ext/ccan/build_assert/_info +49 -0
  14. data/ext/timeout_ext/ccan/build_assert/build_assert.h +40 -0
  15. data/ext/timeout_ext/ccan/check_type/LICENSE +28 -0
  16. data/ext/timeout_ext/ccan/check_type/_info +33 -0
  17. data/ext/timeout_ext/ccan/check_type/check_type.h +64 -0
  18. data/ext/timeout_ext/ccan/compiler/LICENSE +28 -0
  19. data/ext/timeout_ext/ccan/compiler/_info +64 -0
  20. data/ext/timeout_ext/ccan/compiler/compiler.h +231 -0
  21. data/ext/timeout_ext/ccan/container_of/LICENSE +28 -0
  22. data/ext/timeout_ext/ccan/container_of/_info +65 -0
  23. data/ext/timeout_ext/ccan/container_of/container_of.h +145 -0
  24. data/ext/timeout_ext/ccan/ilog/LICENSE +28 -0
  25. data/ext/timeout_ext/ccan/ilog/_info +50 -0
  26. data/ext/timeout_ext/ccan/ilog/ilog.c +141 -0
  27. data/ext/timeout_ext/ccan/ilog/ilog.h +151 -0
  28. data/ext/timeout_ext/ccan/list/LICENSE +17 -0
  29. data/ext/timeout_ext/ccan/list/_info +72 -0
  30. data/ext/timeout_ext/ccan/list/list.h +842 -0
  31. data/ext/timeout_ext/ccan/str/LICENSE +28 -0
  32. data/ext/timeout_ext/ccan/str/_info +52 -0
  33. data/ext/timeout_ext/ccan/str/str.h +228 -0
  34. data/ext/timeout_ext/ccan/str/str_debug.h +30 -0
  35. data/ext/timeout_ext/ccan/time/LICENSE +17 -0
  36. data/ext/timeout_ext/ccan/time/_info +57 -0
  37. data/ext/timeout_ext/ccan/time/time.c +138 -0
  38. data/ext/timeout_ext/ccan/time/time.h +753 -0
  39. data/ext/timeout_ext/ccan/timer/LICENSE +510 -0
  40. data/ext/timeout_ext/ccan/timer/_info +79 -0
  41. data/ext/timeout_ext/ccan/timer/design.txt +76 -0
  42. data/ext/timeout_ext/ccan/timer/timer.c +524 -0
  43. data/ext/timeout_ext/ccan/timer/timer.h +211 -0
  44. data/ext/timeout_ext/depend +17 -0
  45. data/ext/timeout_ext/extconf.rb +50 -0
  46. data/ext/timeout_ext/licenses/BSD-MIT +17 -0
  47. data/ext/timeout_ext/licenses/CC0 +28 -0
  48. data/ext/timeout_ext/licenses/LGPL-2.1 +510 -0
  49. data/ext/timeout_ext/missing/stdbool/stdbool.h +20 -0
  50. data/ext/timeout_ext/timeout_ext.c +114 -0
  51. data/test/test_timeout_ext.rb +44 -0
  52. data/timeout_ext.gemspec +30 -0
  53. metadata +126 -0
@@ -0,0 +1,20 @@
1
+ /*
2
+ * missing/stdbool.h: Quick alternative of C99 stdbool.h
3
+ */
4
+
5
+ #ifndef _MISSING_STDBOOL_H_
6
+ #define _MISSING_STDBOOL_H_
7
+
8
+ #ifndef __cplusplus
9
+
10
+ #define bool _Bool
11
+ #define true 1
12
+ #define false 0
13
+
14
+ #ifndef HAVE__BOOL /* AC_HEADER_STDBOOL in configure.ac */
15
+ typedef int _Bool;
16
+ #endif /* HAVE__BOOL */
17
+
18
+ #endif /* __cplusplus */
19
+
20
+ #endif /* _MISSING_STDBOOL_H_ */
@@ -0,0 +1,114 @@
1
+ /*
2
+ * Copyright (C) 2018 Ruby hackers <ruby-core@ruby-lang.org>
3
+ * License: LGPL-2.1+ <https://www.gnu.org/licenses/lgpl-2.1.txt>
4
+ */
5
+ #include <ruby/ruby.h>
6
+ #include <ruby/intern.h>
7
+ #include <ccan/timer/timer.h>
8
+
9
+ static VALUE eUncaughtThrow;
10
+
11
+ static void *
12
+ rb_timers_create(void)
13
+ {
14
+ struct timers *t = ALLOC(struct timers);
15
+
16
+ timers_init(t, time_mono());
17
+
18
+ return t;
19
+ }
20
+
21
+ static void
22
+ rb_timer_add(struct timers *timers, struct timer *t, struct timespec *ts)
23
+ {
24
+ struct timerel rel;
25
+ rel.ts = *ts;
26
+ timer_init(t);
27
+ timer_addrel(timers, t, rel);
28
+ }
29
+
30
+ static void *
31
+ rb_timers_expire(struct timers *timers)
32
+ {
33
+ return timers_expire(timers, time_mono());
34
+ }
35
+
36
+ static void *
37
+ rb_timers_earliest(struct timers *timers, struct timespec *rel)
38
+ {
39
+ struct timemono now;
40
+ struct timemono first;
41
+
42
+ if (!timer_earliest(timers, &first)) return 0;
43
+
44
+ now = time_mono();
45
+ if (time_greater_(first.ts, now.ts)) {
46
+ struct timerel ret = timemono_between(first, now);
47
+ *rel = ret.ts;
48
+ }
49
+ else {
50
+ rel->tv_sec = 0;
51
+ rel->tv_nsec = 0;
52
+ }
53
+ return rel;
54
+ }
55
+
56
+ void
57
+ rb_timers_destroy(void *p)
58
+ {
59
+ struct timers *timers = p;
60
+ timers_cleanup(timers);
61
+ xfree(timers);
62
+ }
63
+
64
+ static struct rb_timers_type0 ccan_timers = {
65
+ /* .create = */ rb_timers_create,
66
+ /* .add = */ rb_timer_add,
67
+ /* .expire = */ rb_timers_expire,
68
+ /* .earliest = */ rb_timers_earliest,
69
+ /* .destroy = */ rb_timers_destroy
70
+ };
71
+
72
+ static VALUE
73
+ begin_throw(VALUE self)
74
+ {
75
+ rb_throw_obj(self, self);
76
+ return self;
77
+ }
78
+
79
+ static VALUE
80
+ rescue_throw(VALUE ignore, VALUE err)
81
+ {
82
+ return Qfalse;
83
+ }
84
+
85
+ /*
86
+ * We don't want to generate a backtrace like the version
87
+ * in timeout.rb does. We also want to raise the same
88
+ * exception object so rb_s_timeout (in core) can match
89
+ * against it without relying on an extra proc for:
90
+ *
91
+ * proc { |exception| return yield(sec) }
92
+ */
93
+ static VALUE
94
+ rb_timeout_error_exception(int argc, VALUE *argv, VALUE self)
95
+ {
96
+ if (rb_attr_get(self, rb_intern("@thread")) == rb_thread_current()) {
97
+ rb_rescue2(begin_throw, self, rescue_throw, Qfalse, eUncaughtThrow, 0);
98
+ }
99
+ return self;
100
+ }
101
+
102
+ void
103
+ Init_timeout_ext(void)
104
+ {
105
+ #undef rb_intern
106
+ VALUE mTimeout = rb_const_get(rb_cObject, rb_intern("Timeout"));
107
+ VALUE cError = rb_const_get(mTimeout, rb_intern("Error"));
108
+ eUncaughtThrow = rb_const_get(rb_cObject, rb_intern("UncaughtThrowError"));
109
+ rb_timers = &ccan_timers;
110
+ rb_define_method(mTimeout, "timeout", rb_s_timeout, -1);
111
+ rb_define_singleton_method(mTimeout, "timeout", rb_s_timeout, -1);
112
+ rb_undef_method(cError, "exception");
113
+ rb_define_method(cError, "exception", rb_timeout_error_exception, -1);
114
+ }
@@ -0,0 +1,44 @@
1
+ require 'test/unit'
2
+ require 'timeout'
3
+ require 'timeout_ext'
4
+
5
+ class TestTimeoutExt < Test::Unit::TestCase
6
+ class T
7
+ include Timeout
8
+ end
9
+
10
+ def test_override
11
+ res = Timeout.method(:timeout).source_location.inspect
12
+ assert_not_match %r{\.rb\b}, res, res
13
+ res = Timeout::Error.new.method(:exception).source_location.inspect
14
+ assert_not_match %r{\.rb\b}, res, res
15
+ T.new.method(:timeout).source_location.inspect
16
+ assert_not_match %r{\.rb\b}, res, res
17
+ end
18
+
19
+ def test_basic_timeout
20
+ Timeout.timeout(nil) { sleep 0.01 }
21
+ Timeout.timeout(1) { assert_equal 1, Thread.list.size }
22
+ assert_raise(Timeout::Error) do
23
+ Timeout.timeout(0.1) do
24
+ assert_equal 1, Thread.list.size
25
+ sleep
26
+ end
27
+ end
28
+ t0 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
29
+ assert_raise(Timeout::Error) do
30
+ Timeout.timeout(0.1) do
31
+ assert_equal 1, Thread.list.size
32
+ sleep 2
33
+ end
34
+ end
35
+ t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
36
+ assert_operator(t1 - t0, :<=, 1)
37
+ end
38
+
39
+ def test_different_exception
40
+ assert_raise(RuntimeError.new('hello world')) do
41
+ Timeout.timeout(10) { raise 'hello world' }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,30 @@
1
+ git_manifest = `git ls-files 2>/dev/null`.split("\n")
2
+ manifest = File.exist?('MANIFEST') ?
3
+ File.readlines('MANIFEST').map!(&:chomp).delete_if(&:empty?) : git_manifest
4
+ if git_manifest[0] && manifest != git_manifest
5
+ tmp = "MANIFEST.#$$.tmp"
6
+ File.open(tmp, 'w') { |fp| fp.puts(git_manifest.join("\n")) }
7
+ File.rename(tmp, 'MANIFEST')
8
+ system('git add MANIFEST')
9
+ end
10
+
11
+ Gem::Specification.new do |s|
12
+ s.name = 'timeout_ext'
13
+ s.version = '0.0.0'
14
+ s.homepage = 'https://80x24.org/timeout_ext.git'
15
+ s.authors = ["Ruby hackers"]
16
+ s.summary = 'enhancement to timeout.rb in the Ruby stdlib'
17
+ s.files = manifest
18
+ s.description = <<~EOF
19
+ Uses the CCAN timer implementation and hooks in the main Ruby VM
20
+ to speed up timeout.rb
21
+ EOF
22
+
23
+ s.email = %q{normal@ruby-lang.org}
24
+ s.test_files = Dir['test/test_*.rb']
25
+ s.extensions = %w(ext/timeout_ext/extconf.rb)
26
+
27
+ s.add_development_dependency('test-unit', '~> 3.0')
28
+ s.add_development_dependency('rake-compiler', '~> 1.0')
29
+ s.licenses = %w(LGPL-2.1+)
30
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: timeout_ext
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ruby hackers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: test-unit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake-compiler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ description: |
42
+ Uses the CCAN timer implementation and hooks in the main Ruby VM
43
+ to speed up timeout.rb
44
+ email: normal@ruby-lang.org
45
+ executables: []
46
+ extensions:
47
+ - ext/timeout_ext/extconf.rb
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".gitignore"
51
+ - COPYING
52
+ - MANIFEST
53
+ - README
54
+ - Rakefile
55
+ - ext/timeout_ext/.gitignore
56
+ - ext/timeout_ext/ccan-bits.c
57
+ - ext/timeout_ext/ccan/array_size/LICENSE
58
+ - ext/timeout_ext/ccan/array_size/_info
59
+ - ext/timeout_ext/ccan/array_size/array_size.h
60
+ - ext/timeout_ext/ccan/build_assert/LICENSE
61
+ - ext/timeout_ext/ccan/build_assert/_info
62
+ - ext/timeout_ext/ccan/build_assert/build_assert.h
63
+ - ext/timeout_ext/ccan/check_type/LICENSE
64
+ - ext/timeout_ext/ccan/check_type/_info
65
+ - ext/timeout_ext/ccan/check_type/check_type.h
66
+ - ext/timeout_ext/ccan/compiler/LICENSE
67
+ - ext/timeout_ext/ccan/compiler/_info
68
+ - ext/timeout_ext/ccan/compiler/compiler.h
69
+ - ext/timeout_ext/ccan/container_of/LICENSE
70
+ - ext/timeout_ext/ccan/container_of/_info
71
+ - ext/timeout_ext/ccan/container_of/container_of.h
72
+ - ext/timeout_ext/ccan/ilog/LICENSE
73
+ - ext/timeout_ext/ccan/ilog/_info
74
+ - ext/timeout_ext/ccan/ilog/ilog.c
75
+ - ext/timeout_ext/ccan/ilog/ilog.h
76
+ - ext/timeout_ext/ccan/list/LICENSE
77
+ - ext/timeout_ext/ccan/list/_info
78
+ - ext/timeout_ext/ccan/list/list.h
79
+ - ext/timeout_ext/ccan/str/LICENSE
80
+ - ext/timeout_ext/ccan/str/_info
81
+ - ext/timeout_ext/ccan/str/str.h
82
+ - ext/timeout_ext/ccan/str/str_debug.h
83
+ - ext/timeout_ext/ccan/time/LICENSE
84
+ - ext/timeout_ext/ccan/time/_info
85
+ - ext/timeout_ext/ccan/time/time.c
86
+ - ext/timeout_ext/ccan/time/time.h
87
+ - ext/timeout_ext/ccan/timer/LICENSE
88
+ - ext/timeout_ext/ccan/timer/_info
89
+ - ext/timeout_ext/ccan/timer/design.txt
90
+ - ext/timeout_ext/ccan/timer/timer.c
91
+ - ext/timeout_ext/ccan/timer/timer.h
92
+ - ext/timeout_ext/depend
93
+ - ext/timeout_ext/extconf.rb
94
+ - ext/timeout_ext/licenses/BSD-MIT
95
+ - ext/timeout_ext/licenses/CC0
96
+ - ext/timeout_ext/licenses/LGPL-2.1
97
+ - ext/timeout_ext/missing/stdbool/stdbool.h
98
+ - ext/timeout_ext/timeout_ext.c
99
+ - test/test_timeout_ext.rb
100
+ - timeout_ext.gemspec
101
+ homepage: https://80x24.org/timeout_ext.git
102
+ licenses:
103
+ - LGPL-2.1+
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 3.0.0.beta1
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: enhancement to timeout.rb in the Ruby stdlib
125
+ test_files:
126
+ - test/test_timeout_ext.rb