mirror of
https://github.com/ruby/ruby.git
synced 2025-08-23 21:14:23 +02:00
vm_trace.c: workqueue as thread-safe version of postponed_job
postponed_job is safe to use in signal handlers, but is not thread-safe for MJIT. Implement a workqueue for MJIT thread-safety. [Bug #15316] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66100 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d7e4e50bdb
commit
eb38fb670b
5 changed files with 67 additions and 20 deletions
|
@ -1133,6 +1133,9 @@ static mjit_copy_job_t mjit_copy_job;
|
|||
|
||||
static void mjit_copy_job_handler(void *data);
|
||||
|
||||
/* vm_trace.c */
|
||||
int rb_workqueue_register(unsigned flags, rb_postponed_job_func_t , void *);
|
||||
|
||||
/* 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.
|
||||
Return TRUE if copy succeeds. */
|
||||
|
@ -1148,7 +1151,7 @@ copy_cache_from_main_thread(mjit_copy_job_t *job)
|
|||
return job->finish_p;
|
||||
}
|
||||
|
||||
if (!rb_postponed_job_register(0, mjit_copy_job_handler, (void *)job))
|
||||
if (!rb_workqueue_register(0, mjit_copy_job_handler, (void *)job))
|
||||
return FALSE;
|
||||
CRITICAL_SECTION_START(3, "in MJIT copy job wait");
|
||||
/* checking `stop_worker_p` too because `RUBY_VM_CHECK_INTS(ec)` may not
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue