public void react(OtpActor actor) { OtpActorSchedTask task = new OtpActorSchedTask(actor); IEnumerator<OtpActor.Continuation> enumerator = task.Enumerator; if (!enumerator.MoveNext()) { task.Active = false; } else { Monitor.Enter(runnable); try { task.Active = true; runnable.Enqueue(task); if (runnable.Count == 1) { Monitor.Pulse(runnable); } } finally { Monitor.Exit(runnable); } } }
public void react(OtpActor actor) { OtpActorSchedTask task = new OtpActorSchedTask(actor); IEnumerator <OtpActor.Continuation> enumerator = task.Enumerator; if (!enumerator.MoveNext()) { task.Active = false; } else { Monitor.Enter(runnable); try { task.Active = true; runnable.Enqueue(task); if (runnable.Count == 1) { Monitor.Pulse(runnable); } } finally { Monitor.Exit(runnable); } } }
public void notify(OtpActorMbox mbox) { OtpActorSchedTask task = mbox.Task; Monitor.Enter(runnable); try { Monitor.Enter(task); try { if (mbox.Task.Active) { runnable.Enqueue(mbox.Task); if (runnable.Count == 1) { Monitor.Pulse(runnable); } } } finally { Monitor.Exit(task); } } finally { Monitor.Exit(runnable); } }
public void canncel(OtpActorMbox mbox) { OtpActorSchedTask task = mbox.Task; Monitor.Enter(runnable); try { lock (task) { task.Active = false; } } finally { Monitor.Exit(runnable); } }
private void schedule() { Monitor.Enter(runnable); try { while (runnable.Count == 0) { Monitor.Wait(runnable); } OtpActorSchedTask task = runnable.Dequeue(); OtpActor actor = task.Actor; IEnumerator <OtpActor.Continuation> enumerator = task.Enumerator; Monitor.Enter(task); try { if (task.Active) { OtpMsg msg = actor.Mbox.receiveMsg(); if (msg == null) { return; } ThreadPool.QueueUserWorkItem (delegate(Object state) { Monitor.Enter(task); try { OtpActor.Continuation cont = enumerator.Current; cont(msg); if (!enumerator.MoveNext()) { task.Active = false; } } catch (Exception e) { log.Info("Exception was thrown from running actor: " + e.Message); } finally { Monitor.Exit(task); } }); } } finally { Monitor.Exit(task); } } finally { Monitor.Exit(runnable); } }