diff --git a/lib/modules/Concurrent.pmod b/lib/modules/Concurrent.pmod index 6304cbb11b6f26da7ebdb298feaeecb7f08062ca..c5fb0362c1fbb3698dc6b34ff2cecaffa6dac5b8 100644 --- a/lib/modules/Concurrent.pmod +++ b/lib/modules/Concurrent.pmod @@ -232,6 +232,7 @@ class Future //! @[on_failure()], @[query_success_callbacks()] this_program on_success(function(mixed, mixed ... : void) cb, mixed ... extra) { + Thread.MutexKey key = mux->lock(); switch (state) { case STATE_FULFILLED: call_callback(cb, result, @extra); @@ -274,6 +275,7 @@ class Future //! @[on_success()], @[query_failure_callbacks()] this_program on_failure(function(mixed, mixed ... : void) cb, mixed ... extra) { + Thread.MutexKey key = mux->lock(); switch (state) { case STATE_REJECTED: state = STATE_REJECTION_REPORTED; @@ -941,14 +943,19 @@ class Promise return Future::this; } - protected this_program finalise(State newstate, mixed value, int try, - array(array(function(mixed, mixed ...: void)|array(mixed))) cbs) + protected this_program finalise(State newstate, mixed value, int try) { Thread.MutexKey key = mux->lock(); if (state <= STATE_PENDING) { state = newstate; result = value; + array(array(function(mixed, mixed ...: void)|array(mixed))) cbs; + if (state == STATE_FULFILLED) { + cbs = success_cbs; + } else { + cbs = failure_cbs; + } key = 0; cond->broadcast(); if (sizeof(cbs)) @@ -989,7 +996,7 @@ class Promise //! @[try_success()], @[try_failure()], @[failure()], @[on_success()] this_program success(mixed value, void|int try) { - return finalise(STATE_FULFILLED, value, try, success_cbs); + return finalise(STATE_FULFILLED, value, try); } //! Fulfill the @[Future] if it hasn't been fulfilled or failed already. @@ -1027,7 +1034,7 @@ class Promise this_program failure(mixed value, void|int try) { return - finalise(STATE_REJECTED, value, try, failure_cbs); + finalise(STATE_REJECTED, value, try); } //! Maybe reject the @[Future] value.