ext_monitor 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c211d6fb0f3e8efc24f6cadf7475a5cbd3d2c0f60e696d765fdea25000e90c1e
4
+ data.tar.gz: 9bcee9ffef01ce644eab720b8e3c118710223b51fd2c4eb7d94e92668619f45e
5
+ SHA512:
6
+ metadata.gz: f462496ab98137332dec5f26555957727680ee3f075cbc392f655a881f73379976fd949f1945edbe35024ed0dd95caf58579ba5a82378b5e61ae13d62539b89b
7
+ data.tar.gz: 7adb8d2be65629df25f4e3b68dc5c5a9308792817caa5a80d8939ae9af9efa2c450d4c08e87a29f110fcf40cfcb9253ec47f0ab07cfef23d674f420070e8268d
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.bundle
10
+ *.so
11
+ *.o
12
+ *.a
13
+ mkmf.log
14
+ Gemfile.lock
15
+
16
+ # rspec failure tracking
17
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,19 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ os:
5
+ - linux
6
+ rvm:
7
+ - 2.3.8
8
+ - 2.3.8-clang
9
+ - 2.4.9
10
+ - 2.4.9-clang
11
+ - 2.5.7
12
+ - 2.6.5
13
+ - ruby-head
14
+ matrix:
15
+ allow_failures:
16
+ - rvm: ruby-head
17
+ before_install:
18
+ - gem install bundler
19
+ cache: bundler
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in ext_monitor.gemspec
4
+ gemspec
@@ -0,0 +1,26 @@
1
+ Copyright (C) 2015 NARUSE, Yui. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
23
+
24
+ ext/strptime/strptime.c:
25
+ date_strptime.c: Coded by Tadayoshi Funaba 2011,2012
26
+ Copyright (C) 2004-2007 Koichi Sasada
@@ -0,0 +1,35 @@
1
+ # ExtMonitor
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ext_monitor`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'ext_monitor'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install ext_monitor
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nurse/ext_monitor.
@@ -0,0 +1,14 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require "rake/extensiontask"
7
+
8
+ task :build => :compile
9
+
10
+ Rake::ExtensionTask.new("ext_monitor") do |ext|
11
+ ext.lib_dir = "lib/ext_monitor"
12
+ end
13
+
14
+ task :default => [:clobber, :compile, :spec]
@@ -0,0 +1,20 @@
1
+ ---
2
+ install:
3
+ - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
4
+ - ruby --version
5
+ - gem --version
6
+ - bundle install
7
+ build_script:
8
+ - bundle exec rake -rdevkit build
9
+ test_script:
10
+ - bundle exec rake -rdevkit spec
11
+ environment:
12
+ matrix:
13
+ - ruby_version: "23"
14
+ - ruby_version: "23-x64"
15
+ - ruby_version: "24"
16
+ - ruby_version: "24-x64"
17
+ - ruby_version: "25"
18
+ - ruby_version: "25-x64"
19
+ - ruby_version: "26"
20
+ - ruby_version: "26-x64"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ext_monitor"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,243 @@
1
+ #include "ext_monitor.h"
2
+
3
+ struct monitor_core {
4
+ long count;
5
+ const VALUE owner;
6
+ const VALUE mutex;
7
+ };
8
+
9
+ static void
10
+ mcore_mark(void *ptr)
11
+ {
12
+ struct monitor_core *mc = ptr;
13
+ rb_gc_mark(mc->owner);
14
+ rb_gc_mark(mc->mutex);
15
+ }
16
+
17
+ static size_t
18
+ mcore_memsize(const void *ptr)
19
+ {
20
+ return sizeof(struct monitor_core);
21
+ }
22
+
23
+ static const rb_data_type_t mcore_data_type = {
24
+ "thread/monitor_data",
25
+ {mcore_mark, RUBY_TYPED_DEFAULT_FREE, mcore_memsize,},
26
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED
27
+ };
28
+
29
+ static VALUE
30
+ mcore_alloc(VALUE klass)
31
+ {
32
+ struct monitor_core *mc;
33
+ VALUE obj;
34
+
35
+ obj = TypedData_Make_Struct(klass, struct monitor_core, &mcore_data_type, mc);
36
+ RB_OBJ_WRITE(obj, &mc->mutex, Qnil);
37
+ RB_OBJ_WRITE(obj, &mc->owner, Qnil);
38
+ mc->count = 0;
39
+
40
+ return obj;
41
+ }
42
+
43
+ static struct monitor_core *
44
+ mcore_ptr(VALUE mcore)
45
+ {
46
+ struct monitor_core *mc;
47
+ TypedData_Get_Struct(mcore, struct monitor_core, &mcore_data_type, mc);
48
+ return mc;
49
+ }
50
+
51
+ /*
52
+ * call-seq:
53
+ * MonitorCore.new
54
+ * MonitorCore.new(mutex, owner, count)
55
+ *
56
+ * returns MonitorCore object
57
+ */
58
+ static VALUE
59
+ mcore_init(int argc, VALUE *argv, VALUE mcore)
60
+ {
61
+ struct monitor_core *mc = mcore_ptr(mcore);
62
+
63
+ if (argc == 0) {
64
+ RB_OBJ_WRITE(mcore, &mc->mutex, rb_mutex_new());
65
+ RB_OBJ_WRITE(mcore, &mc->owner, Qnil);
66
+ mc->count = 0;
67
+ }
68
+ else if(argc == 3) {
69
+ RB_OBJ_WRITE(mcore, &mc->mutex, argv[0]);
70
+ RB_OBJ_WRITE(mcore, &mc->owner, argv[1]);
71
+ mc->count = NUM2LONG(argv[2]);
72
+ }
73
+ else {
74
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 0 or 3)", argc);
75
+ }
76
+
77
+ return mcore;
78
+ }
79
+
80
+ static int
81
+ mc_owner_p(struct monitor_core *mc)
82
+ {
83
+ return mc->owner == rb_thread_current();
84
+ }
85
+
86
+ static VALUE
87
+ mcore_try_enter(VALUE mcore)
88
+ {
89
+ struct monitor_core *mc = mcore_ptr(mcore);
90
+
91
+ if (!mc_owner_p(mc)) {
92
+ if (!rb_mutex_trylock(mc->mutex)) {
93
+ return Qfalse;
94
+ }
95
+ RB_OBJ_WRITE(mcore, &mc->owner, rb_thread_current());
96
+ mc->count = 0;
97
+ }
98
+ mc->count += 1;
99
+ return Qtrue;
100
+ }
101
+
102
+ static VALUE
103
+ mcore_enter(VALUE mcore)
104
+ {
105
+ struct monitor_core *mc = mcore_ptr(mcore);
106
+ if (!mc_owner_p(mc)) {
107
+ rb_mutex_lock(mc->mutex);
108
+ RB_OBJ_WRITE(mcore, &mc->owner, rb_thread_current());
109
+ mc->count = 0;
110
+ }
111
+ mc->count++;
112
+ return Qnil;
113
+ }
114
+
115
+ static VALUE
116
+ mcore_exit(VALUE mcore)
117
+ {
118
+ struct monitor_core *mc = mcore_ptr(mcore);
119
+ mc->count--;
120
+ if (mc->count == 0) {
121
+ RB_OBJ_WRITE(mcore, &mc->owner, Qnil);
122
+ rb_mutex_unlock(mc->mutex);
123
+ }
124
+ return Qnil;
125
+ }
126
+
127
+ static VALUE
128
+ mcore_locked_p(VALUE mcore)
129
+ {
130
+ struct monitor_core *mc = mcore_ptr(mcore);
131
+ return rb_mutex_locked_p(mc->mutex);
132
+ }
133
+
134
+ static VALUE
135
+ mcore_owned_p(VALUE mcore)
136
+ {
137
+ struct monitor_core *mc = mcore_ptr(mcore);
138
+ return (rb_mutex_locked_p(mc->mutex) && mc_owner_p(mc)) ? Qtrue : Qfalse;
139
+ }
140
+
141
+ static VALUE
142
+ mcore_owner(VALUE mcore)
143
+ {
144
+ struct monitor_core *mc = mcore_ptr(mcore);
145
+ return mc->owner;
146
+ }
147
+
148
+ static VALUE
149
+ mcore_check_owner(VALUE mcore)
150
+ {
151
+ struct monitor_core *mc = mcore_ptr(mcore);
152
+ if (!mc_owner_p(mc)) {
153
+ rb_raise(rb_eThreadError, "current thread not owner");
154
+ }
155
+ return Qnil;
156
+ }
157
+
158
+ static VALUE
159
+ mcore_enter_for_cond(VALUE mcore, VALUE target_thread, VALUE count)
160
+ {
161
+ struct monitor_core *mc = mcore_ptr(mcore);
162
+ RB_OBJ_WRITE(mcore, &mc->owner, target_thread);
163
+ mc->count = NUM2LONG(count);
164
+ return Qnil;
165
+ }
166
+
167
+ static VALUE
168
+ mcore_exit_for_cond(VALUE mcore)
169
+ {
170
+ struct monitor_core *mc = mcore_ptr(mcore);
171
+ long cnt = mc->count;
172
+ if (!mc_owner_p(mc)) {
173
+ rb_raise(rb_eThreadError, "current thread not owner");
174
+ }
175
+ RB_OBJ_WRITE(mcore, &mc->owner, Qnil);
176
+ mc->count = 0;
177
+ return LONG2NUM(cnt);
178
+ }
179
+
180
+ static VALUE
181
+ mcore_mutex_for_cond(VALUE mcore)
182
+ {
183
+ struct monitor_core *mc = mcore_ptr(mcore);
184
+ return mc->mutex;
185
+ }
186
+
187
+ #if 0
188
+ static VALUE
189
+ mcore_sync_body(VALUE mcore)
190
+ {
191
+ return rb_yield_values(0);
192
+ }
193
+
194
+ static VALUE
195
+ mcore_sync_ensure(VALUE mcore)
196
+ {
197
+ return mcore_exit(mcore);
198
+ }
199
+
200
+ static VALUE
201
+ mcore_synchronize(VALUE mcore)
202
+ {
203
+ mcore_enter(mcore);
204
+ return rb_ensure(mcore_sync_body, mcore, mcore_sync_ensure, mcore);
205
+ }
206
+ #endif
207
+
208
+ /*
209
+ * call-seq:
210
+ * monitor_core.inspect -> string
211
+ *
212
+ */
213
+ VALUE
214
+ mcore_inspect(VALUE mcore)
215
+ {
216
+ struct monitor_core *mc = mcore_ptr(mcore);
217
+ return rb_sprintf("#<%s:%p mutex:%+"PRIsVALUE" owner:%+"PRIsVALUE" count:%ld>",
218
+ rb_obj_classname(mcore), (void*)mcore, mc->mutex, mc->owner, mc->count);
219
+ }
220
+
221
+ void
222
+ Init_ext_monitor(void)
223
+ {
224
+ /* Thread::MonitorCore (internal data for Monitor) */
225
+ VALUE rb_cMonitorCore = rb_define_class_under(rb_cThread, "MonitorCore", rb_cObject);
226
+ rb_define_alloc_func(rb_cMonitorCore, mcore_alloc);
227
+ rb_define_method(rb_cMonitorCore, "initialize", mcore_init, -1);
228
+ rb_define_method(rb_cMonitorCore, "try_enter", mcore_try_enter, 0);
229
+ rb_define_method(rb_cMonitorCore, "enter", mcore_enter, 0);
230
+ rb_define_method(rb_cMonitorCore, "exit", mcore_exit, 0);
231
+ rb_define_method(rb_cMonitorCore, "locked?", mcore_locked_p, 0);
232
+ rb_define_method(rb_cMonitorCore, "owned?", mcore_owned_p, 0);
233
+ rb_define_method(rb_cMonitorCore, "owner", mcore_owner, 0);
234
+ rb_define_method(rb_cMonitorCore, "check_owner", mcore_check_owner, 0);
235
+ rb_define_method(rb_cMonitorCore, "enter_for_cond", mcore_enter_for_cond, 2); // thread, count
236
+ rb_define_method(rb_cMonitorCore, "exit_for_cond", mcore_exit_for_cond, 0);
237
+ rb_define_method(rb_cMonitorCore, "mutex_for_cond", mcore_mutex_for_cond, 0);
238
+ #if 0
239
+ // Ruby definition is faster than C-impl now.
240
+ rb_define_method(rb_cMonitorCore, "synchronize", mcore_synchronize, 0);
241
+ #endif
242
+ rb_define_method(rb_cMonitorCore, "inspect", mcore_inspect, 0);
243
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef EXT_MONITOR_H
2
+ #define EXT_MONITOR_H 1
3
+
4
+ #include "ruby.h"
5
+
6
+ #endif /* EXT_MONITOR_H */
@@ -0,0 +1,3 @@
1
+ require "mkmf"
2
+
3
+ create_makefile("ext_monitor/ext_monitor")
@@ -0,0 +1,43 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "ext_monitor/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ext_monitor"
8
+ spec.version = ExtMonitor::VERSION
9
+ spec.authors = ["NARUSE, Yui"]
10
+ spec.email = ["naruse@airemix.jp"]
11
+
12
+ spec.summary = %q{faster MonitorMixin implementation}
13
+ spec.description = %q{faster MonitorMixin implementation with C extension which is introduced in Ruby 2.7}
14
+ spec.homepage = "https://github.com/nurse/ext_monitor"
15
+
16
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
20
+
21
+ spec.metadata["homepage_uri"] = spec.homepage
22
+ spec.metadata["source_code_uri"] = "https://github.com/nurse/ext_monitor"
23
+ else
24
+ raise "RubyGems 2.0 or newer is required to protect against " \
25
+ "public gem pushes."
26
+ end
27
+
28
+ # Specify which files should be added to the gem when it is released.
29
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
31
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
+ end
33
+ spec.bindir = "exe"
34
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
35
+ spec.require_paths = ["lib"]
36
+ spec.extensions = ["ext/ext_monitor/extconf.rb"]
37
+ spec.required_ruby_version = '~> 2.3'
38
+
39
+ spec.add_development_dependency "bundler", "~> 2.0"
40
+ spec.add_development_dependency "rake", "~> 10.0"
41
+ spec.add_development_dependency "rake-compiler"
42
+ spec.add_development_dependency "rspec", "~> 3.0"
43
+ end
@@ -0,0 +1,117 @@
1
+ require "monitor"
2
+ require "ext_monitor/version"
3
+ require "ext_monitor/ext_monitor"
4
+
5
+ module MonitorMixin
6
+ class ConditionVariable
7
+ remove_method :wait
8
+
9
+ #
10
+ # Releases the lock held in the associated monitor and waits; reacquires the lock on wakeup.
11
+ #
12
+ # If +timeout+ is given, this method returns after +timeout+ seconds passed,
13
+ # even if no other thread doesn't signal.
14
+ #
15
+ def wait(timeout = nil)
16
+ @monitor.__send__(:mon_check_owner)
17
+ count = @monitor.__send__(:mon_exit_for_cond)
18
+ begin
19
+ @cond.wait(@monitor.instance_variable_get(:@mon_data).mutex_for_cond, timeout)
20
+ return true
21
+ ensure
22
+ @monitor.__send__(:mon_enter_for_cond, count)
23
+ end
24
+ end
25
+ end
26
+
27
+ remove_method :mon_try_enter, :mon_enter, :mon_exit, :mon_synchronize,
28
+ :mon_initialize, :mon_check_owner, :mon_enter_for_cond, :mon_exit_for_cond
29
+ remove_method :mon_locked? if defined?(mon_locked?)
30
+ remove_method :mon_owned? if defined?(mon_owned?)
31
+
32
+ # Attempts to enter exclusive section. Returns +false+ if lock fails.
33
+ #
34
+ def mon_try_enter
35
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).try_enter
36
+ end
37
+
38
+ # Enters exclusive section.
39
+ #
40
+ def mon_enter
41
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).enter
42
+ end
43
+
44
+ #
45
+ # Leaves exclusive section.
46
+ #
47
+ def mon_exit
48
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).exit
49
+ end
50
+
51
+ #
52
+ # Returns true if this monitor is locked by any thread
53
+ #
54
+ def mon_locked?
55
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).locked?
56
+ end
57
+
58
+ #
59
+ # Returns true if this monitor is locked by current thread.
60
+ #
61
+ def mon_owned?
62
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).owned?
63
+ end
64
+
65
+ #
66
+ # Enters exclusive section and executes the block. Leaves the exclusive
67
+ # section automatically when the block exits. See example under
68
+ # +MonitorMixin+.
69
+ #
70
+ def mon_synchronize(&b)
71
+ @mon_data.enter
72
+ begin
73
+ yield
74
+ ensure
75
+ @mon_data.exit
76
+ end
77
+ end
78
+
79
+ # Initializes the MonitorMixin after being included in a class or when an
80
+ # object has been extended with the MonitorMixin
81
+ def mon_initialize
82
+ if defined?(@mon_data) && @mon_data_owner_object_id == self.object_id
83
+ raise ThreadError, "already initialized"
84
+ end
85
+ @mon_data = ::Thread::MonitorCore.new
86
+ @mon_data_owner_object_id = self.object_id
87
+ end
88
+
89
+ def mon_check_owner
90
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).check_owner
91
+ end
92
+
93
+
94
+ def mon_enter_for_cond(count)
95
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).enter_for_cond(Thread.current, count)
96
+ end
97
+
98
+ def mon_exit_for_cond
99
+ (defined?(@mon_data) ? @mon_data : use_monitor_core).exit_for_cond
100
+ end
101
+
102
+ def use_monitor_core
103
+ # below doesn't call RUBY_VM_CHECK_INTS
104
+ @mon_data = ::Thread::MonitorCore.new(@mon_mutex, @mon_owner, @mon_count)
105
+ @mon_data_owner_object_id = self.object_id
106
+ remove_instance_variable(:@mon_mutex)
107
+ remove_instance_variable(:@mon_owner)
108
+ remove_instance_variable(:@mon_count)
109
+ @mon_data
110
+ end
111
+ end
112
+ class Monitor
113
+ alias try_mon_enter mon_try_enter
114
+ alias try_enter try_mon_enter
115
+ alias enter mon_enter
116
+ alias exit mon_exit
117
+ end
@@ -0,0 +1,3 @@
1
+ module ExtMonitor
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ext_monitor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - NARUSE, Yui
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-10-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: faster MonitorMixin implementation with C extension which is introduced
70
+ in Ruby 2.7
71
+ email:
72
+ - naruse@airemix.jp
73
+ executables: []
74
+ extensions:
75
+ - ext/ext_monitor/extconf.rb
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".rspec"
80
+ - ".travis.yml"
81
+ - Gemfile
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - appveyor.yml
86
+ - bin/console
87
+ - bin/setup
88
+ - ext/ext_monitor/ext_monitor.c
89
+ - ext/ext_monitor/ext_monitor.h
90
+ - ext/ext_monitor/extconf.rb
91
+ - ext_monitor.gemspec
92
+ - lib/ext_monitor.rb
93
+ - lib/ext_monitor/version.rb
94
+ homepage: https://github.com/nurse/ext_monitor
95
+ licenses: []
96
+ metadata:
97
+ allowed_push_host: https://rubygems.org
98
+ homepage_uri: https://github.com/nurse/ext_monitor
99
+ source_code_uri: https://github.com/nurse/ext_monitor
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.3'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.0.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: faster MonitorMixin implementation
119
+ test_files: []