From: "hsbt (Hiroshi SHIBATA)" Date: 2021-08-31T11:45:48+00:00 Subject: [ruby-core:105096] [Ruby master Bug#17394] TCPServer is not thread safe on win32 Issue #17394 has been updated by hsbt (Hiroshi SHIBATA). Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN to 2.6: REQUIRED, 2.7: REQUIRED, 3.0: REQUIRED * https://github.com/ruby/ruby/pull/4218 * https://github.com/ruby/ruby/pull/4219 ---------------------------------------- Bug #17394: TCPServer is not thread safe on win32 https://bugs.ruby-lang.org/issues/17394#change-93506 * Author: puchuu (Andrew Aladjev) * Status: Closed * Priority: Normal * ruby -v: 2.7.1 * Backport: 2.6: REQUIRED, 2.7: REQUIRED, 3.0: REQUIRED ---------------------------------------- Hello, it looks like win32 version of TCPServer is not thread safe. I've extracted the following code from project: ``` ruby require "socket" require "parallel" ::Parallel.each(1..2, :in_threads => 2) do ::TCPServer.open 0 do |server| thread = ::Thread.new { server.accept.close } ::TCPSocket.open "localhost", server.addr[1] thread.join end end ``` It returns: ``` in `accept': Bad file descriptor - not a socket file descriptor (Errno::EBADF) ``` You can fix this code by using `:in_threads => 1`. This is unique windows issue: GNU/Linux, FreeBSD and OSX works perfect. I think something is wrong in `win32` folder of ruby source code. Can you please assign this issue to the developer familiar with `win32` folder? Thank you. ---Files-------------------------------- Screenshot_20201215_020316.png (11.4 KB) 4220.patch (7.68 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: