From b0b09327293b2996f86990be354f3a63e255e77e Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 4 Apr 2016 14:37:07 +0000 Subject: at_exit list * vm_core.h (rb_vm_struct): make at_exit a single linked list but not RArray, not to mark the registered functions by the write barrier. based on the patches by Evan Phoenix. [ruby-core:73908] [Bug #12095] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54484 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/-test-/vm/at_exit.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ ext/-test-/vm/extconf.rb | 1 + 2 files changed, 45 insertions(+) create mode 100644 ext/-test-/vm/at_exit.c create mode 100644 ext/-test-/vm/extconf.rb (limited to 'ext/-test-') diff --git a/ext/-test-/vm/at_exit.c b/ext/-test-/vm/at_exit.c new file mode 100644 index 0000000000..6cfbfafa9e --- /dev/null +++ b/ext/-test-/vm/at_exit.c @@ -0,0 +1,44 @@ +#include +#include + +static void +do_nothing(ruby_vm_t *vm) +{ +} + +static void +print_begin(ruby_vm_t *vm) +{ + printf("begin\n"); +} + +static void +print_end(ruby_vm_t *vm) +{ + printf("end\n"); +} + +static VALUE +register_at_exit(VALUE self, VALUE t) +{ + switch (t) { + case Qtrue: + ruby_vm_at_exit(print_begin); + break; + case Qfalse: + ruby_vm_at_exit(print_end); + break; + default: + ruby_vm_at_exit(do_nothing); + break; + } + return self; +} + +void +Init_at_exit(void) +{ + VALUE m = rb_define_module("Bug"); + VALUE c = rb_define_class_under(m, "VM", rb_cObject); + rb_define_singleton_method(c, "register_at_exit", register_at_exit, 1); +} diff --git a/ext/-test-/vm/extconf.rb b/ext/-test-/vm/extconf.rb new file mode 100644 index 0000000000..614ec960d8 --- /dev/null +++ b/ext/-test-/vm/extconf.rb @@ -0,0 +1 @@ +create_makefile('-test-/vm/at_exit') -- cgit v1.2.3