>>>>> "E" == Emil Ong <onge / mcs.anl.gov> writes:
E> How do you pass a function as a block to create a new thread in C?
rb_thread_create(VALUE (*fn)(), void *arg);
E> Are C functions considered atomic?
When your C function run, the ruby scheduler don't run (except if you make
explicit call to it or you call some ruby functions which can possiblycall
the scheduler).
You must call CHECK_INTS if you don't want to block ruby
E> Will passing in a C function have any effect?
Stopping all other threads.
E> And a more general Ruby thread question: How often can I expect Ruby to
E> switch threads?
Difficult to reply : ruby install a timer (on VTALRM)
pigeon% ruby -e 'trap("VTALRM") {}'
-e:1:in `trap': SIGVTALRM reserved for Thread; cannot set handler (ArgumentError)
from -e:1
pigeon%
Each time the timer expire and if ruby is not in critical phase
(rb_thread_critical) , the thread is immediately re-scheduled if
rb_trap_immediate is set, otherwise ruby set the global variable
rb_thread_pending.
When CHECK_INTS is called, if ruby can be interrupted (see DEFER_INTS,
ALLOW_INTS, ENABLE_INTS in rubysig.h)
* it first check if some interrupt are pending (rb_trap_pending)
* then it check if it must try to re-schedule the thread
(rb_thread_pending is true and ruby is not in a critical phase
(Thread::critical=)
It's best to look at rubysig.h
Guy Decoux