Commit graph

674 commits

Author SHA1 Message Date
nagachika
e59be15368 merge revision(s) 62673: [Backport #14577]
thread.c: deadlock in backtrace

	* thread.c (unblock_function_set): check interrupts just once
	  during raising exceptions, as they are deferred since r16651.
	  [ruby-core:85939] [Bug #14577]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@62917 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-03-25 05:54:39 +00:00
nagachika
3c35067cfc merge revision(s) 59963: [Backport #13163]
thread.c: report then abort

	* thread.c (thread_start_func_2): report then abort on exception,
	  if both are set.  [ruby-core:79280] [Bug #13163]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@62711 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-03-10 02:32:56 +00:00
nagachika
01cfae3beb merge revision(s) 59462,59474: [Backport #13772]
release VM stack properly.

	* cont.c: r55766 change the handling method of Fiber's VM stack.
	  Resumed Fiber points NULL as VM stack and running Thread has
	  responsibility to manage it (marking and releasing).

	  However, thread_start_func_2()@thread.c and thread_free()@vm.c
	  doesn't free the VM stack if corresponding root Fiber is exist.
	  This causes memory leak. [Bug #13772]

	* cont.c (root_fiber_alloc): fib->cont.saved_thread.ec.stack should be NULL
	  because running thread has responsibility to manage this stack.

	* vm.c (rb_thread_recycle_stack_release): assert given stack is not NULL
	  (callers should care it).

	fix stack storing for root fibers.

	* cont.c (root_fiber_alloc): this function is called by fiber_current()
	  and fiber_store(). fiber_current() should clear VM stack information
	  in a fiber data because runnning thread knows stack information and has
	  responsibility to manage it. However fiber_store() requires to remain
	  VM stack information in a fiber data because the responsibility to manage
	  VM stack is moved to the Fiber from the Thread (and switch to another
	  fiber).

	* cont.c (root_fiber_alloc): save thread's fiber and root_fiber information.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59516 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-08-05 06:35:02 +00:00
nagachika
11fdbaddf2 merge revision(s) 59030,59031: [Backport #13638]
thread.c: avoid busy looping on rb_thread_fd_close

	We no longer use it this function, but extensions do, and
	we need to ensure it continues to work for them.

	* thread.c (rb_thread_fd_close): schedule other threads in loop
	* ext/-test-/thread_fd_close/thread_fd_close.c: new file
	* ext/-test-/thread_fd_close/depend: ditto
	* ext/-test-/thread_fd_close/extconf.rb: ditto
	* test/-ext-/thread_fd_close/test_thread_fd_close.rb: new test
	* properties.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59295 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-07-09 19:36:49 +00:00
nagachika
2725131211 merge revision(s) 58284,58812,59028: [Backport #13632]
vm_core.h: ruby_error_stream_closed

	* vm_core.h (ruby_special_exceptions): renamed
	  ruby_error_closed_stream as ruby_error_stream_closed, like the
	  message.
	speed up IO#close with many threads

	Today, it increases IO#close performance with many threads:

	  Execution time (sec)
	  name            trunk   after
	  vm_thread_close 4.276   3.018

	  Speedup ratio: compare with the result of `trunk' (greater is better)
	  name            after
	  vm_thread_close 1.417

	This speedup comes because rb_notify_fd_close only scans threads
	inside rb_thread_io_blocking_region, not all threads in the VM.

	In the future, this type data structure may allow us to notify
	waiters of multiple FDs on a single thread (when using
	Fibers).

	* thread.c (struct waiting_fd): declare
	  (rb_thread_io_blocking_region): use on-stack list waiter
	  (rb_notify_fd_close): walk vm->waiting_fds instead
	  (call_without_gvl): remove old field setting
	  (th_init): ditto
	* vm_core.h (typedef struct rb_vm_struct): add waiting_fds list
	* (typedef struct rb_thread_struct): remove waiting_fd field
	  (rb_vm_living_threads_init): initialize waiting_fds list

	I am now kicking myself for not thinking about this 3 years ago
	when I introduced ccan/list in [Feature #9632] to optimize this
	same function :<
	IO#close: do not enqueue redundant interrupts (take #2)

	Enqueuing multiple errors for one event causes spurious errors
	down the line, as reported by Nikolay Vashchenko in
	https://bugs.ruby-lang.org/issues/13632

	This should fix bad interactions with test_race_gets_and_close
	in test/ruby/test_io.rb since we ensure rb_notify_fd_close
	continues returning the busy flag after enqueuing the interrupt.

	Backporting changes to 2.4 and earlier releases will be more
	challenging...

	* thread.c (rb_notify_fd_close): do not enqueue multiple interrupts
	  [ruby-core:81581] [Bug #13632]
	* test/ruby/test_io.rb (test_single_exception_on_close):
	  new test based on script from Nikolay

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59286 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-07-08 02:21:36 +00:00
naruse
147107ce36 merge revision(s) 57968,57969,57970: [Backport #13313]
thread.c: thread_do_start

	* thread.c (thread_do_start): extract from a macro in
	  thread_start_func_2 for debugger.
	thread.c: Thread.start with Symbol

	* thread.c (thread_do_start): fix segfault at start with Symbol.
	  proc created by Symbol#to_proc does not have environment unless
	  using refinements.  [ruby-core:80147] [Bug #13313]
	Fiber also has same issue. [Bug #13313]

	* thread.c (rb_vm_proc_local_ep): added.

	* cont.c (rb_fiber_start): use rb_vm_proc_local_ep().


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@58003 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-17 07:06:50 +00:00
naruse
319e440d0f merge revision(s) 57948,57950: [Backport #13304]
thread.c: rb_thread_fd_close [ci skip]

	* thread.c (rb_thread_fd_close): re-define only for abi-check,
	  abort if called.  [ruby-core:80078] [Bug #13304]
	thread.c: rb_thread_fd_close [ci skip]

	* thread.c (rb_thread_fd_close): remove deprecated. a couple of
	  external libraries used it.  [ruby-core:80078] [Bug #13304]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-13 09:28:35 +00:00
naruse
91036252bb merge revision(s) 57595: [Backport #8996]
check thread deadness correctly.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57906 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-12 12:55:00 +00:00
naruse
0c72a8f091 merge revision(s) 57477,57478,57479: [Backport #12405]
use TRUE/FALSE.

	define rb_thread_sleep_deadly_allow_spurious_wakeup().

	* thread.c, thread_sync.c: define new function
	  rb_thread_sleep_deadly_allow_spurious_wakeup() and use it instead of
	  using sleep_forever() directly.

	allow Queue operation in trap.

	* thread_sync.c: allow spurious wakeup to check Queue status just after trap.
	  [Bug #12405]

	* test/thread/test_queue.rb: add a test for it.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57879 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-11 18:45:34 +00:00
naruse
2105a06528 merge revision(s) 57422: [Backport #13158]
io.c: close before wait

	* io.c (io_close_fptr): notify then close, and wait for other
	  threads before free fptr.  [ruby-core:79262] [Bug #13158]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-11 18:07:19 +00:00
naruse
1c13c7fa88 merge revision(s) 57199,57202,57206,57224: [Backport #13076]
io.c: fix race between read and close

	* io.c (io_fillbuf): fix race between read and close, in the case
	  the IO gets closed before the reading thread achieve the lock.
	  [ruby-core:78845] [Bug #13076]
	thread.c: fix race between read and close

	* thread.c (rb_thread_fd_close): wait until all threads using the
	  fd finish the operation, not to free the buffer in use.
	  [ruby-core:78845] [Bug #13076]
	revert a part of r57199

	* io.c (io_fillbuf): revert a part of r57199 because it broke IO#getch.
	  see also [Bug #13076]

	io.c: fix race between read and close

	* io.c (io_fillbuf): fix race between read and close and bail out
	  in the case the IO gets closed before the reading thread achieve
	  the lock.  [ruby-core:78845] [Bug #13076]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@57838 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-03-11 13:02:01 +00:00
rhe
c54ede0560 proc.c: assume rb_iseq_location_t::first_lineno is always a Fixnum
Do not check for the value of rb_iseq_constant_body::line_info_table as
it is no longer related. The checks seem to be the remains from the day
before the dedicated 'first_lineno' field was introduced. Remove them.

Note, rb_iseq_constant_body::line_info_table can be NULL only when the
iseq does not contain any instructions that originate from Ruby code,
for example, an iseq created with 'proc {}' under a non-default compile
options where trace instructions are disabled.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-12-20 05:26:07 +00:00
shugo
472959f9c2 Add clang volatile fixes from FreeBSD and NetBSD.
Use volatile instead of optnone to avoid optimization which causes
segmentation faults.
Patch by Dimitry Andric.  [ruby-core:78531] [Bug #13014]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57020 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-12-07 23:27:51 +00:00
nobu
9e3afec027 thread.c: fix doc of abort_on_exception [ci skip]
* thread.c (rb_thread_s_abort_exc, rb_thread_s_abort_exc_set):
  [DOC] the raised exception will be re-raised in the main thread,
  and then follows the ordinary exception sequence, exit status is
  not 0.  [ruby-core:78415] [Bug #12991]

* thread.c (rb_thread_abort_exc_set): ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56928 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-11-29 12:54:43 +00:00
ktsj
9cbd6ee097 * vm_trace.c (tracepoint_attr_callee_id, rb_tracearg_callee_id):
add TracePoint#callee_id. [ruby-core:77241] [Feature #12747]

* cont.c, eval.c, gc.c, include/ruby/intern.h, insns.def, thread.c,
  vm.c, vm_backtrace.c, vm_core.h, vm_eval.c, vm_insnhelper.c, vm_trace.c: ditto.

* test/ruby/test_settracefunc.rb: tests for above.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56593 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-11-05 13:15:27 +00:00
nobu
dd3b3d716e thread.c: check coverage values
* thread.c (update_coverage): check coverage values, and ignore
  non-fixnum values.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56354 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-10-06 01:30:29 +00:00
shyouhei
2fc5210f31 * internal.h (WARN_UNUSED_RESULT): moved to configure.in, to
actually check its availability rather to check GCC's version.

	* configure.in (WARN_UNUSED_RESULT): moved to here.

	* configure.in (RUBY_FUNC_ATTRIBUTE): change function declaration
	  to return int rather than void, because it makes no sense for a
	  warn_unused_result attributed function to return void.

	  Funny thing however is that it also makes no sense for noreturn
	  attributed function to return int.  So there is a fundamental
	  conflict between them.  While I tested this, I confirmed both
	  GCC 6 and Clang 3.8 prefers int over void to correctly detect
	  necessary attributes under this setup.  Maybe subject to change
	  in future.

	* internal.h (UNINITIALIZED_VAR): renamed to MAYBE_UNUSED, then
	  moved to configure.in for the same reason we move
	  WARN_UNUSED_RESULT.

	* configure.in (MAYBE_UNUSED): moved to here.

	* internal.h (__has_attribute): deleted, because it has no use now.

	* string.c (rb_str_enumerate_lines): refactor macro rename.

	* string.c (rb_str_enumerate_bytes): ditto.

	* string.c (rb_str_enumerate_chars): ditto.

	* string.c (rb_str_enumerate_codepoints): ditto.

	* thread.c (do_select): ditto.

	* vm_backtrace.c (rb_debug_inspector_open): ditto.

	* vsnprintf.c (BSD_vfprintf): ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56169 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-09-16 06:15:55 +00:00
nobu
646c53895f thread.c: set cause by Thread#raise
* thread.c (rb_threadptr_raise): set cause from the called thread,
  but not from the thread to be interrupted.
  [ruby-core:77222] [Bug #12741]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56125 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-09-09 08:59:48 +00:00
ko1
9f60791a04 * vm_core.h: revisit the structure of frame, block and env.
[Bug #12628]

  This patch introduce many changes.

  * Introduce concept of "Block Handler (BH)" to represent
    passed blocks.

  * move rb_control_frame_t::flag to ep[0] (as a special local
    variable). This flags represents not only frame type, but also
    env flags such as escaped.

  * rename `rb_block_t` to `struct rb_block`.

  * Make Proc, Binding and RubyVM::Env objects wb-protected.

  Check [Bug #12628] for more details.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55766 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-07-28 11:02:30 +00:00
hsbt
9eef1971f0 * thread.c: Fixed implicit conversion error with Apple clang-800.0.31
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55619 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-07-09 23:57:52 +00:00
ngoto
79e46488e8 * thread.c (rb_wait_for_single_fd): Clean up fds.revents every time
before calling ppoll(2). [Bug #12575] [ruby-dev:49725]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-07-08 12:51:36 +00:00
nobu
4060211c96 thread.c: fix thread_id formatting
* thread.c (debug_deadlock_check): fix format specifier for
  thread_id, which may not be a pointer, nor even a scalar value.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55419 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-06-15 01:44:43 +00:00
naruse
a475df2f25 * thread.c (debug_deadlock_check): show thread lock dependency and
backtrace [Feature #8214] [ruby-dev:47217]

* thread.c (thread_status_name): show "sleep_forever" instead of
  "sleep" if called from inspect.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55397 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-06-13 12:34:06 +00:00
nobu
2e71c75278 Thread.report_on_exception
* thread.c (thread_start_func_2): report raised exception if
  report_on_exception flag is set.  [Feature #6647]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-06-06 00:25:38 +00:00
usa
fbef098fc5 * thread.c (recursive_list_access): a object id may be a Bignum. so,
the list must be a objhash, instead of a identhash.
  this fixes many test errors on mswin64 CI.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55063 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-18 12:31:53 +00:00
nobu
639bfd6d9c thread.c: GET_THREAD once in rb_thread_atfork
* thread.c (rb_thread_atfork_internal): move th to an argument.
* thread.c (rb_thread_atfork): do not repeat GET_THREAD().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54961 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-09 01:52:01 +00:00
nobu
a46df859cc thread.c: clear atfork functions
* thread.c (rb_thread_atfork, rb_thread_atfork_before_exec): do
  nothing unless working fork is available.
* thread_sync.c (rb_mutex_abandon_all): define only if working
  fork is available.
* thread_sync.c (rb_mutex_abandon_keeping_mutexes): ditto.
* thread_sync.c (rb_mutex_abandon_locking_mutex): ditto.
* thread_win32.c (gvl_init): never used.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54960 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-09 01:46:37 +00:00
naruse
a6c8e8d15b * configure.in: add -Wsuggest-attribute=noreturn and suppress warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-08 00:55:28 +00:00
nobu
84f94652b0 use TH_JUMP_TAG
* vm_eval.c (rb_eval_cmd, rb_catch_obj): use TH_JUMP_TAG with the
  same rb_thread_t used for TH_PUSH_TAG, instead of JUMP_TAG with
  the current thread global variable.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54914 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-05 03:22:20 +00:00
nobu
4bf8fa83b7 thread.c: defer setting name in initialize
* thread.c (rb_thread_setname): defer setting native thread name
  set in initialize until the native thread is created.
  [ruby-core:74963] [Bug #12290]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54600 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-04-15 13:30:03 +00:00
nobu
f7d0059e36 thread.c: must be initialized to set name
* thread.c (get_initialized_threadptr): extract ensuring that the
  thread is initialized.
* thread.c (rb_thread_setname): thread must be initialized to set
  the name.  [ruby-core:74963] [Bug #12290]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54598 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-04-15 12:12:25 +00:00
eregon
4225b29df9 * ext/coverage/coverage.c: Fully reset coverage to not persist global state.
It was returning old file coverages as empty arrays to the user.
  [ruby-core:74596] [Bug #12220]
* ext/coverage/coverage.c (rb_coverages): remove unused static state.
* thread.c: Moved and renamed coverage_clear_result_i to reset_coverage_i.
* test/coverage/test_coverage.rb: improve precision of tests.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-04-06 14:29:17 +00:00
eregon
8dd2435877 * thread.c (update_coverage): Do not track coverage in loaded files
after Coverage.result. Avoids out-of-bounds access. [Bug #12237]
* ext/coverage/coverage.c (coverage_clear_result_i): document.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54465 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-03-31 16:14:52 +00:00
nobu
c3900ff4a8 thread.c: check type of coverage
* thread.c (update_coverage): check type of coverage array not
  only if non-zero.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54075 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-03-10 05:32:48 +00:00
nobu
557a00f1aa thread.c: interrupt queue on uninitialized thread
* thread.c (rb_thread_pending_interrupt_p): no pending interrupt
  before initialization.
* thread.c (thread_raise_m, rb_thread_kill): uninitialized thread
  cannot interrupt.  [ruby-core:72732] [Bug #11959]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53449 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-01-07 05:49:31 +00:00
ko1
2f5b8f0529 * *.c (*_memsize): do not check ptr.
NULL checking is finished Before call of memsize functions.
  See r52979.




git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52986 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-09 00:38:32 +00:00
nobu
0ada28f906 thread.c: name must be ascii-compatible
* thread.c (rb_thread_setname): name must be ascii-compatible, as
  pthread APIs do not accept legacy wide char strings.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52876 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-04 02:22:44 +00:00
nobu
dfe27428f1 configure.in: split SET_THREAD_NAME
* configure.in: separate SET_CURRENT_THREAD_NAME, which can set
  the name of current thread only, and SET_ANOTHER_THREAD_NAME,
  which can set the name of other threads.
* thread.c (rb_thread_setname): use SET_ANOTHER_THREAD_NAME.  OS X
  is not possible to set another thread name.
* thread_pthread.c (native_set_thread_name, thread_timer): use
  SET_CURRENT_THREAD_NAME.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52866 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-03 02:57:14 +00:00
nobu
afd564ee3f thread.c: rb_thread_setname on OS X
* thread.c (rb_thread_setname): pthread_setname_np() on OS X takes
  the name only and sets the current thread.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52864 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-02 09:17:49 +00:00
ko1
417240b7fb * iseq.h: introduce ISEQ_COVERAGE() and ISEQ_COVERAGE_SET() macro.
* compile.c: use them.

* iseq.c: ditto.

* iseq.c (rb_iseq_coverage): added.

* thread.c (update_coverage): use rb_iseq_coverage().

* vm_core.h: rename coverage field name to support this fix.




git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52860 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-02 08:05:36 +00:00
nobu
62b511d9e6 thread.c: reset name
* thread.c (rb_thread_setname): allow to reset thread name.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-01 14:36:42 +00:00
nobu
c56d9aaabf thread.c: check name argument
* thread.c (rb_thread_setname): check the argument if valid
  string.  [ruby-core:71774] [Bug #11756]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52834 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-12-01 14:14:07 +00:00
kosaki
487748fac8 * thread_pthread.c (register_ubf_list): renamed from
add_signal_thread_list.
* thread_pthread.c (unregister_ubf_list): renamed
  from remove_signal_thread_list.
* thread_pthread.c (ubf_wakeup_all_threads): renamed from
  ping_signal_thread_list.
* thread_pthread.c (ubf_wakeup_thread): renamed from
  ubf_select_each.
* thread_pthread.c (ubf_threads_empty): renamed from
  check_signal_thread_list().
* thread_pthread.c (ubf_list_lock): renamed from
  signal_thread_list_lock.

* thread_pthread.c (register_ubf_list): large simplification
  by using ccan/list.h.
  bonus: removed malloc() and exit(EXIT_FAILURE).
* thread_pthread.c (unregister_ubf_list): ditto.
* thread_pthread.c (ubf_threads_empty): ditto.
* thread_pthread.c (ubf_wakeup_all_threads): ditto.

* thread_pthread.c (print_signal_list): removed.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-11-30 20:33:20 +00:00
normal
d79891c2ef thread.c (rb_cThreadShield): make static
Nothing outside of thread.c accesses this variable, so avoid
cluttering up the global namespace with it.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52478 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-11-07 02:40:33 +00:00
nobu
f8a2398a86 thread.c: suppress warnings only if GCC6+
* thread.c (rb_fd_no_init): suppress warnings by applying ASSUME
  only if GCC 6 or lator, to get rid of freeze with GCC 4.7.2-5.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51894 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-09-18 04:42:58 +00:00
nobu
f3f10297f0 io.c: no wait when killed
* io.c (rb_io_s_popen): do not wait the child process during being
  killed.  [ruby-core:70671] [Bug #11510]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51798 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-09-08 14:09:30 +00:00
nobu
f476726323 thread.c: suppress warnings
* thread.c (do_select): suppress maybe-uninitialized warnings on
  maxfd.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51774 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-09-06 02:04:40 +00:00
ko1
dcf6ac4975 * thread_tools.c: rename thread_tools.c to thread_sync.c.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51730 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-09-01 09:08:42 +00:00
ko1
0de5e1cb87 * ext/thread/thread.c: move definitions of Queue, SizedQueue
and ConditionalVariables to thread_tools.c. In other wowrds,
  such classes are built-in.
  [Feature #8919]
  At first, I planned to embed only a Queue class.
  However, rubygems requires 'thread.rb' (rubygems are
  required at first, when launch MRI without --disable-gems).
  So most of people require 'thread.rb' as an embedded library.
  Now, ext/thread/thread.c is empty, only for a dummy for
  compatibility.
* thread.c: move a definition of Mutex class to thread_tools.c.
  And define Mutex class under Thread (so now Mutex is Thread::Mutex).
  Because other thread related classes are also defined under Thread.
  We remain ::Mutex as Thread::Mutex. Only an inspect result is changed.
* common.mk: add dependency from thread.o to thraed_tools.c.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51660 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-08-21 23:36:23 +00:00
normal
f224fecc0f improve handling of timer thread shutdown
Shutting down the timer thread now always closes pipes to free FDs.
In fact, we close the write ends of the pipes is done in the main
RubyVM to signal the timer thread shutdown.

To effectively close pipes, we implement userspace locks via
atomics to force the pipe closing thread to wait on any signal
handlers which may be waking up.

While we're at it, improve robustness during resource exhaustion and
allow it to limp along non-fatally if restarting a timer thread
fails.

This reverts r51268

Note: this change is tested with VM_CHECK_MODE 1 in vm_core.h

* process.c (close_unless_reserved): add extra check
  (dup2_with_divert): remove
  (redirect_dup2): use dup2 without divert
  (before_exec_non_async_signal_safe): adjust call + comment
  (rb_f_exec): stop timer thread for all OSes
  (rb_exec_without_timer_thread): remove
* eval.c (ruby_cleanup): adjust call
* thread.c (rb_thread_stop_timer_thread): always close pipes
* thread_pthread.c (struct timer_thread_pipe): add writing field,
    mark owner_process volatile for signal handlers
  (rb_thread_wakeup_timer_thread_fd): check valid FD
  (rb_thread_wakeup_timer_thread): set writing flag to prevent close
  (rb_thread_wakeup_timer_thread_low): ditto
  (CLOSE_INVALIDATE): new macro
  (close_invalidate): new function
  (close_communication_pipe): removed
  (setup_communication_pipe_internal): make errors non-fatal
  (setup_communication_pipe): ditto
  (thread_timer): close reading ends inside timer thread
  (rb_thread_create_timer_thread): make errors non-fatal
  (native_stop_timer_thread): close write ends only, always,
   wait for signal handlers to finish
  (rb_divert_reserved_fd): remove
* thread_win32.c (native_stop_timer_thread): adjust (untested)
  (rb_divert_reserved_fd): remove
* vm_core.h: adjust prototype

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2015-08-14 09:44:10 +00:00