mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-04-30 19:09:26 +08:00
* Fix #655: Join async threads before engine destruction to prevent heap-use-after-free Issues #632 and #636 (PRs #651 and #653) both stem from the same root cause: async threads spawned via async() can outlive the Dispatch_Engine, accessing shared state (global objects map, type maps) after it has been destroyed. The fix moves async() registration from the stdlib module into ChaiScript_Basic, where spawned threads are tracked via Dispatch_Engine. The engine's destructor now joins all outstanding async threads before destroying shared data structures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Address review: follow rule of 5, explicitly default move operations Requested by @lefticus in PR #656 review. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: leftibot <leftibot@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
18 lines
401 B
ChaiScript
18 lines
401 B
ChaiScript
// Regression test for #632 and #636: Heap-use-after-free in async threads
|
|
// Async threads must complete before the engine is destroyed.
|
|
|
|
var func = fun(){
|
|
var ret = 0;
|
|
for (var i = 0; i < 1000; ++i) {
|
|
ret += i;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
var fut1 = async(func);
|
|
var fut2 = async(func);
|
|
|
|
// Wait for results to verify correctness
|
|
assert_equal(fut1.get(), 499500);
|
|
assert_equal(fut2.get(), 499500);
|