From 03784255182de6e9fe16ddc04714f56ad13e2c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Wed, 22 May 2024 14:09:44 +0200 Subject: [PATCH] Refactor win32 `System::FileDescriptor#unbuffered_write` --- src/crystal/system/win32/file_descriptor.cr | 25 ++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/crystal/system/win32/file_descriptor.cr b/src/crystal/system/win32/file_descriptor.cr index b9417a82bf43..2f49004e621c 100644 --- a/src/crystal/system/win32/file_descriptor.cr +++ b/src/crystal/system/win32/file_descriptor.cr @@ -52,16 +52,7 @@ module Crystal::System::FileDescriptor handle = windows_handle until slice.empty? if system_blocking? - if LibC.WriteFile(handle, slice, slice.size, out bytes_written, nil) == 0 - case error = WinError.value - when .error_access_denied? - raise IO::Error.new "File not open for writing", target: self - when .error_broken_pipe? - return 0_u32 - else - raise IO::Error.from_os_error("Error writing file", error, target: self) - end - end + blocking_write(handle, slice) else bytes_written = overlapped_operation(handle, "WriteFile", write_timeout, writing: true) do |overlapped| ret = LibC.WriteFile(handle, slice, slice.size, out byte_count, overlapped) @@ -73,6 +64,20 @@ module Crystal::System::FileDescriptor end end + private def blocking_write(handle, slice) + ret = LibC.WriteFile(handle, slice, slice.size, out bytes_written, nil) + if ret.zero? + case error = WinError.value + when .error_access_denied? + raise IO::Error.new "File not open for writing", target: self + when .error_broken_pipe? + return 0_u32 + else + raise IO::Error.from_os_error("Error writing file", error, target: self) + end + end + end + private def system_blocking? @system_blocking end