aboutsummaryrefslogtreecommitdiffstats
path: root/thread.c
Commit message (Collapse)AuthorAgeFilesLines
* Revert r37956: thread.c (thread_start_func_2): small cleanups.kosaki2012-11-291-9/+10
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37964 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_start_func_2): remove unused code. Whenkosaki2012-11-291-8/+7
| | | | | | | th->safe_level == 4, th->errinfo never be thrown. So, to create new exception makes no sense. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37963 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert r37953: thread.c (thread_start_func_2): remove unused code. securitynaruse2012-11-291-2/+10
| | | | | | | | This sticks at bootstraptest/test_fork.rb:24 on FreeBSD and darwin. http://fb.rubyci.org/~chkbuild/ruby-trunk/log/20121128T230302Z.log.html.gz http://a.mrkn.jp/~mrkn/chkbuild/sl/ruby-trunk-m64-gcc42-o0/log/20121128T235908Z.log.html.gz git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37960 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (do_select): suppress warning (uninitialized value warning)naruse2012-11-291-1/+2
| | | | | | with UNINITIALIZED_VAR(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_start_func_2): small cleanups.kosaki2012-11-281-10/+9
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37956 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_start_func_2): remove unused code.kosaki2012-11-281-19/+13
| | | | | | this function never be used for main thread. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37955 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_start_func_2): remove unused code.kosaki2012-11-281-1/+0
| | | | | | | errinfo = th->errinfo; and errinfo = rb_errinfo(); are the same. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37954 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_start_func_2): remove unused code. securitykosaki2012-11-281-10/+2
| | | | | | level is checked before rb_eSecurityError raises. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_mutex_sleep): fix to allow spurious wakeup.ko12012-11-281-3/+6
| | | | | | | | * NEWS: write about spurious wakeup. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * include/ruby/thread.h (rb_thread_call_without_gvl2): changeko12012-11-281-86/+99
| | | | | | | | | | | | meaning of function. This function is called with same parameters of `rb_thread_call_without_gvl()'. However, if interrupts are detected, when return immediately. * thread.c: implement `rb_thread_call_without_gvl2()'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37938 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_join_sleep): check spurious wakeup by itself fortarui2012-11-281-35/+33
| | | | | | | | | | | | | | | | | | | | corresponding status change in trap context. * vm_core.h (struct rb_thread_struct): add rb_thread_list_t and use as join_list for reentry by trap context. * thread.c (thread_start_func_2): ditto. * thread.c (remove_from_join_list): ditto. * thread.c (rb_thread_atfork): ditto. * thread.c (thread_join): ditto. & remove trap handler check. * thread.c (sleep_forever): add argument : spurious_check. * thread.c (sleep_timeval): ditto. * thread.c (rb_thread_sleep_forever): set spurious_check. * thread.c (rb_thread_sleep_deadly): ditto. * thread.c (sleep_for_polling): ditto. * thread.c (rb_thread_wait_for): ditto. * thread.c (sleep_wait_for_interrupt): bypass spurious_check. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * vm_core.h (enum rb_thread_status): remove THREAD_TO_KILLkosaki2012-11-281-18/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * vm_core.h (struct rb_thread_struct): add to_kill field * thread.c (terminate_i): convert THREAD_TO_KILL to to_kill. * thread.c (rb_threadptr_to_kill): ditto. * thread.c (rb_thread_kill): ditto. * thread.c (rb_thread_wakeup_alive): ditto. * thread.c (thread_list_i): ditto. * thread.c (static const char): ditto. * thread.c (thread_status_name): ditto. * thread.c (rb_thread_status): ditto. * thread.c (rb_thread_inspect): ditto. * vm_backtrace.c (thread_backtrace_to_ary): ditto. * thread.c (rb_threadptr_execute_interrupts): fix thread status overwritten issue. [Bug #7450] [ruby-core:50249] * test/ruby/test_thread.rb (test_hread_status_raise_after_kill): test for the above. * test/ruby/test_thread.rb (test_thread_status_in_trap): test for thread status in trap. * test/ruby/test_thread.rb (test_status_and_stop_p): remove Thread.control_interrupt unsafe test. Thread#kill no longer changes thread status. Instead of, Thread#kill receiver changes their own status when receiving kill signal. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37931 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (struct rb_mutex_struct): add allow_trap field.kosaki2012-11-281-10/+13
| | | | | | | | | | | | | | * internal.h (rb_mutex_allow_trap): added. * thread.c (rb_mutex_lock, rb_mutex_unlock): check mutex->allow_trap. * thread.c (mutex_sleep): remove trap check because it uses rb_mutex_lock and rb_mutex_unlock internally. * thread.c (rb_mutex_allow_trap): new helper function for the above. * io.c (io_binwrite): mark fptr->write_lock as writable in trap. * test/ruby/test_signal.rb (test_trap_puts): test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37930 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_mutex_lock): moved trap context check fromkosaki2012-11-281-6/+6
| | | | | | | | | rb_mutex_trylock because try_lock have no change to make a deadlock. * thread.c (rb_mutex_trylock): ditto. * NEWS: news for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37922 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_s_new): uses main_thread->status instead ofkosaki2012-11-281-3/+1
| | | | | | | | th->inhibit_thread_creation for preventing thread creation. * vm_core.h (rb_vm_struct): remove inhibit_thread_creation field. * thread.c (rb_thread_terminate_all): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37921 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_join): A trap handler check was moved fromkosaki2012-11-281-6/+4
| | | | | | | | | | | thread_join_m because Thread#value should be raised an exception too. * thread.c (thread_join_m): remove trap handler check. * test/ruby/test_thread.rb (test_thread_join_in_trap): add test for thread#value. * NEWS: documentation fix for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37918 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): retry broadcast only whenko12012-11-271-2/+8
| | | | | | | | an exception is raised. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37888 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): broadcast terminate eventko12012-11-271-14/+5
| | | | | | | | not only an interrupt exception but any exceptions. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37887 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): suppress a warning.kosaki2012-11-271-0/+1
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37885 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_join): raises ThreadError if target theradkosaki2012-11-271-0/+3
| | | | | | | | | is a main thread. * test/ruby/test_thread.rb (test_thread_join_main_thread): test for the above. * NEWS: news for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37884 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_join): raises ThreadError if target threadkosaki2012-11-271-0/+4
| | | | | | | | | is a current thread. * test/ruby/test_thread.rb (test_thread_join_current): test for the above. * NEWS: news for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37883 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): broadcast eTerminateSignalkosaki2012-11-261-5/+12
| | | | | | again when Ctrl-C was pressed. [Feature #1952] [ruby-dev:39107] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37875 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): add RUBY_VM_CHECK_INTS_BLOCKING().kosaki2012-11-261-0/+1
| | | | | | | Otherwise the loop in this function behave as busy loop because native_sleep() return immediately when RUBY_VM_INTERRUPTED() is true. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37873 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_mutex_trylock, rb_mutex_unlock, mutex_sleep):kosaki2012-11-261-0/+15
| | | | | | | raises ThreadError if called from trap handler as Thread#join. * NEWS: news fot the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_terminate_all): use native_sleep() insteadkosaki2012-11-261-1/+4
| | | | | | | | of rb_thread_schedule(). Otherwise, it consume 100% cpu meaninglessly. [Bug #5368] [ruby-dev:44546] * thread.c (thread_start_func_2): last sub-thread wakes up main thread. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37865 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * vm_core.h (RUBY_VM_SET_TIMER_INTERRUPT, RUBY_VM_SET_INTERRUPT)kosaki2012-11-261-5/+6
| | | | | | | | | (RUBY_VM_SET_FINALIZER_INTERRUPT, RUBY_VM_SET_TRAP_INTERRUPT) (RUBY_VM_INTERRUPTED): use enum symbol instead of immediate value. * thread.c (thread_join_m, rb_threadptr_execute_interrupts): ditto. * signal.c (signal_exec): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37864 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_join_m): use th->interrupt_mask instead ofkosaki2012-11-261-3/+1
| | | | | | | | | | | th->in_trap. * vm_core.h (struct rb_thread_struct): remove in_trap member. * signal.c (signal_exec): ditto. * thread.c (thread_create_core): ditto. * thread.c (Init_Thread): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * ruby_atomic.h (ATOMIC_CAS): new macro for compare-and-exchange.kosaki2012-11-261-10/+27
| | | | | | | | | | | | | | | | | | | | | | | * vm_core.h (struct rb_thread_struct): add interrupt_mask member. * thread.c (thread_create_core, Init_Thread): initialize th->thread_mask. * vm_core.h (RUBY_VM_INTERRUPTED_ANY): new macro for avoiding bare th->interrupt_flag. * vm_core.h (RUBY_VM_INTERRUPTED, RUBY_VM_INTERRUPTED): check th->interrupt_mask. * thread.c (set_unblock_function, rb_thread_schedule): replace th->interrupt_flag with RUBY_VM_INTERRUPTED_ANY() * signal.c (signal_exec): set up thread->interrupt_mask for preventing recursive trap handler. * vm_core.h (RUBY_VM_CHECK_INTS, RUBY_VM_CHECK_INTS_BLOCKING): ditto. * thread.c (rb_threadptr_execute_interrupts): don't process interrupt if it is masked. [Bug #6009] [ruby-core:42524] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37861 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* split trap interrupt and async interruptkosaki2012-11-261-6/+22
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37855 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * vm_core.h (rb_thread_struct): added 'in_trap' member for markingkosaki2012-11-261-0/+9
| | | | | | | | | | | | | running trap handler. * signal.c (signal_exec): turn on in_trap when running trap. * thread.c (Init_Thread, thread_create_core): initialize in_trap when creating new threads. * thread.c (thread_join_m): raise ThreadError when running trap handler.Bug [#6416][ruby-core:44956] * test/ruby/test_thread.rb (test_thread_join_in_trap): new test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37852 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_create_core): don't use th->thread_id beforekosaki2012-11-241-2/+1
| | | | | | initialized. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37824 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * vm_trace.c: add two methods:ko12012-11-201-1/+1
| | | | | | | | | | | | | | | | | | | | | (1) TracePoint#return_value which returns return value on the :return and :c_return event. (2) TracePoint#raised_exception which returns raised exception value on the :raise event. Eeach methods raise RuntimeError if it is called at unsupported event. Please review and give us feedback until next preview release (Dec/2012) of Ruby 2.0.0. * insns.def, vm.c, vm_eval.c, vm_insnhelper.c, eval.c, thread.c: ditto. * vm_trace.c, vm_core.h: move definition of rb_trace_arg_t from vm_trace.c to vm_core.h. Caller fills rb_trace_arg_t and pass the pointer of this variable. * test/ruby/test_settracefunc.rb: fix tests to test this change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37752 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* revert r37730 kosaki2012-11-201-133/+132
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37740 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_s_check_interrupt): removed redundantkosaki2012-11-191-3/+3
| | | | | | | | GET_THREAD(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37732 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_threadptr_async_errinfo_active_p): added a smallkosaki2012-11-191-3/+11
| | | | | | | | comment. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37731 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c, vm_core.h: big rename th to cur_th when works onlykosaki2012-11-191-132/+133
| | | | | | | | th is current thread. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37730 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_blocking_region_end): replaced GET_THREAD()kosaki2012-11-191-1/+1
| | | | | | | | with ruby_thread_from_native(). We don't have GVL here. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37729 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_threadptr_execute_interrupts) removed.kosaki2012-11-191-12/+4
| | | | | | | | | | | * thread.c (rb_threadptr_execute_interrupts_common) renamed to rb_threadptr_execute_interrupts. I.e. unified rb_threadptr_execute_interrupts and rb_threadptr_execute_interrupts_common. * thread.c (rb_thread_schedule, rb_thread_execute_interrupts) s/_common//. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * prelude.rb: Moved Mutex#synchronize tokosaki2012-11-191-0/+18
| | | | | | | | * thread.c (rb_mutex_synchronize_m): here. [Bug #4266] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37724 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c: add `Thread#backtrace_locations' method.ko12012-11-191-3/+10
| | | | | | | | | | | | | | | | | | | This method is similart to `caller_locations' method for specific method. And fix to accept `level' and `n' parameters for `Thread#backtrace' and `Thread#backtrace_locations'. `caller' (and `caller_locations') do not return `caller' method frame. However, `Thread#backtrace' (and `Thread#backtrace_locations') return `Thread#backtrace' method frame itself if `Thread.current.backtrace' was called. * vm_backtrace.c: ditto. * internal.h: ditto. * test/ruby/test_backtrace.rb: add tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37716 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_call_without_gvl2): change the parameter ofko12012-11-161-9/+9
| | | | | | | | | | | | `func' from `int *skip_interrupt' to `VALUE *flags'. If (flags & RUBY_CALL_WO_GVL_FLAG_SKIP_CHECK_INTS) is not zero, then skip checking interrupt. [ruby-core:46547] * include/ruby/thread.h: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37681 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* suppress warning: 'val' may be used uninitialized in this functionnaruse2012-11-011-1/+1
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37415 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_call_without_gvl2): Note that ubf() may or maydrbrain2012-10-311-4/+8
| | | | | | | | not be called with the GVL. Hinted that rb_thread_call_with_gvl() can be used to access ruby functionality. [ruby-trunk - #6433] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37394 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_call_without_gvl2): Update documentation todrbrain2012-10-311-64/+65
| | | | | | | | natural English. * thread.c (rb_thread_call_with_gvl): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37393 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c: added Thread#thread_variable_(get|set),tenderlove2012-10-291-1/+154
| | | | | | | | | | | Thread#thread_variable?, and Thread#thread_variables for operating on variables that are local to threads. [ruby-core:47790] * vm.c: ditto * test/ruby/test_thread.rb: tests for thread variables. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37384 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (thread_raise_m): check interrupts after Thread#raiseko12012-10-231-3/+9
| | | | | | | | | | if a target thread is the current thread because the behavior of Thread.current.raise is expected to perform same as Kernel.raise (by rubyspec). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* Revert the last commit because some tests (in btest) failko12012-10-231-4/+0
| | | | git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37295 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_threadptr_raise): check interrupts afterko12012-10-231-0/+4
| | | | | | | | | Thread#raise because the behavior of Thread.current.raise is expected to perform same as Kernel.raise (by rubyspec). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_threadptr_interrupt_mask): fix to check interruptko12012-10-161-0/+2
| | | | | | | | after interrupt_mask changed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37234 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* * thread.c (rb_thread_aref):zzak2012-10-061-2/+2
| | | | | | | | Grammar in Thread documentation. Patch by Steve Klabnik [ruby-dev:47799] [Bug #7099] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37112 b2dd03c8-39d4-4d8f-98ff-823fe69b080e