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);
|
static void mjit_copy_job_handler(void *data);
|
||||||
|
|
||||||
/* We're lazily copying cache values from main thread because these cache values
|
/* 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. */
|
could be different between ones on enqueue timing and ones on dequeue timing.
|
||||||
static void
|
Return TRUE if copy succeeds. */
|
||||||
|
static int
|
||||||
copy_cache_from_main_thread(struct mjit_copy_job *job)
|
copy_cache_from_main_thread(struct mjit_copy_job *job)
|
||||||
{
|
{
|
||||||
|
int success_p = TRUE;
|
||||||
job->finish_p = FALSE;
|
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");
|
CRITICAL_SECTION_START(3, "in MJIT copy job wait");
|
||||||
while (!job->finish_p) {
|
while (!job->finish_p) {
|
||||||
rb_native_cond_wait(&mjit_worker_wakeup, &mjit_engine_mutex);
|
rb_native_cond_wait(&mjit_worker_wakeup, &mjit_engine_mutex);
|
||||||
verbose(3, "Getting wakeup from client");
|
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");
|
CRITICAL_SECTION_FINISH(3, "in MJIT copy job wait");
|
||||||
|
return success_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The function implementing a worker. It is executed in a separate
|
/* 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. */
|
/* Copy ISeq's inline caches values to avoid race condition. */
|
||||||
if (job.cc_entries != NULL || job.is_entries != NULL) {
|
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 */
|
/* JIT compile */
|
||||||
|
|
Loading…
Reference in a new issue