summaryrefslogtreecommitdiff
path: root/io_buffer.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-20 12:37:05 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-21 12:25:42 +1300
commitc86bcd434da573982ab52522a301ba5499dc13ed (patch)
tree0cce48291f77a8c7325128dfced1198addc198fe /io_buffer.c
parentda46b8d8e5d09f896fb1af5dabea12820f02b3d6 (diff)
Mark non-private mapped files as external.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5303
Diffstat (limited to 'io_buffer.c')
-rw-r--r--io_buffer.c15
1 files changed, 7 insertions, 8 deletions
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!");
}