mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
mjit_worker.c: make sure copy job wait is unblocked
by stop_worker(). Previously copy_cache_from_main_thread() might loop forever even with stop_worker() is being called from ruby_cleanup(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7fbf01348b
commit
821ff80c0c
1 changed files with 15 additions and 4 deletions
|
@ -1171,19 +1171,29 @@ struct mjit_copy_job {
|
|||
static void mjit_copy_job_handler(void *data);
|
||||
|
||||
/* We're lazily copying cache values from main thread because these cache values
|
||||
could be different between ones on enqueue timing and ones on dequeue timing. */
|
||||
static void
|
||||
could be different between ones on enqueue timing and ones on dequeue timing.
|
||||
Return TRUE if copy succeeds. */
|
||||
static int
|
||||
copy_cache_from_main_thread(struct mjit_copy_job *job)
|
||||
{
|
||||
int success_p = TRUE;
|
||||
job->finish_p = FALSE;
|
||||
|
||||
rb_postponed_job_register(0, mjit_copy_job_handler, (void *)job);
|
||||
if (!rb_postponed_job_register(0, mjit_copy_job_handler, (void *)job))
|
||||
return FALSE;
|
||||
|
||||
CRITICAL_SECTION_START(3, "in MJIT copy job wait");
|
||||
while (!job->finish_p) {
|
||||
rb_native_cond_wait(&mjit_worker_wakeup, &mjit_engine_mutex);
|
||||
verbose(3, "Getting wakeup from client");
|
||||
|
||||
if (worker_stopped) { /* for cond broadcast from stop_worker() */
|
||||
success_p = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
CRITICAL_SECTION_FINISH(3, "in MJIT copy job wait");
|
||||
return success_p;
|
||||
}
|
||||
|
||||
/* The function implementing a worker. It is executed in a separate
|
||||
|
@ -1234,7 +1244,8 @@ mjit_worker(void)
|
|||
|
||||
/* Copy ISeq's inline caches values to avoid race condition. */
|
||||
if (job.cc_entries != NULL || job.is_entries != NULL) {
|
||||
copy_cache_from_main_thread(&job);
|
||||
if (copy_cache_from_main_thread(&job) == FALSE)
|
||||
continue; /* retry postponed_job failure, or stop worker */
|
||||
}
|
||||
|
||||
/* JIT compile */
|
||||
|
|
Loading…
Reference in a new issue