File tree Expand file tree Collapse file tree 8 files changed +31
-29
lines changed Expand file tree Collapse file tree 8 files changed +31
-29
lines changed Original file line number Diff line number Diff line change @@ -41,10 +41,12 @@ abstract class Crystal::EventLoop
41
41
# Blocks the current fiber until the file descriptor is ready for write.
42
42
abstract def wait_writable (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
43
43
44
- # Hook to react on the file descriptor after it has been reopened. For
45
- # example we might want to resume all pending operations to act on the new
46
- # file descriptor.
47
- abstract def reopened (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
44
+ # Resumes fibers waiting on the file descriptor.
45
+ #
46
+ # Optional. Only called on UNIX targets and only meant for poll event loops.
47
+ def resume_all (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
48
+ raise NotImplementedError .new(" #{ self .class.name} #resume_all(Crystal::System::FileDescriptor)" )
49
+ end
48
50
49
51
# Closes the file descriptor resource.
50
52
abstract def close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
Original file line number Diff line number Diff line change @@ -303,10 +303,6 @@ class Crystal::EventLoop::IOCP < Crystal::EventLoop
303
303
raise NotImplementedError .new(" Crystal::System::IOCP#wait_writable(FileDescriptor)" )
304
304
end
305
305
306
- def reopened (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
307
- raise NotImplementedError .new(" Crystal::System::IOCP#reopened(FileDescriptor)" )
308
- end
309
-
310
306
def close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
311
307
LibC .CancelIoEx (file_descriptor.windows_handle, nil ) unless file_descriptor.system_blocking?
312
308
file_descriptor.file_descriptor_close
Original file line number Diff line number Diff line change @@ -174,14 +174,11 @@ class Crystal::EventLoop::LibEvent < Crystal::EventLoop
174
174
end
175
175
end
176
176
177
- def reopened (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
177
+ def resume_all (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
178
178
file_descriptor.evented_close
179
179
end
180
180
181
181
def close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
182
- # perform cleanup before LibC.close. Using a file descriptor after it has
183
- # been closed is never defined and can always lead to undefined results
184
- file_descriptor.evented_close
185
182
file_descriptor.file_descriptor_close
186
183
end
187
184
@@ -299,10 +296,11 @@ class Crystal::EventLoop::LibEvent < Crystal::EventLoop
299
296
end
300
297
end
301
298
302
- def close (socket : ::Socket ) : Nil
303
- # perform cleanup before LibC.close. Using a file descriptor after it has
304
- # been closed is never defined and can always lead to undefined results
299
+ def resume_all (socket : ::Socket ) : Nil
305
300
socket.evented_close
301
+ end
302
+
303
+ def close (socket : ::Socket ) : Nil
306
304
socket.socket_close
307
305
end
308
306
Original file line number Diff line number Diff line change @@ -228,14 +228,11 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
228
228
end
229
229
end
230
230
231
- def reopened (file_descriptor : System ::FileDescriptor ) : Nil
232
- resume_all (file_descriptor)
231
+ def resume_all (file_descriptor : System ::FileDescriptor ) : Nil
232
+ resume_all_impl (file_descriptor)
233
233
end
234
234
235
235
def close (file_descriptor : System ::FileDescriptor ) : Nil
236
- # perform cleanup before LibC.close. Using a file descriptor after it has
237
- # been closed is never defined and can always lead to undefined results
238
- resume_all(file_descriptor)
239
236
file_descriptor.file_descriptor_close
240
237
end
241
238
@@ -363,10 +360,11 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
363
360
end
364
361
end
365
362
363
+ def resume_all (socket : ::Socket ) : Nil
364
+ resume_all_impl(socket)
365
+ end
366
+
366
367
def close (socket : ::Socket ) : Nil
367
- # perform cleanup before LibC.close. Using a file descriptor after it has
368
- # been closed is never defined and can always lead to undefined results
369
- resume_all(socket)
370
368
socket.socket_close
371
369
end
372
370
@@ -400,7 +398,7 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
400
398
end
401
399
end
402
400
403
- private def resume_all (io )
401
+ private def resume_all_impl (io )
404
402
return unless (index = io.__evloop_data).valid?
405
403
406
404
Polling .arena.free(index) do |pd |
Original file line number Diff line number Diff line change @@ -74,6 +74,13 @@ abstract class Crystal::EventLoop
74
74
# and the source address.
75
75
abstract def receive_from (socket : ::Socket , slice : Bytes ) : Tuple (Int32 , ::Socket ::Address )
76
76
77
+ # Resumes fibers waiting on the socket.
78
+ #
79
+ # Optional. Only called on UNIX targets and only meant for poll event loops.
80
+ def resume_all (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
81
+ raise NotImplementedError .new(" #{ self .class.name} #resume_all(Crystal::System::FileDescriptor)" )
82
+ end
83
+
77
84
# Closes the socket.
78
85
abstract def close (socket : ::Socket ) : Nil
79
86
end
Original file line number Diff line number Diff line change @@ -76,10 +76,6 @@ class Crystal::EventLoop::Wasi < Crystal::EventLoop
76
76
end
77
77
end
78
78
79
- def reopened (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
80
- raise NotImplementedError .new(" Crystal::EventLoop#reopened(FileDescriptor)" )
81
- end
82
-
83
79
def close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil
84
80
file_descriptor.evented_close
85
81
file_descriptor.file_descriptor_close
Original file line number Diff line number Diff line change @@ -126,10 +126,13 @@ module Crystal::System::FileDescriptor
126
126
# Mark the handle open, since we had to have dup'd a live handle.
127
127
@closed = false
128
128
129
- event_loop.reopened(self )
129
+ # resume all pending waiters so they can start waiting on the new fd
130
+ event_loop.resume_all(self )
130
131
end
131
132
132
133
private def system_close
134
+ # resume pending fibers before closing the fd
135
+ event_loop.resume_all(self )
133
136
event_loop.close(self )
134
137
end
135
138
Original file line number Diff line number Diff line change @@ -224,6 +224,8 @@ module Crystal::System::Socket
224
224
end
225
225
226
226
private def system_close
227
+ # resume pending fibers before closing the fd
228
+ event_loop.resume_all(self )
227
229
event_loop.close(self )
228
230
end
229
231
You can’t perform that action at this time.
0 commit comments