Skip to content

Commit c86bcd4

Browse files
committed
Mark non-private mapped files as external.
1 parent da46b8d commit c86bcd4

File tree

3 files changed

+23
-20
lines changed

3 files changed

+23
-20
lines changed

include/ruby/io/buffer.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,24 @@ RUBY_EXTERN size_t RUBY_IO_BUFFER_DEFAULT_SIZE;
2727

2828
enum rb_io_buffer_flags {
2929
// The memory in the buffer is owned by someone else.
30-
RB_IO_BUFFER_EXTERNAL = 0,
30+
// More specifically, it means that someone else owns the buffer and we shouldn't try to resize it.
31+
RB_IO_BUFFER_EXTERNAL = 1,
3132
// The memory in the buffer is allocated internally.
32-
RB_IO_BUFFER_INTERNAL = 1,
33+
RB_IO_BUFFER_INTERNAL = 2,
3334
// The memory in the buffer is mapped.
34-
RB_IO_BUFFER_MAPPED = 2,
35+
// A non-private mapping is marked as external.
36+
RB_IO_BUFFER_MAPPED = 4,
3537

3638
// The buffer is locked and cannot be resized.
37-
RB_IO_BUFFER_LOCKED = 16,
39+
// More specifically, it means we can't change the base address or size.
40+
// A buffer is typically locked before a system call that uses the data.
41+
RB_IO_BUFFER_LOCKED = 32,
3842

3943
// The buffer mapping is private and will not impact other processes or the underlying file.
40-
RB_IO_BUFFER_PRIVATE = 32,
44+
RB_IO_BUFFER_PRIVATE = 64,
4145

4246
// The buffer is read-only and cannot be modified.
43-
RB_IO_BUFFER_IMMUTABLE = 64
47+
RB_IO_BUFFER_IMMUTABLE = 128
4448
};
4549

4650
enum rb_io_buffer_endian {

io_buffer.c

+7-8
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ io_buffer_map_file(struct rb_io_buffer *data, int descriptor, size_t size, off_t
8383
if (flags & RB_IO_BUFFER_PRIVATE) {
8484
access |= FILE_MAP_COPY;
8585
data->flags |= RB_IO_BUFFER_PRIVATE;
86+
} else {
87+
// This buffer refers to external data.
88+
data->flags |= RB_IO_BUFFER_EXTERNAL;
8689
}
8790

8891
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
107110
data->flags |= RB_IO_BUFFER_PRIVATE;
108111
}
109112
else {
113+
// This buffer refers to external data.
114+
data->flags |= RB_IO_BUFFER_EXTERNAL;
110115
access |= MAP_SHARED;
111116
}
112117

@@ -572,7 +577,7 @@ rb_io_buffer_external_p(VALUE self)
572577
struct rb_io_buffer *data = NULL;
573578
TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data);
574579

575-
return data->flags & (RB_IO_BUFFER_INTERNAL | RB_IO_BUFFER_MAPPED) ? Qfalse : Qtrue;
580+
return data->flags & RB_IO_BUFFER_EXTERNAL ? Qtrue : Qfalse;
576581
}
577582

578583
static VALUE
@@ -611,12 +616,6 @@ rb_io_buffer_immutable_p(VALUE self)
611616
return data->flags & RB_IO_BUFFER_IMMUTABLE ? Qtrue : Qfalse;
612617
}
613618

614-
static int
615-
io_buffer_external_p(enum rb_io_buffer_flags flags)
616-
{
617-
return !(flags & (RB_IO_BUFFER_INTERNAL | RB_IO_BUFFER_MAPPED));
618-
}
619-
620619
VALUE
621620
rb_io_buffer_lock(VALUE self)
622621
{
@@ -858,7 +857,7 @@ rb_io_buffer_resize(VALUE self, size_t size)
858857
return;
859858
}
860859

861-
if (io_buffer_external_p(data->flags)) {
860+
if (data->flags & RB_IO_BUFFER_EXTERNAL) {
862861
rb_raise(rb_eIOBufferMutationError, "Cannot resize external buffer!");
863862
}
864863

test/ruby/test_io_buffer.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def assert_positive(value)
1818
end
1919

2020
def test_flags
21-
assert_equal 0, IO::Buffer::EXTERNAL
22-
assert_equal 1, IO::Buffer::INTERNAL
23-
assert_equal 2, IO::Buffer::MAPPED
21+
assert_equal 1, IO::Buffer::EXTERNAL
22+
assert_equal 2, IO::Buffer::INTERNAL
23+
assert_equal 4, IO::Buffer::MAPPED
2424

25-
assert_equal 16, IO::Buffer::LOCKED
26-
assert_equal 32, IO::Buffer::PRIVATE
25+
assert_equal 32, IO::Buffer::LOCKED
26+
assert_equal 64, IO::Buffer::PRIVATE
2727

28-
assert_equal 64, IO::Buffer::IMMUTABLE
28+
assert_equal 128, IO::Buffer::IMMUTABLE
2929
end
3030

3131
def test_endian

0 commit comments

Comments
 (0)