From c86bcd434da573982ab52522a301ba5499dc13ed Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Mon, 20 Dec 2021 12:37:05 +1300 Subject: Mark non-private mapped files as external. --- io_buffer.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'io_buffer.c') diff --git a/io_buffer.c b/io_buffer.c index 63f5bd2c24..d87575bfdd 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -83,6 +83,9 @@ io_buffer_map_file(struct rb_io_buffer *data, int descriptor, size_t size, off_t if (flags & RB_IO_BUFFER_PRIVATE) { access |= FILE_MAP_COPY; data->flags |= RB_IO_BUFFER_PRIVATE; + } else { + // This buffer refers to external data. + data->flags |= RB_IO_BUFFER_EXTERNAL; } void *base = MapViewOfFile(mapping, access, (DWORD)(offset >> 32), (DWORD)(offset & 0xFFFFFFFF), size); @@ -107,6 +110,8 @@ io_buffer_map_file(struct rb_io_buffer *data, int descriptor, size_t size, off_t data->flags |= RB_IO_BUFFER_PRIVATE; } else { + // This buffer refers to external data. + data->flags |= RB_IO_BUFFER_EXTERNAL; access |= MAP_SHARED; } @@ -572,7 +577,7 @@ rb_io_buffer_external_p(VALUE self) struct rb_io_buffer *data = NULL; TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); - return data->flags & (RB_IO_BUFFER_INTERNAL | RB_IO_BUFFER_MAPPED) ? Qfalse : Qtrue; + return data->flags & RB_IO_BUFFER_EXTERNAL ? Qtrue : Qfalse; } static VALUE @@ -611,12 +616,6 @@ rb_io_buffer_immutable_p(VALUE self) return data->flags & RB_IO_BUFFER_IMMUTABLE ? Qtrue : Qfalse; } -static int -io_buffer_external_p(enum rb_io_buffer_flags flags) -{ - return !(flags & (RB_IO_BUFFER_INTERNAL | RB_IO_BUFFER_MAPPED)); -} - VALUE rb_io_buffer_lock(VALUE self) { @@ -858,7 +857,7 @@ rb_io_buffer_resize(VALUE self, size_t size) return; } - if (io_buffer_external_p(data->flags)) { + if (data->flags & RB_IO_BUFFER_EXTERNAL) { rb_raise(rb_eIOBufferMutationError, "Cannot resize external buffer!"); } -- cgit v1.2.1