Skip to content

Commit 281d9de

Browse files
authored
Merge pull request #28 from blitline-dev/master
Update to work with Crystal 1.8
2 parents d6d25ac + 8b62578 commit 281d9de

File tree

1 file changed

+46
-42
lines changed

1 file changed

+46
-42
lines changed

src/zeromq/socket.cr

+46-42
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,40 @@
11
# EventLoop support
22
# Crystal Update for zmq sockets
3-
module Crystal::EventLoop
4-
def self.create_fd_write_event(sock : ZMQ::Socket, edge_triggered : Bool = false)
5-
flags = LibEvent2::EventFlags::Write
6-
flags |= LibEvent2::EventFlags::Persist | LibEvent2::EventFlags::ET #we always do this as ZMQ is edge triggers
7-
event = @@eb.new_event(sock.fd, flags, sock) do |_, sflags, data|
8-
sock_ref = data.as(ZMQ::Socket)
9-
zmq_events = sock_ref.events
10-
is_writable = zmq_events & ZMQ::POLLOUT
11-
if is_writable && sflags.includes?(LibEvent2::EventFlags::Write)
12-
sock_ref.resume_write
13-
elsif sflags.includes?(LibEvent2::EventFlags::Timeout)
14-
sock_ref.resume_write(timed_out: true)
15-
end
3+
class Crystal::LibEvent::EventLoop
4+
def create_fd_write_event(sock : ZMQ::Socket, edge_triggered : Bool = false)
5+
flags = LibEvent2::EventFlags::Write
6+
flags |= LibEvent2::EventFlags::Persist | LibEvent2::EventFlags::ET # we always do this as ZMQ is edge triggers
7+
event = event_base.new_event(sock.fd, flags, sock) do |_, sflags, data|
8+
sock_ref = data.as(ZMQ::Socket)
9+
zmq_events = sock_ref.events
10+
is_writable = zmq_events & ZMQ::POLLOUT
11+
if is_writable && sflags.includes?(LibEvent2::EventFlags::Write)
12+
sock_ref.resume_write
13+
elsif sflags.includes?(LibEvent2::EventFlags::Timeout)
14+
sock_ref.resume_write(timed_out: true)
1615
end
17-
event
16+
end
17+
event
1818
end
19-
def self.create_fd_read_event(sock : ZMQ::Socket, edge_triggered : Bool = false)
20-
flags = LibEvent2::EventFlags::Read
21-
flags |= LibEvent2::EventFlags::Persist | LibEvent2::EventFlags::ET #we always do this as ZMQ is edge triggers
22-
event = @@eb.new_event(sock.fd, flags, sock) do |_, sflags, data|
23-
sock_ref = data.as(ZMQ::Socket)
24-
zmq_events = sock_ref.events
25-
is_readable = zmq_events & ZMQ::POLLIN
26-
if is_readable && sflags.includes?(LibEvent2::EventFlags::Read)
27-
sock_ref.resume_read
28-
elsif sflags.includes?(LibEvent2::EventFlags::Timeout)
29-
sock_ref.resume_read(timed_out: true)
30-
end
19+
20+
def create_fd_read_event(sock : ZMQ::Socket, edge_triggered : Bool = false)
21+
flags = LibEvent2::EventFlags::Read
22+
flags |= LibEvent2::EventFlags::Persist | LibEvent2::EventFlags::ET # we always do this as ZMQ is edge triggers
23+
event = event_base.new_event(sock.fd, flags, sock) do |_, sflags, data|
24+
sock_ref = data.as(ZMQ::Socket)
25+
zmq_events = sock_ref.events
26+
is_readable = zmq_events & ZMQ::POLLIN
27+
if is_readable && sflags.includes?(LibEvent2::EventFlags::Read)
28+
sock_ref.resume_read
29+
elsif sflags.includes?(LibEvent2::EventFlags::Timeout)
30+
sock_ref.resume_read(timed_out: true)
3131
end
32-
event
32+
end
33+
event
3334
end
34-
def self.stop_loop
35-
@@eb.loop_break
35+
36+
def stop_loop
37+
event_base.loop_break
3638
end
3739
end
3840

@@ -43,8 +45,8 @@ module ZMQ
4345
getter name : String
4446
getter? closed
4547

46-
@read_event = Crystal::ThreadLocalValue(Crystal::Event).new
47-
@write_event = Crystal::ThreadLocalValue(Crystal::Event).new
48+
@read_event = Crystal::ThreadLocalValue(Crystal::EventLoop::Event).new
49+
@write_event = Crystal::ThreadLocalValue(Crystal::EventLoop::Event).new
4850

4951
def self.create(context : Context, type : Int32, message_type = Message) : self
5052
new context, type, message_type
@@ -80,13 +82,13 @@ module ZMQ
8082

8183
# libevent support
8284
private def add_read_event(timeout = @read_timeout)
83-
event = @read_event.get { Crystal::EventLoop.create_fd_read_event(self,true) }
85+
event = @read_event.get { Thread.current.scheduler.@event_loop.create_fd_read_event(self, true) }
8486
event.add timeout
8587
nil
8688
end
8789

8890
private def add_write_event(timeout = @write_timeout)
89-
event = @write_event.get { Crystal::EventLoop.create_fd_write_event(self,true) }
91+
event = @write_event.get { Thread.current.scheduler.@event_loop.create_fd_write_event(self, true) }
9092
event.add timeout
9193
nil
9294
end
@@ -137,11 +139,11 @@ module ZMQ
137139
message = @message_type.new
138140
rc = LibZMQ.msg_recv(message.address, @socket, flags | ZMQ::DONTWAIT)
139141
if rc == -1
140-
if Util.errno == Errno::EAGAIN.to_i
141-
wait_readable
142-
else
143-
raise Util.error_string
144-
end
142+
if Util.errno == Errno::EAGAIN.to_i
143+
wait_readable
144+
else
145+
raise Util.error_string
146+
end
145147
else
146148
return message
147149
end
@@ -159,7 +161,7 @@ module ZMQ
159161
def receive_strings(flags = 0)
160162
receive_messages(flags).map do |msg|
161163
str = msg.to_s
162-
msg.close()
164+
msg.close
163165
str
164166
end
165167
end
@@ -182,16 +184,16 @@ module ZMQ
182184
message = @message_type.new
183185
rc = LibZMQ.msg_recv(message.address, @socket, flags)
184186
if Util.resultcode_ok?(rc)
185-
messages << message
186-
return messages unless more_parts?
187+
messages << message
188+
return messages unless more_parts?
187189
else
188190
message.close
189191
messages.map(&.close)
190192
return messages.clear
191193
end
192194
end
193195
else
194-
return messages
196+
return messages
195197
end
196198
end
197199
end
@@ -295,10 +297,12 @@ module ZMQ
295297
def finalize
296298
close
297299
end
300+
298301
# file descriptor
299302
def fd
300303
get_socket_option(ZMQ::FD).as(Int32)
301304
end
305+
302306
# event list
303307
def events
304308
get_socket_option(ZMQ::EVENTS).as(Int32)

0 commit comments

Comments
 (0)