rb-kqueue 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rb-kqueue.rb +1 -1
- data/lib/rb-kqueue/native.rb +3 -0
- data/lib/rb-kqueue/queue.rb +16 -4
- data/lib/rb-kqueue/watcher/file.rb +36 -1
- data/lib/rb-kqueue/watcher/read_write.rb +12 -0
- data/lib/rb-kqueue/watcher/socket_read_write.rb +5 -0
- data/rb-kqueue.gemspec +1 -1
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/rb-kqueue.rb
CHANGED
@@ -13,7 +13,7 @@ require 'rb-kqueue/queue'
|
|
13
13
|
# * {Watcher} -- A watcher for a single sort of event
|
14
14
|
# * {Event} -- A notification that an event has occurred
|
15
15
|
module KQueue
|
16
|
-
VERSION = [0, 0,
|
16
|
+
VERSION = [0, 0, 3]
|
17
17
|
|
18
18
|
# Raise an exception for a native kqueue error.
|
19
19
|
#
|
data/lib/rb-kqueue/native.rb
CHANGED
data/lib/rb-kqueue/queue.rb
CHANGED
@@ -66,6 +66,10 @@ module KQueue
|
|
66
66
|
# The {Event#data} field is set to the number of bytes available.
|
67
67
|
# When the last writer disconnects, {Event#eof?} will be set.
|
68
68
|
#
|
69
|
+
# Note that this isn't compatible with JRuby
|
70
|
+
# unless a native-code file descriptor is passed in.
|
71
|
+
# This means the file descriptor must be returned by an FFI-wrapped C function.
|
72
|
+
#
|
69
73
|
# @param fd [IO, Fixnum] A Ruby IO stream, or the file descriptor
|
70
74
|
# for a native IO stream.
|
71
75
|
# @yield [event] A block that will be run when the specified stream
|
@@ -75,7 +79,6 @@ module KQueue
|
|
75
79
|
# @return [Watcher] The Watcher for this event.
|
76
80
|
# @raise [SystemCallError] If something goes wrong when registering the Watcher.
|
77
81
|
def watch_stream_for_read(fd, &callback)
|
78
|
-
fd = fd.fileno if fd.respond_to?(:fileno)
|
79
82
|
Watcher::ReadWrite.new(self, fd, :read, callback)
|
80
83
|
end
|
81
84
|
|
@@ -97,6 +100,10 @@ module KQueue
|
|
97
100
|
# It's possible for {Event#eof?} to be set while there's still
|
98
101
|
# data pending in the socket buffer.
|
99
102
|
#
|
103
|
+
# Note that this isn't compatible with JRuby
|
104
|
+
# unless a native-code file descriptor is passed in.
|
105
|
+
# This means the file descriptor must be returned by an FFI-wrapped C function.
|
106
|
+
#
|
100
107
|
# @param fd [Socket, Fixnum] A Ruby Socket, or the file descriptor
|
101
108
|
# for a native Socket.
|
102
109
|
# @param low_water [Fixnum] The low-water mark for new data.
|
@@ -107,7 +114,6 @@ module KQueue
|
|
107
114
|
# @return [Watcher] The Watcher for this event.
|
108
115
|
# @raise [SystemCallError] If something goes wrong when registering the Watcher.
|
109
116
|
def watch_socket_for_read(fd, low_water = nil, &callback)
|
110
|
-
fd = fd.fileno if fd.respond_to?(:fileno)
|
111
117
|
Watcher::SocketReadWrite.new(self, fd, :read, low_water, callback)
|
112
118
|
end
|
113
119
|
|
@@ -119,6 +125,10 @@ module KQueue
|
|
119
125
|
# remaining in the write buffer.
|
120
126
|
# When the reader disconnects, {Event#eof?} will be set.
|
121
127
|
#
|
128
|
+
# Note that this isn't compatible with JRuby
|
129
|
+
# unless a native-code file descriptor is passed in.
|
130
|
+
# This means the file descriptor must be returned by an FFI-wrapped C function.
|
131
|
+
#
|
122
132
|
# @param fd [IO, Fixnum] A Ruby IO stream, or the file descriptor
|
123
133
|
# for a native IO stream.
|
124
134
|
# @yield [event] A block that will be run when the specified stream
|
@@ -128,7 +138,6 @@ module KQueue
|
|
128
138
|
# @return [Watcher] The Watcher for this event.
|
129
139
|
# @raise [SystemCallError] If something goes wrong when registering the Watcher.
|
130
140
|
def watch_stream_for_write(fd, &callback)
|
131
|
-
fd = fd.fileno if fd.respond_to?(:fileno)
|
132
141
|
Watcher::ReadWrite.new(self, fd, :write, callback)
|
133
142
|
end
|
134
143
|
|
@@ -146,6 +155,10 @@ module KQueue
|
|
146
155
|
# It's possible for {Event#eof?} to be set while there's still
|
147
156
|
# data pending in the socket buffer.
|
148
157
|
#
|
158
|
+
# Note that this isn't compatible with JRuby
|
159
|
+
# unless a native-code file descriptor is passed in.
|
160
|
+
# This means the file descriptor must be returned by an FFI-wrapped C function.
|
161
|
+
#
|
149
162
|
# @param fd [Socket, Fixnum] A Ruby Socket, or the file descriptor
|
150
163
|
# for a native Socket.
|
151
164
|
# @param low_water [Fixnum] The low-water mark for new data.
|
@@ -156,7 +169,6 @@ module KQueue
|
|
156
169
|
# @return [Watcher] The Watcher for this event.
|
157
170
|
# @raise [SystemCallError] If something goes wrong when registering the Watcher.
|
158
171
|
def watch_socket_for_write(fd, low_water = nil, &callback)
|
159
|
-
fd = fd.fileno if fd.respond_to?(:fileno)
|
160
172
|
Watcher::SocketReadWrite.new(self, fd, :write, low_water, callback)
|
161
173
|
end
|
162
174
|
|
@@ -13,7 +13,42 @@ module KQueue
|
|
13
13
|
# @private
|
14
14
|
def initialize(queue, path, flags, callback)
|
15
15
|
@path = path
|
16
|
-
@
|
16
|
+
@fd = Native.open(path, 0) # 0 means "read only"
|
17
|
+
|
18
|
+
if @fd < 0
|
19
|
+
raise SystemCallError.new(
|
20
|
+
"Failed to open file #{path}" +
|
21
|
+
case FFI.errno
|
22
|
+
when Errno::EACCES::Errno; ": Permission denied."
|
23
|
+
when Errno::EAGAIN::Errno; ": Slave side of a locked pseudo-terminal device."
|
24
|
+
when Errno::EFAULT::Errno; ": Outside the process's allocated address space."
|
25
|
+
when Errno::EINTR::Errno; ": Interrupted."
|
26
|
+
when Errno::ELOOP::Errno; ": Too many symbolic links (possible loop)."
|
27
|
+
when Errno::EMFILE::Errno; ": Too many open files."
|
28
|
+
when Errno::ENAMETOOLONG::Errno; ": Name too long."
|
29
|
+
when Errno::ENFILE::Errno; ": System file table is full."
|
30
|
+
when Errno::ENOENT::Errno; ": File doesn't exist."
|
31
|
+
when Errno::ENOTDIR::Errno; ": A component of the path prefix is not a directory."
|
32
|
+
when Errno::ENXIO::Errno; ": The device associated with this file doesn't exist."
|
33
|
+
when Errno::EOPNOTSUPP::Errno; ": File type not supported."
|
34
|
+
when Errno::EOVERFLOW::Errno; ": File too big."
|
35
|
+
else; ""
|
36
|
+
end,
|
37
|
+
FFI.errno)
|
38
|
+
end
|
39
|
+
|
40
|
+
ObjectSpace.define_finalizer(self, lambda do
|
41
|
+
next unless Native.close(@fd) < 0
|
42
|
+
raise SystemCallError.new(
|
43
|
+
"Failed to close file #{path}" +
|
44
|
+
case FFI.errno
|
45
|
+
when Errno::EBADF::Errno; ": Invalid file descriptor."
|
46
|
+
when Errno::EINTR::Errno; ": Closing interrupted."
|
47
|
+
when Errno::EIO::Errno; ": IO error."
|
48
|
+
else; ""
|
49
|
+
end,
|
50
|
+
FFI.errno)
|
51
|
+
end)
|
17
52
|
super(queue, @file.fileno, :vnode, flags, nil, callback)
|
18
53
|
end
|
19
54
|
end
|
@@ -9,6 +9,13 @@ module KQueue
|
|
9
9
|
# Note that read and write events for sockets
|
10
10
|
# use the {SocketReadWrite} class.
|
11
11
|
class ReadWrite < Watcher
|
12
|
+
# The Ruby IO object from which the file descriptor was extracted.
|
13
|
+
# This is only set if an IO object was used to construct this watcher.
|
14
|
+
# Otherwise, it's `nil`.
|
15
|
+
#
|
16
|
+
# @return [IO, nil]
|
17
|
+
attr_reader :io
|
18
|
+
|
12
19
|
# The file descriptor for the stream being watched.
|
13
20
|
#
|
14
21
|
# @return [Fixnum]
|
@@ -23,6 +30,11 @@ module KQueue
|
|
23
30
|
#
|
24
31
|
# @private
|
25
32
|
def initialize(queue, fd, type, callback)
|
33
|
+
if fd.is_a?(IO)
|
34
|
+
@io = fd
|
35
|
+
fd = fd.fileno
|
36
|
+
end
|
37
|
+
|
26
38
|
@fd = fd
|
27
39
|
@type = type
|
28
40
|
super(queue, @fd, type, [], nil, callback)
|
data/rb-kqueue.gemspec
CHANGED