diff --git a/src/websocketd.cr b/src/websocketd.cr index 1c4a751..823eefa 100644 --- a/src/websocketd.cr +++ b/src/websocketd.cr @@ -83,28 +83,24 @@ class InstanceStorage def remove_fd (fdclient : Int32) Baguette::Log.info "closing the client:#{CRESET} #{fdclient}" # 1. closing both the client and the service - fdservice = @switchtable[fdclient]? - if fdservice.nil? - Baguette::Log.error "client #{fdclient} already removed!" - return - end begin tcpfdc = @fd_to_tcpsocket[fdclient] # 2. closing the TCP connections tcpfdc.close unless tcpfdc.closed? rescue e - Baguette::Log.error "1" + Baguette::Log.error "remove_fd: 1 #{e}" end # 3. removing the client and the service fds from the loop check begin @service.remove_fd (fdclient) rescue e - Baguette::Log.error "2" + Baguette::Log.error "remove_fd: 2 #{e}" end # 5. removing both the client and the service from the switchtable + fdservice = @switchtable[fdclient]? @switchtable = @switchtable.select do |fdc, fds| fdc != fdclient && fds != fdclient end @@ -118,18 +114,23 @@ class InstanceStorage end begin - unless fdservice.nil? + if fdservice.nil? + Baguette::Log.debug "client #{fdclient} aleady has its service removed" + else service = @fd_to_ipcclient[fdservice] - service.close @service.remove_fd (fdservice) @fd_to_ipcclient = @fd_to_ipcclient.select do |k, v| k != fdservice end @is_client = @is_client.select do |fd,v| fd != fdservice end + + # perform the close at the end + # on crash, this service still is removed from the list of listened fd + service.close end rescue e - Baguette::Log.error "3" + Baguette::Log.error "remove_fd: 3 #{e}" end rescue e Baguette::Log.error "in InstanceStorage#remove_fd: #{e}"