File tree Expand file tree Collapse file tree 10 files changed +58
-8
lines changed Expand file tree Collapse file tree 10 files changed +58
-8
lines changed Original file line number Diff line number Diff line change @@ -46,7 +46,15 @@ abstract class Crystal::EventLoop
4646    #  file descriptor.
4747    abstract  def  reopened (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
4848
49-     #  Closes the file descriptor resource.
49+     #  Internal shutdown of the file descriptor. Called after the
50+     #  IO::FileDescriptor has been marked closed but before calling `#close` to
51+     #  actually close the system fd or handle.
52+     # 
53+     #  Implementations shall resume all pending waiters and let them fail because
54+     #  the IO has been closed.
55+     abstract  def  shutdown (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
56+ 
57+     #  Closes the system fd or handle.
5058    abstract  def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
5159  end 
5260
Original file line number Diff line number Diff line change @@ -307,6 +307,9 @@ class Crystal::EventLoop::IOCP < Crystal::EventLoop
307307    raise  NotImplementedError .new(" Crystal::System::IOCP#reopened(FileDescriptor)"  )
308308  end 
309309
310+   def  shutdown (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
311+   end 
312+ 
310313  def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
311314    LibC .CancelIoEx (file_descriptor.windows_handle, nil ) unless  file_descriptor.system_blocking?
312315    file_descriptor.file_descriptor_close
@@ -445,6 +448,9 @@ class Crystal::EventLoop::IOCP < Crystal::EventLoop
445448    end 
446449  end 
447450
451+   def  shutdown (socket : ::Socket ) : Nil 
452+   end 
453+ 
448454  def  close (socket : ::Socket ) : Nil 
449455    raise  NotImplementedError .new(" Crystal::System::IOCP#close(Socket)"  )
450456  end 
Original file line number Diff line number Diff line change @@ -178,10 +178,13 @@ class Crystal::EventLoop::LibEvent < Crystal::EventLoop
178178    file_descriptor.evented_close
179179  end 
180180
181-   def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
181+   def  shutdown (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
182182    #  perform cleanup before LibC.close. Using a file descriptor after it has
183183    #  been closed is never defined and can always lead to undefined results
184184    file_descriptor.evented_close
185+   end 
186+ 
187+   def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
185188    file_descriptor.file_descriptor_close
186189  end 
187190
@@ -299,10 +302,13 @@ class Crystal::EventLoop::LibEvent < Crystal::EventLoop
299302    end 
300303  end 
301304
302-   def  close (socket : ::Socket ) : Nil 
305+   def  shutdown (socket : ::Socket ) : Nil 
303306    #  perform cleanup before LibC.close. Using a file descriptor after it has
304307    #  been closed is never defined and can always lead to undefined results
305308    socket.evented_close
309+   end 
310+ 
311+   def  close (socket : ::Socket ) : Nil 
306312    socket.socket_close
307313  end 
308314
Original file line number Diff line number Diff line change @@ -232,10 +232,13 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
232232    resume_all(file_descriptor)
233233  end 
234234
235-   def  close (file_descriptor : System ::FileDescriptor ) : Nil 
235+   def  shutdown (file_descriptor : System ::FileDescriptor ) : Nil 
236236    #  perform cleanup before LibC.close. Using a file descriptor after it has
237237    #  been closed is never defined and can always lead to undefined results
238238    resume_all(file_descriptor)
239+   end 
240+ 
241+   def  close (file_descriptor : System ::FileDescriptor ) : Nil 
239242    file_descriptor.file_descriptor_close
240243  end 
241244
@@ -363,10 +366,13 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
363366    end 
364367  end 
365368
366-   def  close (socket : ::Socket ) : Nil 
369+   def  shutdown (socket : ::Socket ) : Nil 
367370    #  perform cleanup before LibC.close. Using a file descriptor after it has
368371    #  been closed is never defined and can always lead to undefined results
369372    resume_all(socket)
373+   end 
374+ 
375+   def  close (socket : ::Socket ) : Nil 
370376    socket.socket_close
371377  end 
372378
Original file line number Diff line number Diff line change @@ -74,7 +74,15 @@ abstract class Crystal::EventLoop
7474    #  and the source address.
7575    abstract  def  receive_from (socket : ::Socket , slice : Bytes ) : Tuple (Int32 , ::Socket ::Address )
7676
77-     #  Closes the socket.
77+     #  Internal shutdown of the socket. Called after the Socket has been marked
78+     #  closed but before calling `#close` to actually close the system socket fd
79+     #  or handle.
80+     # 
81+     #  Implementations shall resume all pending waiters and let them fail because
82+     #  the IO has been closed. They don't have to call the `shutdown` syscall.
83+     abstract  def  shutdown (socket : ::Socket ) : Nil 
84+ 
85+     #  Closes the system socket fd or handle.
7886    abstract  def  close (socket : ::Socket ) : Nil 
7987  end 
8088
Original file line number Diff line number Diff line change @@ -80,8 +80,14 @@ class Crystal::EventLoop::Wasi < Crystal::EventLoop
8080    raise  NotImplementedError .new(" Crystal::EventLoop#reopened(FileDescriptor)"  )
8181  end 
8282
83-   def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
83+   def  shutdown (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
8484    file_descriptor.evented_close
85+   end 
86+ 
87+   def  shutdown (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
88+   end 
89+ 
90+   def  close (file_descriptor : Crystal ::System ::FileDescriptor ) : Nil 
8591    file_descriptor.file_descriptor_close
8692  end 
8793
@@ -133,8 +139,14 @@ class Crystal::EventLoop::Wasi < Crystal::EventLoop
133139    raise  NotImplementedError .new " Crystal::Wasi::EventLoop#accept" 
134140  end 
135141
136-   def  close (socket : ::Socket ) : Nil 
142+   def  shutdown (socket : ::Socket ) : Nil 
137143    socket.evented_close
144+   end 
145+ 
146+   def  shutdown (socket : ::Socket ) : Nil 
147+   end 
148+ 
149+   def  close (socket : ::Socket ) : Nil 
138150    socket.socket_close
139151  end 
140152
Original file line number Diff line number Diff line change @@ -134,6 +134,7 @@ module Crystal::System::FileDescriptor
134134  end 
135135
136136  private  def  system_close 
137+     event_loop.shutdown(self )
137138    event_loop.close(self )
138139  end 
139140
Original file line number Diff line number Diff line change @@ -224,6 +224,7 @@ module Crystal::System::Socket
224224  end 
225225
226226  private  def  system_close 
227+     event_loop.shutdown(self )
227228    event_loop.close(self )
228229  end 
229230
Original file line number Diff line number Diff line change @@ -152,6 +152,7 @@ module Crystal::System::Socket
152152  end 
153153
154154  private  def  system_close 
155+     event_loop.shutdown(self )
155156    event_loop.close(self )
156157  end 
157158
Original file line number Diff line number Diff line change @@ -216,6 +216,7 @@ module Crystal::System::FileDescriptor
216216  end 
217217
218218  private  def  system_close 
219+     event_loop.shutdown(self )
219220    event_loop.close(self )
220221  end 
221222
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments