From: takashikkbn@... Date: 2018-11-18T08:09:06+00:00 Subject: [ruby-core:89852] [Ruby trunk Bug#15316] rb_postponed_job_register not thread-safe Issue #15316 has been updated by k0kubun (Takashi Kokubun). Thanks to report that. > My goal is also to support MJIT in forked processes Oh by the way, I have a patch which was created yesterday but I was too busy to commit that yet. (I'll commit that shortly.) I think thread-safety of postponed_job and supporting MJIT in forked Ruby process are independent issues, but maybe your "workqueue" will be helpful for forked child somehow? ---------------------------------------- Bug #15316: rb_postponed_job_register not thread-safe https://bugs.ruby-lang.org/issues/15316#change-74910 * Author: normalperson (Eric Wong) * Status: Open * Priority: Normal * Assignee: k0kubun (Takashi Kokubun) * Target version: * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- Consider following execution timeline for two threads, t1 and t2. (should be 2 columns, I only have fixed-width fonts for display) ``` t1 t2 (mjit-worker) ----------------------------------------------------------------------------- vm->postponed_job_index increment #1 pjob[0]->func = ... pjob[0]->data = ... vm->postponed_job_index increment #2 RUBY_VM_SET_POSTPONED_JOB_INTERRUPT rb_postponed_job_flush sees result of increment #2 from t2 tries to access pjob[1] => CRASH pjob[1]->func = ... pjob[1]->data = ... RUBY_VM_SET_POSTPONED_JOB_INTERRUPT ``` So it looks like we need a THREAD-SAFE (not necessarily async-safe) version of rb_postponed_job_register. Or a one-off API for MJIT... job registration for MJIT. -- https://bugs.ruby-lang.org/ Unsubscribe: