diff options
author | Takashi Kokubun <[email protected]> | 2020-12-11 19:58:45 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2020-12-11 19:58:59 -0800 |
commit | 3e2399134509930f3fe4d98787264f3a2c96af4c (patch) | |
tree | 0608d5c1138be4e55d9f8afea2fd2c6e15c1d4fb /mjit_worker.c | |
parent | 4e5156621e3557af98d3d91aff243278e1d8dbef (diff) |
Lock GC while searching the best iseq
To fix
http://ci.rvm.jp/results/trunk-mjit-wait@phosphorus-docker/3286265
Diffstat (limited to 'mjit_worker.c')
-rw-r--r-- | mjit_worker.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/mjit_worker.c b/mjit_worker.c index 6e43169446..5fbad3fe5a 100644 --- a/mjit_worker.c +++ b/mjit_worker.c @@ -500,9 +500,14 @@ mjit_valid_class_serial_p(rb_serial_t class_serial) static struct rb_mjit_unit * get_from_list(struct rb_mjit_unit_list *list) { - struct rb_mjit_unit *unit = NULL, *next, *best = NULL; + while (in_gc) { + verbose(3, "Waiting wakeup from GC"); + rb_native_cond_wait(&mjit_gc_wakeup, &mjit_engine_mutex); + } + in_jit = true; // Lock GC // Find iseq with max total_calls + struct rb_mjit_unit *unit = NULL, *next, *best = NULL; list_for_each_safe(&list->head, unit, next, unode) { if (unit->iseq == NULL) { // ISeq is GCed. remove_from_list(unit, list); @@ -514,6 +519,11 @@ get_from_list(struct rb_mjit_unit_list *list) best = unit; } } + + in_jit = false; // Unlock GC + verbose(3, "Sending wakeup signal to client in a mjit-worker for GC"); + rb_native_cond_signal(&mjit_client_wakeup); + if (best) { remove_from_list(best, list); } |