drb: close graceful shutdown pipe before socket

Closing a listen socket while entering select(2) may
trigger IOError or even deadlock because another thread
may give the file descriptor to another file description;
meaning the kernel can wait on the wrong description.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64532 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-25 02:32:15 +00:00
Родитель a48022489f
Коммит 7c31c2738c
2 изменённых файлов: 2 добавлений и 0 удалений

Просмотреть файл

@ -953,6 +953,7 @@ module DRb
# returned by #open or by #accept, then it closes this particular # returned by #open or by #accept, then it closes this particular
# client-server session. # client-server session.
def close def close
shutdown
if @socket if @socket
@socket.close @socket.close
@socket = nil @socket = nil

Просмотреть файл

@ -95,6 +95,7 @@ module DRb
public public
def close def close
return unless @socket return unless @socket
shutdown # DRbProtocol#shutdown
path = @socket.path if @server_mode path = @socket.path if @server_mode
@socket.close @socket.close
File.unlink(path) if @server_mode File.unlink(path) if @server_mode