コード例 #1
0
        internal override void DoJob(ref Worker wr, Cont <Unit> uK)
        {
Spin:
            var state = this.State;

            if (state > Initial)
            {
                goto Signaled;
            }
            if (state < Initial)
            {
                goto Spin;
            }
            if (Initial != Interlocked.CompareExchange(ref this.State, ~state, state))
            {
                goto Spin;
            }

            WaitQueue.AddTaker(ref this.Takers, uK);
            this.State = Initial;
            return;

Signaled:
            Work.Do(uK, ref wr);
        }
コード例 #2
0
ファイル: Async.cs プロジェクト: wallymathieu/Hopac
        internal override void DoJob(ref Worker wr, Cont <X> xK)
        {
#if !NO_ISTHREADPOOLTHREAD
            if (Thread.CurrentThread.IsThreadPoolThread)
            {
                var work = wr.WorkStack;
                wr.WorkStack = null;
                Scheduler.PushAll(wr.Scheduler, work);
                Cont.Do(xK, ref wr, this.Run());
            }
            else
#endif
            {
                var fac = new FromAsyncCont <X>(xK);
                this.Start(fac);
                if (0 != fac.state)
                {
                    goto Continue;
                }
                fac.sr = wr.Scheduler;
                if (0 == Interlocked.CompareExchange(ref fac.state, 1, 0))
                {
                    return;
                }
Continue:
                Work.Do(fac.xK, ref wr);
            }
        }
コード例 #3
0
        internal override void DoJob(ref Worker wr, Cont <Unit> uK)
        {
            var uT = this.uT;

            if (TaskStatus.RanToCompletion == uT.Status)
            {
                Work.Do(uK, ref wr);
            }
            else
            {
                uT.ConfigureAwait(false).GetAwaiter().UnsafeOnCompleted(new State(uT, uK, wr.Scheduler).Ready);
            }
        }
コード例 #4
0
ファイル: Async.cs プロジェクト: wallymathieu/Hopac
        internal override void DoJob(ref Worker wr, Cont <Y> yK)
        {
            var bac = this.Start(yK);

            if (0 != bac.state)
            {
                goto Continue;
            }
            bac.sr = wr.Scheduler;
            if (0 == Interlocked.CompareExchange(ref bac.state, 1, 0))
            {
                return;
            }
Continue:
            Work.Do(bac, ref wr);
        }
コード例 #5
0
ファイル: Async.cs プロジェクト: wallymathieu/Hopac
        internal override void DoJob(ref Worker wr, Cont <X> xK)
        {
            var fac = new FromAsyncCont <X>(xK);

            this.Start(fac);
            if (0 != fac.state)
            {
                goto Continue;
            }
            fac.sr = wr.Scheduler;
            if (0 == Interlocked.CompareExchange(ref fac.state, 1, 0))
            {
                return;
            }
Continue:
            Work.Do(fac.xK, ref wr);
        }
コード例 #6
0
        internal override void TryAlt(ref Worker wr, int i, Cont <Unit> uK, Else uE)
        {
            var pkSelf = uE.pk;

Spin:
            var state = this.State;

            if (state > Initial)
            {
                goto TryPick;
            }
            if (state < Initial)
            {
                goto Spin;
            }
            if (Initial != Interlocked.CompareExchange(ref this.State, ~state, state))
            {
                goto Spin;
            }

            WaitQueue.AddTaker(ref this.Takers, i, pkSelf, uK);
            this.State = Initial;
            uE.TryElse(ref wr, i + 1);
            return;

TryPick:
            var st = Pick.TryPick(pkSelf);

            if (st > 0)
            {
                goto AlreadyPicked;
            }
            if (st < 0)
            {
                goto TryPick;
            }

            Pick.SetNacks(ref wr, i, pkSelf);

            Work.Do(uK, ref wr);
AlreadyPicked:
            return;
        }
コード例 #7
0
ファイル: Always.cs プロジェクト: sjkdev21/Hopac
        internal override void TryAlt(ref Worker wr, int i, Cont <Unit> uK, Else uE)
        {
            var pkSelf = uE.pk;

TryPick:
            var stSelf = Pick.TryPick(pkSelf);

            if (stSelf > 0)
            {
                goto AlreadyPicked;
            }
            if (stSelf < 0)
            {
                goto TryPick;
            }

            Pick.SetNacks(ref wr, i, pkSelf);

            Work.Do(uK, ref wr);

AlreadyPicked:
            return;
        }
コード例 #8
0
ファイル: Always.cs プロジェクト: sjkdev21/Hopac
 internal override void DoJob(ref Worker wr, Cont <Unit> uK)
 {
     Work.Do(uK, ref wr);
 }