In the call branch of `curry`, `passed` is the only reference keeping the freshly built argument array alive, yet its backing buffer is handed to `rb_proc_call_with_block` as `argv` via `RARRAY_CONST_PTR(passed)`. After taking that point...ko1 (Koichi Sasada)
ractor_mark marks only the wrapper's direct references: the wrapper is shareable, so following an unshareable object from it breaks the shref rule, and the Ractor's unshareable parts are marked by the root scan instead. The kept reply p...ko1 (Koichi Sasada)
Ractor#join made a Ractor::Port for each call and closed it, and a require or autoload from a non-main Ractor made one, made it shareable, and passed it to the main Ractor in the request. All three now wait on the Ractor's kept reply po...ko1 (Koichi Sasada)
Applied in changeset commit:git|7fe831a84b198d617455e71505e20de7635ec749. ---------- Only the owner Ractor makes its objects shareable [Bug #22419] Making an object shareable sets FL_SHAREABLE, the page's shareable/shref bits, and make...ko1 (Koichi Sasada)
rb_gc_obj_ractor(obj) returns the living Ractor whose objspace holds obj's page, so a caller can find the Ractor that may write obj's flags and page bits. The pointer is set when the objspace is made for a Ractor (the main Ractor's in r...ko1 (Koichi Sasada)
rb_postponed_job_trigger_for_ractor flags only threads.running_ec, which may be a thread that has gone to sleep or exited since (with 1:1 threads it keeps pointing at the last thread that ran, e.g. Ractor#require's). The job then waits ...ko1 (Koichi Sasada)
Making an object shareable sets FL_SHAREABLE, the page's shareable/shref bits, and makes strings independent. Those writes belong to the owner's objspace and are single-writer, but rb_ractor_shareable_p did them on whatever it walked, s...ko1 (Koichi Sasada)
Each wait for a share request's answer made a Ractor::Port and closed it. Keep one per Ractor (sync.reply_port) and lend it to one wait at a time (sync.reply_port_busy); a wait that finds it busy makes a port of its own as before. A wai...ko1 (Koichi Sasada)
The child re-records nt->tid, which fork does change, but kept the parent's nt->thread_id. No pthread implementation we know of gives the forking thread a new pthread_t in the child (checked on glibc, where it is the address of the thre...ko1 (Koichi Sasada)
configure still defines NON_SCALAR_THREAD_ID, but three places assume a scalar pthread_t: the main-thread check in native_thread_init_stack and Thread#name= compare an id with 0, and last_exiting_thread keeps a pthread_t in a void *. Ch...ko1 (Koichi Sasada)