diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/-test-/memory_status/extconf.rb | 8 | ||||
-rw-r--r-- | ext/-test-/memory_status/memory_status.c | 45 | ||||
-rw-r--r-- | test/lib/memory_status.rb | 9 |
4 files changed, 65 insertions, 2 deletions
@@ -1,3 +1,8 @@ +Sat Oct 8 10:34:25 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * ext/-test-/memory_status/memory_status.c: get memory sizes by + mach task_info system call. + Sat Oct 8 09:06:55 2016 Aurelien Jacobs <aurel@gnuage.org> * lib/logger.rb (Logger::Period#next_rotate_time): fix monthly log diff --git a/ext/-test-/memory_status/extconf.rb b/ext/-test-/memory_status/extconf.rb new file mode 100644 index 0000000000..8bfbfe6321 --- /dev/null +++ b/ext/-test-/memory_status/extconf.rb @@ -0,0 +1,8 @@ +case RUBY_PLATFORM +when /darwin/ + ok = true +end + +if ok + create_makefile("-test-/memory_status") +end diff --git a/ext/-test-/memory_status/memory_status.c b/ext/-test-/memory_status/memory_status.c new file mode 100644 index 0000000000..813a8349c4 --- /dev/null +++ b/ext/-test-/memory_status/memory_status.c @@ -0,0 +1,45 @@ +#include "ruby.h" +#ifdef __APPLE__ +# include <mach/mach.h> +# include <mach/message.h> +# include <mach/kern_return.h> +# include <mach/task_info.h> +#endif + +static VALUE cMemoryStatus; + +static VALUE +read_status(VALUE self) +{ + VALUE size = INT2FIX(0); +#if defined __APPLE__ + VALUE rss; + kern_return_t error; + mach_msg_type_number_t out_count; + mach_task_basic_info_data_t taskinfo; + + taskinfo.virtual_size = 0; + out_count = MACH_TASK_BASIC_INFO_COUNT; + error = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, + (task_info_t)&taskinfo, &out_count); + if (error != KERN_SUCCESS) return Qnil; + size = ULL2NUM(taskinfo.virtual_size); + rss = ULL2NUM(taskinfo.resident_size); + rb_struct_aset(self, INT2FIX(1), rss); +#endif + rb_struct_aset(self, INT2FIX(0), size); + return self; +} + +void +Init_memory_status(void) +{ + VALUE mMemory = rb_define_module("Memory"); + cMemoryStatus = + rb_struct_define_under(mMemory, "Status", "size", +#if defined __APPLE__ + "rss", +#endif + (char *)NULL); + rb_define_method(cMemoryStatus, "_update", read_status, 0); +} diff --git a/test/lib/memory_status.rb b/test/lib/memory_status.rb index 35530f2f4b..0f6d4db91b 100644 --- a/test/lib/memory_status.rb +++ b/test/lib/memory_status.rb @@ -1,4 +1,9 @@ # frozen_string_literal: false +begin + require '-test-/memory_status.so' +rescue LoadError +end + module Memory keys = [] @@ -81,7 +86,7 @@ module Memory if !keys.empty? Status = Struct.new(*keys) end -end +end unless defined?(Memory::Status) if defined?(Memory::Status) class Memory::Status @@ -89,7 +94,7 @@ if defined?(Memory::Status) Memory.read_status do |key, val| self[key] = val end - end + end unless method_defined?(:_update) Header = members.map {|k| k.to_s.upcase.rjust(6)}.join('') Format = "%6d" |