* vm_trace.c, vm_core.h: simplify tracing mechanism.

(1) add rb_hook_list_t data structure which includes
  hooks, events (flag) and `need_clean' flag.
  If the last flag is true, then clean the hooks list.
  In other words, deleted hooks are contained by `hooks'.
  Cleanup process should run before traversing the list.
  (2) Change check mechanism
  See EXEC_EVENT_HOOK() in vm_core.h.
  (3) Add `raw' hooks APIs
  Normal hooks are guarded from exception by rb_protect().
  However, this protection is overhead for too simple
  functions which never cause exceptions.  `raw' hooks
  are executed without protection and faster.
  Now, we only provide registration APIs.  All `raw'
  hooks are kicked under protection (same as normal hooks).
* include/ruby/ruby.h: remove internal data definition and
  macros.
* internal.h (ruby_suppress_tracing), vm_trace.c: rename
  ruby_suppress_tracing() to rb_suppress_tracing()
  and remove unused function parameter.
* parse.y: fix to use renamed rb_suppress_tracing().
* thread.c (thread_create_core): no need to set RUBY_VM_VM.
* vm.c (mark_event_hooks): move definition to vm_trace.c.
* vm.c (ruby_vm_event_flags): add a global variable.
  This global variable represents all of Threads and VM's
  event masks (T1#events | T2#events | ... | VM#events).
  You can check the possibility kick trace func or not
  with ruby_vm_event_flags.
  ruby_vm_event_flags is maintained by vm_trace.c.
* cont.c (fiber_switch, rb_cont_call): restore tracing status.
  [Feature #4347]
* test/ruby/test_continuation.rb: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36715 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2012-08-16 11:41:24 +00:00
parent 9528358120
commit 4a4a702e61
10 changed files with 346 additions and 340 deletions

View file

@ -82,8 +82,12 @@ class TestContinuation < Test::Unit::TestCase
cont = nil
func = lambda do |*args|
if orig_thread == Thread.current
@memo += 1
cont.call(nil)
if cont
@memo += 1
c = cont
cont = nil
c.call(nil)
end
end
end
cont = callcc { |cc| cc }
@ -105,14 +109,18 @@ class TestContinuation < Test::Unit::TestCase
def tracing_with_thread_set_trace_func
cont = nil
func = lambda do |*args|
@memo += 1
cont.call(nil)
if cont
@memo += 1
c = cont
cont = nil
c.call(nil)
end
end
cont = callcc { |cc| cc }
if cont
Thread.current.set_trace_func(func)
else
Thread.current.set_trace_func(nil)
set_trace_func(nil)
end
end