Skip to content

Commit d1d6d72

Browse files
committed
Add Crystal::EventLoop#delete to clean up on finalize
1 parent e674803 commit d1d6d72

File tree

7 files changed

+36
-8
lines changed

7 files changed

+36
-8
lines changed

src/crystal/system/event_loop/file_descriptor.cr

+8
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,13 @@ abstract class Crystal::EventLoop
1919

2020
# Closes the file descriptor resource.
2121
abstract def close(file_descriptor : Crystal::System::FileDescriptor) : Nil
22+
23+
# Removes the file descriptor from the event loop. Can be used to free up
24+
# memory resources associated with the file descriptor, as well as removing
25+
# the file descriptor from kernel data structures.
26+
#
27+
# Called by `::IO::FileDescriptor#finalize` before closing the file
28+
# descriptor. Errors shall be silently ignored.
29+
abstract def delete(file_descriptor : Crystal::System::FileDescriptor) : Nil
2230
end
2331
end

src/crystal/system/event_loop/socket.cr

+8
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,13 @@ abstract class Crystal::EventLoop
6262

6363
# Closes the socket.
6464
abstract def close(socket : ::Socket) : Nil
65+
66+
# Removes the socket from the event loop. Can be used to free up memory
67+
# resources associated with the socket, as well as removing the socket from
68+
# kernel data structures.
69+
#
70+
# Called by `::Socket#finalize` before closing the socket. Errors shall be
71+
# silently ignored.
72+
abstract def delete(socket : ::Socket) : Nil
6573
end
6674
end

src/crystal/system/unix/event_loop_libevent.cr

+6
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ class Crystal::LibEvent::EventLoop < Crystal::EventLoop
9494
file_descriptor.evented_close
9595
end
9696

97+
def delete(file_descriptor : Crystal::System::FileDescriptor) : Nil
98+
end
99+
97100
def read(socket : ::Socket, slice : Bytes) : Int32
98101
evented_read(socket, "Error reading socket") do
99102
LibC.recv(socket.fd, slice, slice.size, 0).to_i32
@@ -187,6 +190,9 @@ class Crystal::LibEvent::EventLoop < Crystal::EventLoop
187190
socket.evented_close
188191
end
189192

193+
def delete(socket : ::Socket) : Nil
194+
end
195+
190196
def evented_read(target, errno_msg : String, &) : Int32
191197
loop do
192198
bytes_read = yield

src/crystal/system/wasi/event_loop.cr

+6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ class Crystal::Wasi::EventLoop < Crystal::EventLoop
5353
file_descriptor.evented_close
5454
end
5555

56+
def delete(file_descriptor : Crystal::System::FileDescriptor) : Nil
57+
end
58+
5659
def read(socket : ::Socket, slice : Bytes) : Int32
5760
evented_read(socket, "Error reading socket") do
5861
LibC.recv(socket.fd, slice, slice.size, 0).to_i32
@@ -85,6 +88,9 @@ class Crystal::Wasi::EventLoop < Crystal::EventLoop
8588
socket.evented_close
8689
end
8790

91+
def delete(socket : ::Socket) : Nil
92+
end
93+
8894
def evented_read(target, errno_msg : String, &) : Int32
8995
loop do
9096
bytes_read = yield

src/crystal/system/win32/event_loop_iocp.cr

+6
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ class Crystal::IOCP::EventLoop < Crystal::EventLoop
164164
LibC.CancelIoEx(file_descriptor.windows_handle, nil) unless file_descriptor.system_blocking?
165165
end
166166

167+
def delete(file_descriptor : Crystal::System::FileDescriptor) : Nil
168+
end
169+
167170
private def wsa_buffer(bytes)
168171
wsabuf = LibC::WSABUF.new
169172
wsabuf.len = bytes.size
@@ -274,6 +277,9 @@ class Crystal::IOCP::EventLoop < Crystal::EventLoop
274277

275278
def close(socket : ::Socket) : Nil
276279
end
280+
281+
def delete(socket : ::Socket) : Nil
282+
end
277283
end
278284

279285
class Crystal::IOCP::Event

src/io/file_descriptor.cr

+1-4
Original file line numberDiff line numberDiff line change
@@ -247,10 +247,7 @@ class IO::FileDescriptor < IO
247247
def finalize
248248
return if closed? || !close_on_finalize?
249249

250-
if event_loop.responds_to?(:delete)
251-
event_loop.delete(self)
252-
end
253-
250+
event_loop.delete(self)
254251
file_descriptor_close { } # ignore error
255252
end
256253

src/socket.cr

+1-4
Original file line numberDiff line numberDiff line change
@@ -430,10 +430,7 @@ class Socket < IO
430430
def finalize
431431
return if closed?
432432

433-
if event_loop.responds_to?(:delete)
434-
event_loop.delete(self)
435-
end
436-
433+
event_loop.delete(self)
437434
socket_close { } # ignore error
438435
end
439436

0 commit comments

Comments
 (0)