diff --git a/js-assembler/runtime-src/baselib-functions.js b/js-assembler/runtime-src/baselib-functions.js index e22ac93..f0a15aa 100644 --- a/js-assembler/runtime-src/baselib-functions.js +++ b/js-assembler/runtime-src/baselib-functions.js @@ -144,8 +144,8 @@ var oldVal = MACHINE.v; var oldArgcount = MACHINE.a; var oldProc = MACHINE.p; - var oldErrorHandler = MACHINE.params['currentErrorHandler']; + var afterGoodInvoke = function (MACHINE) { plt.runtime.PAUSE( function (restart) { @@ -186,8 +186,15 @@ MACHINE.a = oldArgcount; MACHINE.p = oldProc; fail(e); + }; - MACHINE.trampoline(v.label); + + MACHINE.exclusiveLock.acquire( + "js-as-closure", + function(releaseLock) { + releaseLock(); + MACHINE.trampoline(v.label); + }); }; return f; }; @@ -270,6 +277,7 @@ MACHINE.p = oldProc; fail(e); }; + MACHINE.trampoline(proc.label); } else { fail(baselib.exceptions.makeExnFail( diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index ff9e4f6..663f4fb 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -197,7 +197,7 @@ this.locked = id; onAcquire.call( this, - // NOTE: the caller must release the lock or else deadlock. + // NOTE: the caller must release the lock or else deadlock! function() { setTimeout( function() { @@ -441,13 +441,16 @@ var recomputeMaxNumBouncesBeforeYield; var scheduleTrampoline = function(MACHINE, f) { - setTimeout( - function() { - - // FIXME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - return MACHINE.trampoline(f); - }, - 0); + MACHINE.exclusiveLock.acquire( + 'scheduleTrampoline', + function(release) { + setTimeout( + function() { + release(); + return MACHINE.trampoline(f); + }, + 0); + }); }; // Creates a restarting function, that reschedules f in a context @@ -486,7 +489,7 @@ // Make sure to get an exclusive lock before jumping into trampoline. // Otherwise, Bad Things will happen. // - // e.g. machine.lock.acquire(function() { machine.trampoline... machine.lock.release();}); + // e.g. machine.lock.acquire('id', function(release) { machine.trampoline... release();}); Machine.prototype.trampoline = function(initialJump, noJumpingOff) { var thunk = initialJump; diff --git a/version.rkt b/version.rkt index 865b3e0..96261f3 100644 --- a/version.rkt +++ b/version.rkt @@ -7,4 +7,4 @@ (provide version) (: version String) -(define version "1.96") +(define version "1.97")