Пример #1
0
 /// <summary>
 /// <see cref="ISync.Acquire"/>
 /// </summary>
 public override void Acquire()
 {
     Utils.FailFastIfInterrupted();
     if (Precheck())
     {
         return;
     }
     WaitQueue.WaitNode w = new WaitQueue.WaitNode();
     w.doWait(this);
 }
Пример #2
0
        /// <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));
        }
Пример #3
0
 /// <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
         }
     }
 }
Пример #4
0
 /// <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);
     }
 }
Пример #5
0
        /// <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);
        }
Пример #6
0
 /// <summary>
 /// <see cref="ISync.Acquire"/>
 /// </summary>
 public override void Acquire()
 {
     Utils.FailFastIfInterrupted();
     if (Precheck())
         return;
     WaitQueue.WaitNode w = new WaitQueue.WaitNode();
     w.doWait(this);
 }