From 648870b5c577239b3274b0b48c82fb74910dfabf Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 31 Mar 2023 00:48:55 +1300 Subject: Support `IO#pread` / `IO#pwrite` using fiber scheduler. (#7594) * Skip test if non-blocking file IO is not supported. --- io_buffer.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'io_buffer.c') diff --git a/io_buffer.c b/io_buffer.c index 2fc7ac8a80..4a08811185 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -1001,17 +1001,23 @@ rb_io_buffer_lock(VALUE self) return self; } -VALUE -rb_io_buffer_unlock(VALUE self) +static void +io_buffer_unlock(struct rb_io_buffer *data) { - struct rb_io_buffer *data = NULL; - TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); - if (!(data->flags & RB_IO_BUFFER_LOCKED)) { rb_raise(rb_eIOBufferLockedError, "Buffer not locked!"); } data->flags &= ~RB_IO_BUFFER_LOCKED; +} + +VALUE +rb_io_buffer_unlock(VALUE self) +{ + struct rb_io_buffer *data = NULL; + TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); + + io_buffer_unlock(data); return self; } @@ -1123,6 +1129,17 @@ rb_io_buffer_free(VALUE self) return self; } +VALUE rb_io_buffer_free_locked(VALUE self) +{ + struct rb_io_buffer *data = NULL; + TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); + + io_buffer_unlock(data); + io_buffer_free(data); + + return self; +} + // Validate that access to the buffer is within bounds, assuming you want to // access length bytes from the specified offset. static inline void -- cgit v1.2.1