/// <summary> /// <see cref="ISync.Acquire"/> /// </summary> public override void Acquire() { Utils.FailFastIfInterrupted(); if (Precheck()) { return; } WaitQueue.WaitNode w = new WaitQueue.WaitNode(); w.doWait(this); }
/// <summary> /// <see cref="ISync.Attempt"/> /// </summary> public override bool Attempt(long msecs) { Utils.FailFastIfInterrupted(); if (Precheck()) { return(true); } if (msecs <= 0) { return(false); } WaitQueue.WaitNode w = new WaitQueue.WaitNode(); return(w.doTimedWait(this, msecs)); }
/// <summary> /// <see cref="ISync.Release"/> /// </summary> public override void Release() { for (; ;) { WaitQueue.WaitNode w = Signallee; if (w == null) { return; // no one to signal } if (w.signal(this)) { return; // notify if still waiting, else skip } } }
/// <summary> /// Check to do on a wait node /// </summary> /// <param name="w"></param> /// <returns></returns> internal virtual bool Recheck(WaitQueue.WaitNode w) { lock (this) { bool pass = (nPermits > 0); if (pass) { --nPermits; } else { wq_.Insert(w); } return(pass); } }
/// <summary> /// <see cref="ISync.Attempt"/> /// </summary> public override bool Attempt(long msecs) { Utils.FailFastIfInterrupted(); if (Precheck()) return true; if (msecs <= 0) return false; WaitQueue.WaitNode w = new WaitQueue.WaitNode(); return w.doTimedWait(this, msecs); }
/// <summary> /// <see cref="ISync.Acquire"/> /// </summary> public override void Acquire() { Utils.FailFastIfInterrupted(); if (Precheck()) return; WaitQueue.WaitNode w = new WaitQueue.WaitNode(); w.doWait(this); }