merge revision(s) 63711,64398: [Backport #14841]

thread_sync.c (rb_mutex_lock): fix deadlock

	* thread_sync.c (rb_mutex_lock): fix deadlock
	  [ruby-core:87467] [Bug #14841]

	thread_sync.c (rb_mutex_lock): acquire lock before being killed

	We (the thread acquiring the mutex) need to acquire the mutex
	before being killed to work with ConditionVariable#wait.

	Thus we reinstate the acquire-immediately-after-sleeping logic
	from pre-r63711 while still retaining the
	acquire-after-checking-for-interrupts logic from r63711.

	This regression was introduced in
	commit 501069b8a4 (r63711)
	("thread_sync.c (rb_mutex_lock): fix deadlock") for
	[Bug #14841]

	[ruby-core:88503] [Bug #14999] [Bug #14841]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@64998 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2018-10-11 14:40:04 +00:00
parent c1034574aa
commit c561f04beb
2 changed files with 7 additions and 3 deletions

View file

@ -272,6 +272,7 @@ rb_mutex_lock(VALUE self)
list_add_tail(&mutex->waitq, &w.node);
native_sleep(th, timeout); /* release GVL */
list_del(&w.node);
if (!mutex->th) {
mutex->th = th;
}
@ -287,10 +288,13 @@ rb_mutex_lock(VALUE self)
th->status = prev_status;
}
th->vm->sleeper--;
if (mutex->th == th) mutex_locked(th, self);
RUBY_VM_CHECK_INTS_BLOCKING(th->ec);
RUBY_VM_CHECK_INTS_BLOCKING(th->ec); /* may release mutex */
if (!mutex->th) {
mutex->th = th;
mutex_locked(th, self);
}
}
}
return self;

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.5.2"
#define RUBY_RELEASE_DATE "2018-10-11"
#define RUBY_PATCHLEVEL 98
#define RUBY_PATCHLEVEL 99
#define RUBY_RELEASE_YEAR 2018
#define RUBY_RELEASE_MONTH 10