scala.actors

class WorkerThread

[source: scala/actors/WorkerThread.scala]

class WorkerThread(sched : IScheduler)
extends java.lang.Thread with AnyRef

The class WorkerThread is used by schedulers to execute actor tasks on multiple threads.

!!ACHTUNG: If you change this, make sure you understand the following proof of deadlock-freedom!!

We proof that there is no deadlock between the scheduler and any worker thread possible. For this, note that the scheduler only acquires the lock of a worker thread by calling execute. This method is only called when the worker thread is in the idle queue of the scheduler. On the other hand, a worker thread only acquires the lock of the scheduler when it calls getTask. At the only callsite of getTask, the worker thread holds its own lock.

Thus, deadlock can only occur when a worker thread calls getTask while it is in the idle queue of the scheduler, because then the scheduler might call (at any time!) execute which tries to acquire the lock of the worker thread. In such a situation the worker thread would be waiting to acquire the lock of the scheduler and vice versa.

Therefore, to prove deadlock-freedom, it suffices to ensure that a worker thread will never call getTask when it is in the idle queue of the scheduler.

A worker thread enters the idle queue of the scheduler when getTask returns null. Then it will also stay in the while-loop W (while (task eq null)) until task becomes non-null. The only way this can happen is through a call of execute by the scheduler. Before every call of execute the worker thread is removed from the idle queue of the scheduler. Only then--after executing its task-- the worker thread may call getTask. However, the scheduler is unable to call execute as the worker thread is not in the idle queue any more. In fact, the scheduler made sure that this is the case even _before_ calling execute and thus releasing the worker thread from the while-loop W. Thus, the property holds for every possible interleaving of thread execution. QED

Version
0.9.8
Author
Philipp Haller
Method Summary
def execute (r : java.lang.Runnable) : Unit
override def run : Unit
Methods inherited from java.lang.Thread
java.lang.Thread.start, java.lang.Thread.stop, java.lang.Thread.stop, java.lang.Thread.interrupt, java.lang.Thread.isInterrupted, java.lang.Thread.destroy, java.lang.Thread.isAlive, java.lang.Thread.suspend, java.lang.Thread.resume, java.lang.Thread.setPriority, java.lang.Thread.getPriority, java.lang.Thread.setName, java.lang.Thread.getName, java.lang.Thread.getThreadGroup, java.lang.Thread.countStackFrames, java.lang.Thread.join, java.lang.Thread.join, java.lang.Thread.join, java.lang.Thread.setDaemon, java.lang.Thread.isDaemon, java.lang.Thread.checkAccess, java.lang.Thread.toString, java.lang.Thread.getContextClassLoader, java.lang.Thread.setContextClassLoader, java.lang.Thread.getStackTrace, java.lang.Thread.getId, java.lang.Thread.getState, java.lang.Thread.getUncaughtExceptionHandler, java.lang.Thread.setUncaughtExceptionHandler
Methods inherited from AnyRef
getClass, hashCode, equals, clone, notify, notifyAll, wait, wait, wait, finalize, ==, !=, eq, ne, synchronized
Methods inherited from Any
==, !=, isInstanceOf, asInstanceOf
Method Details
def execute(r : java.lang.Runnable) : Unit

override def run : Unit
Overrides
java.lang.Thread.java.lang.Thread.run