Rather than explicitely acquire and release the job queue lock, we'll use the ssynchronized decorator. This makes the code easier for further changes.
Signed-off-by: Guido Trotter <[email protected]> --- lib/jqueue.py | 42 ++++++++++++++++++++---------------------- 1 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lib/jqueue.py b/lib/jqueue.py index fe9a156..b31f306 100644 --- a/lib/jqueue.py +++ b/lib/jqueue.py @@ -373,6 +373,7 @@ class _OpExecCallbacks(mcpu.OpExecCbBase): self._job = job self._op = op + @locking.ssynchronized(_big_jqueue_lock) def NotifyStart(self): """Mark the opcode as running, not lock-waiting. @@ -382,22 +383,27 @@ class _OpExecCallbacks(mcpu.OpExecCbBase): Processor.ExecOpCode) set to OP_STATUS_WAITLOCK. """ - self._queue.acquire() - try: - assert self._op.status in (constants.OP_STATUS_WAITLOCK, - constants.OP_STATUS_CANCELING) + assert self._op.status in (constants.OP_STATUS_WAITLOCK, + constants.OP_STATUS_CANCELING) - # All locks are acquired by now - self._job.lock_status = None + # All locks are acquired by now + self._job.lock_status = None - # Cancel here if we were asked to - if self._op.status == constants.OP_STATUS_CANCELING: - raise CancelJob() + # Cancel here if we were asked to + if self._op.status == constants.OP_STATUS_CANCELING: + raise CancelJob() - self._op.status = constants.OP_STATUS_RUNNING - self._op.exec_timestamp = TimeStampNow() - finally: - self._queue.release() + self._op.status = constants.OP_STATUS_RUNNING + self._op.exec_timestamp = TimeStampNow() + + @locking.ssynchronized(_big_jqueue_lock) + def _AppendFeedback(self, timestamp, log_type, log_msg): + """Internal feedback append function, with locks + + """ + self._job.log_serial += 1 + self._op.log.append((self._job.log_serial, timestamp, log_type, log_msg)) + self._job.change.notifyAll() def Feedback(self, *args): """Append a log entry. @@ -414,15 +420,7 @@ class _OpExecCallbacks(mcpu.OpExecCbBase): # The time is split to make serialization easier and not lose # precision. timestamp = utils.SplitTime(time.time()) - - self._queue.acquire() - try: - self._job.log_serial += 1 - self._op.log.append((self._job.log_serial, timestamp, log_type, log_msg)) - - self._job.change.notifyAll() - finally: - self._queue.release() + self._AppendFeedback(timestamp, log_type, log_msg) def ReportLocks(self, msg): """Write locking information to the job. -- 1.7.1
