Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        public void canncel(OtpActorMbox mbox)
        {
            OtpActorSchedTask task = mbox.Task;

            Monitor.Enter(runnable);
            try
            {
                lock (task)
                {
                    task.Active = false;
                }
            }
            finally
            {
                Monitor.Exit(runnable);
            }
        }
Esempio n. 5
0
        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);
            }
        }