summaryrefslogtreecommitdiff
path: root/io_buffer.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-19 09:56:52 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-19 12:25:38 +1300
commitf3e30b26c509c6dd707bc07c4a73fbac2576e9e2 (patch)
tree57b05a331d3196f2ce7072632bd789526aa633af /io_buffer.c
parent6bef1ac62850be6d83a069ac3d3be0b8e2f3afcf (diff)
Default size for IO::Buffer.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5300
Diffstat (limited to 'io_buffer.c')
-rw-r--r--io_buffer.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/io_buffer.c b/io_buffer.c
index 67806ff5cf..bb296f48ec 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -15,6 +15,7 @@
VALUE rb_cIOBuffer;
size_t RUBY_IO_BUFFER_PAGE_SIZE;
+size_t RUBY_IO_BUFFER_DEFAULT_SIZE;
#ifdef _WIN32
#else
@@ -347,14 +348,20 @@ io_buffer_map(int argc, VALUE *argv, VALUE klass)
VALUE
rb_io_buffer_initialize(int argc, VALUE *argv, VALUE self)
{
- if (argc < 1 || argc > 2) {
- rb_error_arity(argc, 1, 2);
+ if (argc < 0 || argc > 2) {
+ rb_error_arity(argc, 0, 2);
}
struct rb_io_buffer *data = NULL;
TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data);
- size_t size = RB_NUM2SIZE(argv[0]);
+ size_t size;
+
+ if (argc > 0) {
+ size = RB_NUM2SIZE(argv[0]);
+ } else {
+ size = RUBY_IO_BUFFER_DEFAULT_SIZE;
+ }
enum rb_io_buffer_flags flags = 0;
if (argc >= 2) {
@@ -1068,6 +1075,30 @@ io_buffer_clear(int argc, VALUE *argv, VALUE self)
return self;
}
+static
+size_t io_buffer_default_size(size_t page_size) {
+ // Platform agnostic default size, based on emperical performance observation:
+ const size_t platform_agnostic_default_size = 64*1024;
+
+ // Allow user to specify custom default buffer size:
+ const char *default_size = getenv("RUBY_IO_BUFFER_DEFAULT_SIZE");
+ if (default_size) {
+ // For the purpose of setting a default size, 2^31 is an acceptable maximum:
+ int value = atoi(default_size);
+
+ // assuming sizeof(int) <= sizeof(size_t)
+ if (value > 0) {
+ return value;
+ }
+ }
+
+ if (platform_agnostic_default_size < page_size) {
+ return page_size;
+ }
+
+ return platform_agnostic_default_size;
+}
+
void
Init_IO_Buffer(void)
{
@@ -1084,8 +1115,11 @@ Init_IO_Buffer(void)
RUBY_IO_BUFFER_PAGE_SIZE = sysconf(_SC_PAGESIZE);
#endif
- // Efficient sicing of mapped buffers:
+ RUBY_IO_BUFFER_DEFAULT_SIZE = io_buffer_default_size(RUBY_IO_BUFFER_PAGE_SIZE);
+
+ // Efficient sizing of mapped buffers:
rb_define_const(rb_cIOBuffer, "PAGE_SIZE", SIZET2NUM(RUBY_IO_BUFFER_PAGE_SIZE));
+ rb_define_const(rb_cIOBuffer, "DEFAULT_SIZE", SIZET2NUM(RUBY_IO_BUFFER_DEFAULT_SIZE));
rb_define_singleton_method(rb_cIOBuffer, "map", io_buffer_map, -1);