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); }
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); } }
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); } }
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); }
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); }
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; }
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; }
internal override void DoJob(ref Worker wr, Cont <Unit> uK) { Work.Do(uK, ref wr); }