cool.io 1.0.0 → 1.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.
- data/.gitignore +26 -0
- data/.rspec +3 -0
- data/.travis.yml +4 -0
- data/{CHANGES → CHANGES.md} +43 -79
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/{README.markdown → README.md} +0 -4
- data/Rakefile +31 -67
- data/cool.io.gemspec +25 -133
- data/ext/cool.io/extconf.rb +3 -0
- data/ext/cool.io/stat_watcher.c +99 -23
- data/ext/libev/Changes +24 -0
- data/ext/libev/ev.c +78 -32
- data/ext/libev/ev.h +11 -8
- data/ext/libev/ev_epoll.c +39 -7
- data/ext/libev/ev_kqueue.c +5 -5
- data/ext/libev/ev_poll.c +5 -5
- data/ext/libev/ev_port.c +26 -11
- data/ext/libev/ev_select.c +11 -8
- data/ext/libev/ev_vars.h +10 -4
- data/ext/libev/ev_win32.c +6 -6
- data/ext/libev/ev_wrap.h +10 -0
- data/lib/cool.io.rb +3 -3
- data/lib/cool.io/async_watcher.rb +1 -1
- data/lib/cool.io/dns_resolver.rb +14 -12
- data/lib/cool.io/dsl.rb +26 -26
- data/lib/cool.io/eventmachine.rb +18 -18
- data/lib/cool.io/http_client.rb +29 -22
- data/lib/cool.io/io.rb +18 -18
- data/lib/cool.io/iowatcher.rb +1 -1
- data/lib/cool.io/listener.rb +2 -2
- data/lib/cool.io/loop.rb +12 -12
- data/lib/cool.io/meta.rb +4 -4
- data/lib/cool.io/server.rb +3 -3
- data/lib/cool.io/socket.rb +36 -28
- data/lib/cool.io/timer_watcher.rb +1 -1
- data/lib/cool.io/version.rb +5 -0
- data/lib/coolio.rb +1 -1
- data/spec/stat_watcher_spec.rb +77 -0
- metadata +47 -56
- data/VERSION +0 -1
- data/lib/rev.rb +0 -4
- data/spec/possible_tests/schedules_other_threads.rb +0 -48
- data/spec/possible_tests/test_on_resolve_failed.rb +0 -9
- data/spec/possible_tests/test_resolves.rb +0 -27
- data/spec/possible_tests/test_write_during_resolve.rb +0 -27
- data/spec/possible_tests/works_straight.rb +0 -71
data/cool.io.gemspec
CHANGED
@@ -1,138 +1,30 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cool.io/version"
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module Cool
|
6
|
+
# Allow Coolio module to be referenced as Cool.io
|
7
|
+
def self.io; Coolio; end
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.email
|
10
|
+
Gem::Specification.new do |s|
|
11
|
+
s.name = "cool.io"
|
12
|
+
s.version = Coolio::VERSION
|
13
|
+
s.authors = ["Tony Arcieri"]
|
14
|
+
s.email = ["tony.arcieri@gmail.com"]
|
15
|
+
s.homepage = "http://coolio.github.com"
|
16
|
+
s.summary = "A cool framework for doing high performance I/O in Ruby"
|
17
|
+
s.description = "Cool.io provides a high performance event framework for Ruby which uses the libev C library"
|
15
18
|
s.extensions = ["ext/cool.io/extconf.rb", "ext/http11_client/extconf.rb"]
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"LICENSE",
|
18
|
-
"README.markdown"
|
19
|
-
]
|
20
|
-
s.files = [
|
21
|
-
"CHANGES",
|
22
|
-
"LICENSE",
|
23
|
-
"README.markdown",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"cool.io.gemspec",
|
27
|
-
"examples/dslified_echo_client.rb",
|
28
|
-
"examples/dslified_echo_server.rb",
|
29
|
-
"examples/echo_client.rb",
|
30
|
-
"examples/echo_server.rb",
|
31
|
-
"examples/google.rb",
|
32
|
-
"examples/httpclient.rb",
|
33
|
-
"ext/cool.io/.gitignore",
|
34
|
-
"ext/cool.io/cool.io.h",
|
35
|
-
"ext/cool.io/cool.io_ext.c",
|
36
|
-
"ext/cool.io/ev_wrap.h",
|
37
|
-
"ext/cool.io/extconf.rb",
|
38
|
-
"ext/cool.io/iowatcher.c",
|
39
|
-
"ext/cool.io/libev.c",
|
40
|
-
"ext/cool.io/loop.c",
|
41
|
-
"ext/cool.io/stat_watcher.c",
|
42
|
-
"ext/cool.io/timer_watcher.c",
|
43
|
-
"ext/cool.io/utils.c",
|
44
|
-
"ext/cool.io/watcher.c",
|
45
|
-
"ext/cool.io/watcher.h",
|
46
|
-
"ext/http11_client/.gitignore",
|
47
|
-
"ext/http11_client/LICENSE",
|
48
|
-
"ext/http11_client/ext_help.h",
|
49
|
-
"ext/http11_client/extconf.rb",
|
50
|
-
"ext/http11_client/http11_client.c",
|
51
|
-
"ext/http11_client/http11_parser.c",
|
52
|
-
"ext/http11_client/http11_parser.h",
|
53
|
-
"ext/http11_client/http11_parser.rl",
|
54
|
-
"ext/libev/Changes",
|
55
|
-
"ext/libev/LICENSE",
|
56
|
-
"ext/libev/README",
|
57
|
-
"ext/libev/README.embed",
|
58
|
-
"ext/libev/ev.c",
|
59
|
-
"ext/libev/ev.h",
|
60
|
-
"ext/libev/ev_epoll.c",
|
61
|
-
"ext/libev/ev_kqueue.c",
|
62
|
-
"ext/libev/ev_poll.c",
|
63
|
-
"ext/libev/ev_port.c",
|
64
|
-
"ext/libev/ev_select.c",
|
65
|
-
"ext/libev/ev_vars.h",
|
66
|
-
"ext/libev/ev_win32.c",
|
67
|
-
"ext/libev/ev_wrap.h",
|
68
|
-
"ext/libev/test_libev_win32.c",
|
69
|
-
"lib/.gitignore",
|
70
|
-
"lib/cool.io.rb",
|
71
|
-
"lib/cool.io/async_watcher.rb",
|
72
|
-
"lib/cool.io/dns_resolver.rb",
|
73
|
-
"lib/cool.io/dsl.rb",
|
74
|
-
"lib/cool.io/eventmachine.rb",
|
75
|
-
"lib/cool.io/http_client.rb",
|
76
|
-
"lib/cool.io/io.rb",
|
77
|
-
"lib/cool.io/iowatcher.rb",
|
78
|
-
"lib/cool.io/listener.rb",
|
79
|
-
"lib/cool.io/loop.rb",
|
80
|
-
"lib/cool.io/meta.rb",
|
81
|
-
"lib/cool.io/server.rb",
|
82
|
-
"lib/cool.io/socket.rb",
|
83
|
-
"lib/cool.io/timer_watcher.rb",
|
84
|
-
"lib/coolio.rb",
|
85
|
-
"lib/rev.rb",
|
86
|
-
"spec/async_watcher_spec.rb",
|
87
|
-
"spec/dns_spec.rb",
|
88
|
-
"spec/possible_tests/schedules_other_threads.rb",
|
89
|
-
"spec/possible_tests/test_on_resolve_failed.rb",
|
90
|
-
"spec/possible_tests/test_resolves.rb",
|
91
|
-
"spec/possible_tests/test_write_during_resolve.rb",
|
92
|
-
"spec/possible_tests/works_straight.rb",
|
93
|
-
"spec/spec_helper.rb",
|
94
|
-
"spec/timer_watcher_spec.rb",
|
95
|
-
"spec/unix_listener_spec.rb",
|
96
|
-
"spec/unix_server_spec.rb"
|
97
|
-
]
|
98
|
-
s.homepage = %q{http://github.com/tarcieri/cool.io}
|
99
|
-
s.require_paths = ["lib"]
|
100
|
-
s.rubygems_version = %q{1.3.7}
|
101
|
-
s.summary = %q{The cool event framework for Ruby}
|
102
|
-
s.test_files = [
|
103
|
-
"examples/dslified_echo_client.rb",
|
104
|
-
"examples/dslified_echo_server.rb",
|
105
|
-
"examples/echo_client.rb",
|
106
|
-
"examples/echo_server.rb",
|
107
|
-
"examples/google.rb",
|
108
|
-
"examples/httpclient.rb",
|
109
|
-
"spec/async_watcher_spec.rb",
|
110
|
-
"spec/dns_spec.rb",
|
111
|
-
"spec/possible_tests/schedules_other_threads.rb",
|
112
|
-
"spec/possible_tests/test_on_resolve_failed.rb",
|
113
|
-
"spec/possible_tests/test_resolves.rb",
|
114
|
-
"spec/possible_tests/test_write_during_resolve.rb",
|
115
|
-
"spec/possible_tests/works_straight.rb",
|
116
|
-
"spec/spec_helper.rb",
|
117
|
-
"spec/timer_watcher_spec.rb",
|
118
|
-
"spec/unix_listener_spec.rb",
|
119
|
-
"spec/unix_server_spec.rb"
|
120
|
-
]
|
121
|
-
|
122
|
-
if s.respond_to? :specification_version then
|
123
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
124
|
-
s.specification_version = 3
|
125
|
-
|
126
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
127
|
-
s.add_runtime_dependency(%q<iobuffer>, [">= 0.1.3"])
|
128
|
-
s.add_development_dependency(%q<rspec>, [">= 2.1.0"])
|
129
|
-
else
|
130
|
-
s.add_dependency(%q<iobuffer>, [">= 0.1.3"])
|
131
|
-
s.add_dependency(%q<rspec>, [">= 2.1.0"])
|
132
|
-
end
|
133
|
-
else
|
134
|
-
s.add_dependency(%q<iobuffer>, [">= 0.1.3"])
|
135
|
-
s.add_dependency(%q<rspec>, [">= 2.1.0"])
|
136
|
-
end
|
137
|
-
end
|
138
19
|
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
|
25
|
+
s.add_dependency "iobuffer", ">= 1.0.0"
|
26
|
+
|
27
|
+
s.add_development_dependency "rake-compiler", "~> 0.7.9"
|
28
|
+
s.add_development_dependency "rspec", ">= 2.6.0"
|
29
|
+
s.add_development_dependency "rdoc", ">= 3.6.0"
|
30
|
+
end
|
data/ext/cool.io/extconf.rb
CHANGED
@@ -63,6 +63,9 @@ create_makefile('cool.io_ext')
|
|
63
63
|
if RUBY_PLATFORM =~ /mingw|win32/
|
64
64
|
makefile_contents = File.read 'Makefile'
|
65
65
|
|
66
|
+
# "Init_cool could not be found" when loading cool.io.so.
|
67
|
+
makefile_contents.gsub! 'DLDFLAGS = ', 'DLDFLAGS = -export-all '
|
68
|
+
|
66
69
|
makefile_contents.gsub! 'LIBS = $(LIBRUBYARG_SHARED)', 'LIBS = -lws2_32 $(LIBRUBYARG_SHARED)'
|
67
70
|
File.open('Makefile', 'w') { |f| f.write makefile_contents }
|
68
71
|
end
|
data/ext/cool.io/stat_watcher.c
CHANGED
@@ -13,6 +13,7 @@
|
|
13
13
|
static VALUE mCoolio = Qnil;
|
14
14
|
static VALUE cCoolio_Watcher = Qnil;
|
15
15
|
static VALUE cCoolio_StatWatcher = Qnil;
|
16
|
+
static VALUE cCoolio_StatInfo = Qnil;
|
16
17
|
static VALUE cCoolio_Loop = Qnil;
|
17
18
|
|
18
19
|
static VALUE Coolio_StatWatcher_initialize(int argc, VALUE *argv, VALUE self);
|
@@ -20,9 +21,11 @@ static VALUE Coolio_StatWatcher_attach(VALUE self, VALUE loop);
|
|
20
21
|
static VALUE Coolio_StatWatcher_detach(VALUE self);
|
21
22
|
static VALUE Coolio_StatWatcher_enable(VALUE self);
|
22
23
|
static VALUE Coolio_StatWatcher_disable(VALUE self);
|
23
|
-
static VALUE Coolio_StatWatcher_on_change(VALUE self);
|
24
|
+
static VALUE Coolio_StatWatcher_on_change(VALUE self, VALUE previous, VALUE current);
|
24
25
|
static VALUE Coolio_StatWatcher_path(VALUE self);
|
25
26
|
|
27
|
+
static VALUE Coolio_StatInfo_build(ev_statdata *statdata_struct);
|
28
|
+
|
26
29
|
static void Coolio_StatWatcher_libev_callback(struct ev_loop *ev_loop, struct ev_stat *stat, int revents);
|
27
30
|
static void Coolio_StatWatcher_dispatch_callback(VALUE self, int revents);
|
28
31
|
|
@@ -30,12 +33,27 @@ static void Coolio_StatWatcher_dispatch_callback(VALUE self, int revents);
|
|
30
33
|
* Coolio::StatWatcher lets you create either one-shot or periodic stats which
|
31
34
|
* run within Coolio's event loop. It's useful for creating timeouts or
|
32
35
|
* events which fire periodically.
|
33
|
-
|
36
|
+
**/
|
34
37
|
void Init_coolio_stat_watcher()
|
35
|
-
{
|
38
|
+
{
|
36
39
|
mCoolio = rb_define_module("Coolio");
|
37
40
|
cCoolio_Watcher = rb_define_class_under(mCoolio, "Watcher", rb_cObject);
|
38
41
|
cCoolio_StatWatcher = rb_define_class_under(mCoolio, "StatWatcher", cCoolio_Watcher);
|
42
|
+
cCoolio_StatInfo = rb_struct_define("StatInfo",
|
43
|
+
"mtime",
|
44
|
+
"ctime",
|
45
|
+
"atime",
|
46
|
+
"dev",
|
47
|
+
"ino",
|
48
|
+
"mode",
|
49
|
+
"nlink",
|
50
|
+
"uid",
|
51
|
+
"guid",
|
52
|
+
"rdev",
|
53
|
+
"size",
|
54
|
+
"blksize",
|
55
|
+
"blocks",
|
56
|
+
NULL);
|
39
57
|
cCoolio_Loop = rb_define_class_under(mCoolio, "Loop", rb_cObject);
|
40
58
|
|
41
59
|
rb_define_method(cCoolio_StatWatcher, "initialize", Coolio_StatWatcher_initialize, -1);
|
@@ -43,14 +61,14 @@ void Init_coolio_stat_watcher()
|
|
43
61
|
rb_define_method(cCoolio_StatWatcher, "detach", Coolio_StatWatcher_detach, 0);
|
44
62
|
rb_define_method(cCoolio_StatWatcher, "enable", Coolio_StatWatcher_enable, 0);
|
45
63
|
rb_define_method(cCoolio_StatWatcher, "disable", Coolio_StatWatcher_disable, 0);
|
46
|
-
rb_define_method(cCoolio_StatWatcher, "on_change", Coolio_StatWatcher_on_change,
|
64
|
+
rb_define_method(cCoolio_StatWatcher, "on_change", Coolio_StatWatcher_on_change, 2);
|
47
65
|
rb_define_method(cCoolio_StatWatcher, "path", Coolio_StatWatcher_path, 0);
|
48
66
|
}
|
49
67
|
|
50
68
|
/**
|
51
69
|
* call-seq:
|
52
70
|
* Coolio::StatWatcher.initialize(path, interval = 0) -> Coolio::StatWatcher
|
53
|
-
*
|
71
|
+
*
|
54
72
|
* Create a new Coolio::StatWatcher for the given path. This will monitor the
|
55
73
|
* given path for changes at the filesystem level. The interval argument
|
56
74
|
* specified how often in seconds the path should be polled for changes.
|
@@ -75,11 +93,11 @@ static VALUE Coolio_StatWatcher_initialize(int argc, VALUE *argv, VALUE self)
|
|
75
93
|
|
76
94
|
watcher_data->dispatch_callback = Coolio_StatWatcher_dispatch_callback;
|
77
95
|
ev_stat_init(
|
78
|
-
&watcher_data->event_types.ev_stat,
|
79
|
-
Coolio_StatWatcher_libev_callback,
|
80
|
-
RSTRING_PTR(path),
|
96
|
+
&watcher_data->event_types.ev_stat,
|
97
|
+
Coolio_StatWatcher_libev_callback,
|
98
|
+
RSTRING_PTR(path),
|
81
99
|
interval == Qnil ? 0 : NUM2DBL(interval)
|
82
|
-
);
|
100
|
+
);
|
83
101
|
watcher_data->event_types.ev_stat.data = (void *)self;
|
84
102
|
|
85
103
|
return Qnil;
|
@@ -88,7 +106,7 @@ static VALUE Coolio_StatWatcher_initialize(int argc, VALUE *argv, VALUE self)
|
|
88
106
|
/**
|
89
107
|
* call-seq:
|
90
108
|
* Coolio::StatWatcher.attach(loop) -> Coolio::StatWatcher
|
91
|
-
*
|
109
|
+
*
|
92
110
|
* Attach the stat watcher to the given Coolio::Loop. If the watcher is already
|
93
111
|
* attached to a loop, detach it from the old one and attach it to the new one.
|
94
112
|
*/
|
@@ -97,7 +115,7 @@ static VALUE Coolio_StatWatcher_attach(VALUE self, VALUE loop)
|
|
97
115
|
ev_tstamp interval, timeout;
|
98
116
|
struct Coolio_Loop *loop_data;
|
99
117
|
struct Coolio_Watcher *watcher_data;
|
100
|
-
|
118
|
+
|
101
119
|
if(!rb_obj_is_kind_of(loop, cCoolio_Loop))
|
102
120
|
rb_raise(rb_eArgError, "expected loop to be an instance of Coolio::Loop");
|
103
121
|
|
@@ -112,13 +130,13 @@ static VALUE Coolio_StatWatcher_attach(VALUE self, VALUE loop)
|
|
112
130
|
ev_stat_start(loop_data->ev_loop, &watcher_data->event_types.ev_stat);
|
113
131
|
rb_call_super(1, &loop);
|
114
132
|
|
115
|
-
return self;
|
133
|
+
return self;
|
116
134
|
}
|
117
135
|
|
118
136
|
/**
|
119
137
|
* call-seq:
|
120
138
|
* Coolio::StatWatcher.detach -> Coolio::StatWatcher
|
121
|
-
*
|
139
|
+
*
|
122
140
|
* Detach the stat watcher from its current Coolio::Loop.
|
123
141
|
*/
|
124
142
|
static VALUE Coolio_StatWatcher_detach(VALUE self)
|
@@ -131,7 +149,7 @@ static VALUE Coolio_StatWatcher_detach(VALUE self)
|
|
131
149
|
/**
|
132
150
|
* call-seq:
|
133
151
|
* Coolio::StatWatcher.enable -> Coolio::StatWatcher
|
134
|
-
*
|
152
|
+
*
|
135
153
|
* Re-enable a stat watcher which has been temporarily disabled. See the
|
136
154
|
* disable method for a more thorough explanation.
|
137
155
|
*/
|
@@ -139,15 +157,15 @@ static VALUE Coolio_StatWatcher_enable(VALUE self)
|
|
139
157
|
{
|
140
158
|
Watcher_Enable(stat, self);
|
141
159
|
|
142
|
-
return self;
|
160
|
+
return self;
|
143
161
|
}
|
144
162
|
|
145
163
|
/**
|
146
164
|
* call-seq:
|
147
165
|
* Coolio::StatWatcher.disable -> Coolio::StatWatcher
|
148
|
-
*
|
149
|
-
* Temporarily disable a stat watcher which is attached to a loop.
|
150
|
-
* This is useful if you wish to toggle event monitoring on and off.
|
166
|
+
*
|
167
|
+
* Temporarily disable a stat watcher which is attached to a loop.
|
168
|
+
* This is useful if you wish to toggle event monitoring on and off.
|
151
169
|
*/
|
152
170
|
static VALUE Coolio_StatWatcher_disable(VALUE self)
|
153
171
|
{
|
@@ -159,10 +177,10 @@ static VALUE Coolio_StatWatcher_disable(VALUE self)
|
|
159
177
|
/**
|
160
178
|
* call-seq:
|
161
179
|
* Coolio::StatWatcher#on_change -> nil
|
162
|
-
*
|
180
|
+
*
|
163
181
|
* Called whenever the status of the given path changes
|
164
182
|
*/
|
165
|
-
static VALUE Coolio_StatWatcher_on_change(VALUE self)
|
183
|
+
static VALUE Coolio_StatWatcher_on_change(VALUE self, VALUE previous, VALUE current)
|
166
184
|
{
|
167
185
|
return Qnil;
|
168
186
|
}
|
@@ -170,7 +188,7 @@ static VALUE Coolio_StatWatcher_on_change(VALUE self)
|
|
170
188
|
/**
|
171
189
|
* call-seq:
|
172
190
|
* Coolio::StatWatcher#path -> String
|
173
|
-
*
|
191
|
+
*
|
174
192
|
* Retrieve the path associated with this StatWatcher
|
175
193
|
*/
|
176
194
|
static VALUE Coolio_StatWatcher_path(VALUE self)
|
@@ -186,6 +204,64 @@ static void Coolio_StatWatcher_libev_callback(struct ev_loop *ev_loop, struct ev
|
|
186
204
|
|
187
205
|
/* Coolio::Loop dispatch callback */
|
188
206
|
static void Coolio_StatWatcher_dispatch_callback(VALUE self, int revents)
|
189
|
-
{
|
190
|
-
|
207
|
+
{
|
208
|
+
struct Coolio_Watcher *watcher_data;
|
209
|
+
Data_Get_Struct(self, struct Coolio_Watcher, watcher_data);
|
210
|
+
|
211
|
+
VALUE previous_statdata = Coolio_StatInfo_build(&watcher_data->event_types.ev_stat.prev);
|
212
|
+
VALUE current_statdata = Coolio_StatInfo_build(&watcher_data->event_types.ev_stat.attr);
|
213
|
+
rb_funcall(self, rb_intern("on_change"), 2, previous_statdata, current_statdata);
|
214
|
+
}
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Convience method to build StatInfo structs given an ev_statdata
|
218
|
+
* */
|
219
|
+
static VALUE Coolio_StatInfo_build(ev_statdata *statdata_struct)
|
220
|
+
{
|
221
|
+
VALUE at_method = rb_intern("at");
|
222
|
+
VALUE cTime = rb_const_get(rb_cObject, rb_intern("Time"));
|
223
|
+
|
224
|
+
VALUE mtime = Qnil;
|
225
|
+
VALUE ctime = Qnil;
|
226
|
+
VALUE atime = Qnil;
|
227
|
+
VALUE dev = Qnil;
|
228
|
+
VALUE ino = Qnil;
|
229
|
+
VALUE mode = Qnil;
|
230
|
+
VALUE nlink = Qnil;
|
231
|
+
VALUE uid = Qnil;
|
232
|
+
VALUE gid = Qnil;
|
233
|
+
VALUE rdev = Qnil;
|
234
|
+
VALUE size = Qnil;
|
235
|
+
VALUE blksize = Qnil;
|
236
|
+
VALUE blocks = Qnil;
|
237
|
+
|
238
|
+
mtime = rb_funcall(cTime, at_method, 1, INT2NUM(statdata_struct->st_mtime));
|
239
|
+
ctime = rb_funcall(cTime, at_method, 1, INT2NUM(statdata_struct->st_ctime));
|
240
|
+
atime = rb_funcall(cTime, at_method, 1, INT2NUM(statdata_struct->st_atime));
|
241
|
+
dev = INT2NUM(statdata_struct->st_dev);
|
242
|
+
ino = INT2NUM(statdata_struct->st_ino);
|
243
|
+
mode = INT2NUM(statdata_struct->st_mode);
|
244
|
+
nlink = INT2NUM(statdata_struct->st_nlink);
|
245
|
+
uid = INT2NUM(statdata_struct->st_uid);
|
246
|
+
gid = INT2NUM(statdata_struct->st_gid);
|
247
|
+
rdev = INT2NUM(statdata_struct->st_rdev);
|
248
|
+
size = INT2NUM(statdata_struct->st_size);
|
249
|
+
blksize = INT2NUM(statdata_struct->st_blksize);
|
250
|
+
blocks = INT2NUM(statdata_struct->st_blocks);
|
251
|
+
|
252
|
+
return rb_struct_new(cCoolio_StatInfo,
|
253
|
+
mtime,
|
254
|
+
ctime,
|
255
|
+
atime,
|
256
|
+
dev,
|
257
|
+
ino,
|
258
|
+
mode,
|
259
|
+
nlink,
|
260
|
+
uid,
|
261
|
+
gid,
|
262
|
+
rdev,
|
263
|
+
size,
|
264
|
+
blksize,
|
265
|
+
blocks,
|
266
|
+
NULL);
|
191
267
|
}
|
data/ext/libev/Changes
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
Revision history for libev, a high-performance and full-featured event loop.
|
2
2
|
|
3
|
+
4.04 Wed Feb 16 09:01:51 CET 2011
|
4
|
+
- fix two problems in the native win32 backend, where reuse of fd's
|
5
|
+
with different underlying handles caused handles not to be removed
|
6
|
+
or added to the select set (analyzed and tested by Bert Belder).
|
7
|
+
- do no rely on ceil() in ev_e?poll.c.
|
8
|
+
- backport libev to HP-UX versions before 11 v3.
|
9
|
+
- configure did not detect nanosleep and clock_gettime properly when
|
10
|
+
they are available in the libc (as opposed to -lrt).
|
11
|
+
|
12
|
+
4.03 Tue Jan 11 14:37:25 CET 2011
|
13
|
+
- officially support polling files with all backends.
|
14
|
+
- support files, /dev/zero etc. the same way as select in the epoll
|
15
|
+
backend, by generating events on our own.
|
16
|
+
- ports backend: work around solaris bug 6874410 and many related ones
|
17
|
+
(EINTR, maybe more), with no performance loss (note that the solaris
|
18
|
+
bug report is actually wrong, reality is far more bizarre and broken
|
19
|
+
than that).
|
20
|
+
- define EV_READ/EV_WRITE as macros in event.h, as some programs use
|
21
|
+
#ifdef to test for them.
|
22
|
+
- new (experimental) function: ev_feed_signal.
|
23
|
+
- new (to become default) EVFLAG_NOSIGMASK flag.
|
24
|
+
- new EVBACKEND_MASK symbol.
|
25
|
+
- updated COMMON IDIOMS SECTION.
|
26
|
+
|
3
27
|
4.01 Fri Nov 5 21:51:29 CET 2010
|
4
28
|
- automake fucked it up, apparently, --add-missing -f is not quite enough
|
5
29
|
to make it update its files, so 4.00 didn't install ev++.h and
|
data/ext/libev/ev.c
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
/*
|
2
2
|
* libev event processing core, watcher management
|
3
3
|
*
|
4
|
-
* Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann <libev@schmorp.de>
|
4
|
+
* Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without modifica-
|
8
8
|
* tion, are permitted provided that the following conditions are met:
|
9
|
-
*
|
9
|
+
*
|
10
10
|
* 1. Redistributions of source code must retain the above copyright notice,
|
11
11
|
* this list of conditions and the following disclaimer.
|
12
|
-
*
|
12
|
+
*
|
13
13
|
* 2. Redistributions in binary form must reproduce the above copyright
|
14
14
|
* notice, this list of conditions and the following disclaimer in the
|
15
15
|
* documentation and/or other materials provided with the distribution.
|
16
|
-
*
|
16
|
+
*
|
17
17
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
18
18
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
|
19
19
|
* CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
@@ -378,7 +378,8 @@ EV_CPP(extern "C" {)
|
|
378
378
|
#endif
|
379
379
|
|
380
380
|
#if !EV_USE_NANOSLEEP
|
381
|
-
|
381
|
+
/* hp-ux has it in sys/time.h, which we unconditionally include above */
|
382
|
+
# if !defined(_WIN32) && !defined(__hpux)
|
382
383
|
# include <sys/select.h>
|
383
384
|
# endif
|
384
385
|
#endif
|
@@ -817,6 +818,14 @@ ev_sleep (ev_tstamp delay)
|
|
817
818
|
}
|
818
819
|
}
|
819
820
|
|
821
|
+
inline_speed int
|
822
|
+
ev_timeout_to_ms (ev_tstamp timeout)
|
823
|
+
{
|
824
|
+
int ms = timeout * 1000. + .999999;
|
825
|
+
|
826
|
+
return expect_true (ms) ? ms : timeout < 1e-6 ? 0 : 1;
|
827
|
+
}
|
828
|
+
|
820
829
|
/*****************************************************************************/
|
821
830
|
|
822
831
|
#define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */
|
@@ -967,6 +976,31 @@ fd_reify (EV_P)
|
|
967
976
|
{
|
968
977
|
int i;
|
969
978
|
|
979
|
+
#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP
|
980
|
+
for (i = 0; i < fdchangecnt; ++i)
|
981
|
+
{
|
982
|
+
int fd = fdchanges [i];
|
983
|
+
ANFD *anfd = anfds + fd;
|
984
|
+
|
985
|
+
if (anfd->reify & EV__IOFDSET)
|
986
|
+
{
|
987
|
+
SOCKET handle = EV_FD_TO_WIN32_HANDLE (fd);
|
988
|
+
|
989
|
+
if (handle != anfd->handle)
|
990
|
+
{
|
991
|
+
unsigned long arg;
|
992
|
+
|
993
|
+
assert (("libev: only socket fds supported in this configuration", ioctlsocket (handle, FIONREAD, &arg) == 0));
|
994
|
+
|
995
|
+
/* handle changed, but fd didn't - we need to do it in two steps */
|
996
|
+
backend_modify (EV_A_ fd, anfd->events, 0);
|
997
|
+
anfd->events = 0;
|
998
|
+
anfd->handle = handle;
|
999
|
+
}
|
1000
|
+
}
|
1001
|
+
}
|
1002
|
+
#endif
|
1003
|
+
|
970
1004
|
for (i = 0; i < fdchangecnt; ++i)
|
971
1005
|
{
|
972
1006
|
int fd = fdchanges [i];
|
@@ -978,16 +1012,6 @@ fd_reify (EV_P)
|
|
978
1012
|
|
979
1013
|
anfd->reify = 0;
|
980
1014
|
|
981
|
-
#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP
|
982
|
-
if (o_reify & EV__IOFDSET)
|
983
|
-
{
|
984
|
-
unsigned long arg;
|
985
|
-
anfd->handle = EV_FD_TO_WIN32_HANDLE (fd);
|
986
|
-
assert (("libev: only socket fds supported in this configuration", ioctlsocket (anfd->handle, FIONREAD, &arg) == 0));
|
987
|
-
printf ("oi %d %x\n", fd, anfd->handle);//D
|
988
|
-
}
|
989
|
-
#endif
|
990
|
-
|
991
1015
|
/*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */
|
992
1016
|
{
|
993
1017
|
anfd->events = 0;
|
@@ -1345,14 +1369,16 @@ pipecb (EV_P_ ev_io *iow, int revents)
|
|
1345
1369
|
read (evpipe [0], &dummy, 1);
|
1346
1370
|
}
|
1347
1371
|
|
1372
|
+
#if EV_SIGNAL_ENABLE
|
1348
1373
|
if (sig_pending)
|
1349
|
-
{
|
1374
|
+
{
|
1350
1375
|
sig_pending = 0;
|
1351
1376
|
|
1352
1377
|
for (i = EV_NSIG - 1; i--; )
|
1353
1378
|
if (expect_false (signals [i].pending))
|
1354
1379
|
ev_feed_signal_event (EV_A_ i + 1);
|
1355
1380
|
}
|
1381
|
+
#endif
|
1356
1382
|
|
1357
1383
|
#if EV_ASYNC_ENABLE
|
1358
1384
|
if (async_pending)
|
@@ -1371,19 +1397,28 @@ pipecb (EV_P_ ev_io *iow, int revents)
|
|
1371
1397
|
|
1372
1398
|
/*****************************************************************************/
|
1373
1399
|
|
1374
|
-
|
1375
|
-
|
1400
|
+
void
|
1401
|
+
ev_feed_signal (int signum)
|
1376
1402
|
{
|
1377
1403
|
#if EV_MULTIPLICITY
|
1378
1404
|
EV_P = signals [signum - 1].loop;
|
1405
|
+
|
1406
|
+
if (!EV_A)
|
1407
|
+
return;
|
1379
1408
|
#endif
|
1380
1409
|
|
1410
|
+
signals [signum - 1].pending = 1;
|
1411
|
+
evpipe_write (EV_A_ &sig_pending);
|
1412
|
+
}
|
1413
|
+
|
1414
|
+
static void
|
1415
|
+
ev_sighandler (int signum)
|
1416
|
+
{
|
1381
1417
|
#ifdef _WIN32
|
1382
1418
|
signal (signum, ev_sighandler);
|
1383
1419
|
#endif
|
1384
1420
|
|
1385
|
-
|
1386
|
-
evpipe_write (EV_A_ &sig_pending);
|
1421
|
+
ev_feed_signal (signum);
|
1387
1422
|
}
|
1388
1423
|
|
1389
1424
|
void noinline
|
@@ -1645,6 +1680,8 @@ loop_init (EV_P_ unsigned int flags)
|
|
1645
1680
|
{
|
1646
1681
|
if (!backend)
|
1647
1682
|
{
|
1683
|
+
origflags = flags;
|
1684
|
+
|
1648
1685
|
#if EV_USE_REALTIME
|
1649
1686
|
if (!have_realtime)
|
1650
1687
|
{
|
@@ -1699,7 +1736,7 @@ loop_init (EV_P_ unsigned int flags)
|
|
1699
1736
|
sigfd = flags & EVFLAG_SIGNALFD ? -2 : -1;
|
1700
1737
|
#endif
|
1701
1738
|
|
1702
|
-
if (!(flags &
|
1739
|
+
if (!(flags & EVBACKEND_MASK))
|
1703
1740
|
flags |= ev_recommended_backends ();
|
1704
1741
|
|
1705
1742
|
#if EV_USE_IOCP
|
@@ -2102,9 +2139,6 @@ ev_invoke_pending (EV_P)
|
|
2102
2139
|
{
|
2103
2140
|
ANPENDING *p = pendings [pri] + --pendingcnt [pri];
|
2104
2141
|
|
2105
|
-
/*assert (("libev: non-pending watcher on pending list", p->w->pending));*/
|
2106
|
-
/* ^ this is no longer true, as pending_w could be here */
|
2107
|
-
|
2108
2142
|
p->w->pending = 0;
|
2109
2143
|
EV_CB_INVOKE (p->w, p->events);
|
2110
2144
|
EV_FREQUENT_CHECK;
|
@@ -2175,6 +2209,15 @@ timers_reify (EV_P)
|
|
2175
2209
|
}
|
2176
2210
|
|
2177
2211
|
#if EV_PERIODIC_ENABLE
|
2212
|
+
|
2213
|
+
inline_speed void
|
2214
|
+
periodic_recalc (EV_P_ ev_periodic *w)
|
2215
|
+
{
|
2216
|
+
/* TODO: use slow but potentially more correct incremental algo, */
|
2217
|
+
/* also do not rely on ceil */
|
2218
|
+
ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval;
|
2219
|
+
}
|
2220
|
+
|
2178
2221
|
/* make periodics pending */
|
2179
2222
|
inline_size void
|
2180
2223
|
periodics_reify (EV_P)
|
@@ -2203,7 +2246,8 @@ periodics_reify (EV_P)
|
|
2203
2246
|
}
|
2204
2247
|
else if (w->interval)
|
2205
2248
|
{
|
2206
|
-
|
2249
|
+
periodic_recalc (EV_A_ w);
|
2250
|
+
|
2207
2251
|
/* if next trigger time is not sufficiently in the future, put it there */
|
2208
2252
|
/* this might happen because of floating point inexactness */
|
2209
2253
|
if (ev_at (w) - ev_rt_now < TIME_EPSILON)
|
@@ -2247,7 +2291,7 @@ periodics_reschedule (EV_P)
|
|
2247
2291
|
if (w->reschedule_cb)
|
2248
2292
|
ev_at (w) = w->reschedule_cb (w, ev_rt_now);
|
2249
2293
|
else if (w->interval)
|
2250
|
-
|
2294
|
+
periodic_recalc (EV_A_ w);
|
2251
2295
|
|
2252
2296
|
ANHE_at_cache (periodics [i]);
|
2253
2297
|
}
|
@@ -2749,8 +2793,7 @@ ev_periodic_start (EV_P_ ev_periodic *w)
|
|
2749
2793
|
else if (w->interval)
|
2750
2794
|
{
|
2751
2795
|
assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.));
|
2752
|
-
|
2753
|
-
ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval;
|
2796
|
+
periodic_recalc (EV_A_ w);
|
2754
2797
|
}
|
2755
2798
|
else
|
2756
2799
|
ev_at (w) = w->offset;
|
@@ -2881,9 +2924,12 @@ ev_signal_start (EV_P_ ev_signal *w)
|
|
2881
2924
|
sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */
|
2882
2925
|
sigaction (w->signum, &sa, 0);
|
2883
2926
|
|
2884
|
-
|
2885
|
-
|
2886
|
-
|
2927
|
+
if (origflags & EVFLAG_NOSIGMASK)
|
2928
|
+
{
|
2929
|
+
sigemptyset (&sa.sa_mask);
|
2930
|
+
sigaddset (&sa.sa_mask, w->signum);
|
2931
|
+
sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0);
|
2932
|
+
}
|
2887
2933
|
#endif
|
2888
2934
|
}
|
2889
2935
|
|
@@ -3034,7 +3080,7 @@ infy_add (EV_P_ ev_stat *w)
|
|
3034
3080
|
|
3035
3081
|
*pend = 0;
|
3036
3082
|
w->wd = inotify_add_watch (fs_fd, path, mask);
|
3037
|
-
}
|
3083
|
+
}
|
3038
3084
|
while (w->wd < 0 && (errno == ENOENT || errno == EACCES));
|
3039
3085
|
}
|
3040
3086
|
}
|