mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-21 05:50:55 +08:00
- Add the abi.instance_per_thread profile field: the archive's TUs compile with -DSCR_THREAD_INSTANCES, and the SCR_TL qualifier in scr_runtime.h moves every runtime unit's mutable statics into thread-local storage; both backends emit the program TU's module globals, run-once guards, and lazily-compiled regex literal caches thread-local to match - ONE linked archive then serves one independent instance per embedder thread through the unchanged entry family: a thread registers its sink and calls the init entry, and owns its own collector, result arena, poison flag, and program state — a trap poisons only the instance it fired in while sibling threads' instances keep answering - Document the contract beside the profile spec: one instance per thread, selected implicitly by the calling thread; instance lifetime is the thread's lifetime; the never-entered-from-two-threads rule is unchanged; independent of and composable with abi.localize_runtime - Immutable interned data (string literals, unit arms, template arrays, vtables) stays shared — Darwin ASan's image-registration common included, keeping the one-registration-per-image discipline; the exception cell's current pointer resolves a NULL sentinel in this mode because a thread-local address is not a constant initializer - Add the four-thread acceptance probe (distinct per-thread workloads, concurrent instance-local inits, per-instance collects, a trap delivered to its own thread's sink exactly once), the composition probe pairing a thread-instanced localized archive with a second different-prefix localized archive, an explicit ASan rerun beside the suite-flavor sanitized builds, and profile-shape coverage; schedule the new lane contracts beside M1/M2 - Non-opted builds are byte-for-byte unchanged: the qualifier expands to nothing outside -DSCR_LIB -DSCR_THREAD_INSTANCES (verified object-level over every touched runtime TU in both default and library flavors)