diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c718fac9..a9680530 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -35,6 +35,9 @@ jobs: - os: ubuntu ruby: head experimental: true + - os: windows + ruby: head + experimental: true steps: - uses: actions/checkout@v3 diff --git a/lib/async/scheduler.rb b/lib/async/scheduler.rb index 21915994..22d83bbc 100644 --- a/lib/async/scheduler.rb +++ b/lib/async/scheduler.rb @@ -23,6 +23,10 @@ def self.supported? true end + def self.windows? + ::RUBY_PLATFORM =~ /mswin|mingw|cygwin/ + end + def initialize(parent = nil, selector: nil) super(parent) @@ -167,12 +171,26 @@ def io_wait(io, events, timeout = nil) end if ::IO::Event::Support.buffer? - def io_read(io, buffer, length, offset = 0) - @selector.io_read(Fiber.current, io, buffer, length, offset) - end - - def io_write(io, buffer, length, offset = 0) - @selector.io_write(Fiber.current, io, buffer, length, offset) + if Scheduler.windows? + def io_read(io, buffer, length, offset = 0) + Thread.new do + buffer.read(io, length, offset) + end.value + end + + def io_write(io, buffer, length, offset = 0) + Thread.new do + buffer.write(io, length, offset) + end.value + end + else + def io_read(io, buffer, length, offset = 0) + @selector.io_read(Fiber.current, io, buffer, length, offset) + end + + def io_write(io, buffer, length, offset = 0) + @selector.io_write(Fiber.current, io, buffer, length, offset) + end end end