/// <summary>
      /// Causes the calling thread to enter a condition variable wait using the specified ResourceLock.
      /// </summary>
      /// <param name="resourceLock">A reference to the ResourceLock object that will be 
      /// temporarily released while waiting for the condition to change.</param>
      /// <param name="reacquireForWriting">true if the ResourceLock should be reacquired for writing when the condition changes; 
      /// false if the lock should be reacquired for reading when the condition changes.</param>
      public void CVWait(ResourceLock resourceLock, Boolean reacquireForWriting) {
         Contract.Requires(resourceLock != null);
         // We can't wait on a lock that is free; the lock must currently be held
         if (resourceLock.CurrentlyFree())
            throw new InvalidOperationException("Can't wait on free lock.");

         // Indicate that this thread is going to pause
         // This value is "decremented" in Unpause
         Interlocked.Increment(ref m_numPausedThreads);
         //Console.WriteLine("{0}: Inc to {1}", Thread.CurrentThread.ManagedThreadId, m_numPausedThreads);

         AutoResetEvent are = new AutoResetEvent(false);
         m_waitingThreads.AddLast(are);


         // Find out if the lock is held by readers or a writer
         //Boolean reading = resourceLock.CurrentReaderCount() > 0;

         // Release the lock held by this thread
         resourceLock.Leave();

         // Make this thread paused until unpaused
         are.WaitOne(); //m_semaphore.WaitOne();

         // Make this thread regain the lock it used to hold
         resourceLock.Enter(reacquireForWriting);
      }
 private static void FuncTest_ResourceLock(ResourceLock rl)
 {
     FuncTest_ResourceLock rlt = new FuncTest_ResourceLock(8);
       rlt.Test(rl);
       //rlt.Test(new OneManyResourceLock());
       //rlt.Test(new OneManySpinResourceLock());
 }
Beispiel #3
0
        /// <summary>
        /// Determines whether the specified System.Object is equal to the current System.Object.
        /// </summary>
        /// <param name="obj">The System.Object to compare with the current System.Object.</param>
        /// <returns>true if the specified System.Object is equal to the current System.Object; otherwise, false.</returns>
        public override Boolean Equals(Object obj)
        {
            ResourceLock other = obj as ResourceLock;

            if (other == null)
            {
                return(false);
            }
            return((GetType() == other.GetType()) && (m_resourceLockOptions == other.m_resourceLockOptions));
        }
    private void StressLoop(ResourceLock rl)
    {
        Random random = new Random((Int32)DateTime.Now.Ticks);
          for (Int32 i = 0; i < m_iterations; i++) {
         if ((i > 0) && (i % (m_iterations / 10)) == 0)
            Console.WriteLine("   {0}: iteration={1}", Thread.CurrentThread.Name, i);

         rl.Enter(random.Next(m_readerWriterRatio) == 0);
         for (Int32 work = 0; work < m_workSpinCount; work++) ;
         rl.Leave();
          }
    }
    public void Test(ResourceLock rl)
    {
        // Use the thread-safety checker and the statistics gatherer in case anything goes wrong
          rl = new StatisticsGatheringResourceLockObserver(new ThreadSafeCheckerResourceLockObserver(rl));

          Thread[] threads = new Thread[m_threadCount - 1];
          for (Int32 t = 0; t < threads.Length - 1; t++) {
         threads[t] = new Thread((ThreadStart)delegate { StressLoop(rl); });
         threads[t].Name = "FuncTest_Deadlock_Test thread #" + t;
         threads[t].Start();
          }
          StressLoop(rl); // This thread will do it too
          for (Int32 t = 0; t < threads.Length - 1; t++)
         threads[t].Join();
    }
 private void Loop(Boolean write, ResourceLock rl)
 {
     Int32 z = 0;
       for (Int32 x = 0; x < m_iterations; x++) {
      if (write) { rl.Enter(true); z = x; rl.Leave(); } else { rl.Enter(false); Int32 y = z; rl.Leave(); }
       }
 }
    public TimeSpan Test(Boolean write, Int32 threadCount, ResourceLock rl)
    {
        // Make sure that the methods are JITted so that JIT time is not included in the results
          rl.Enter(false); rl.Leave();
          rl.Enter(true); rl.Leave();
          GC.Collect();
          GC.WaitForPendingFinalizers();
          GC.Collect();

          try {
         Thread.CurrentThread.Priority = ThreadPriority.Highest;
         Stopwatch stopWatch = Stopwatch.StartNew();
         Thread[] threads = new Thread[threadCount - 1];
         for (Int32 t = 0; t < threads.Length - 1; t++) {
            threads[t] = new Thread((ThreadStart)delegate { Loop(write, rl); });
            threads[t].Name = "FuncTest_Deadlock_Test thread #" + t;
            threads[t].Start();
         }
         Loop(write, rl);
         for (Int32 t = 0; t < threads.Length - 1; t++) {
            threads[t].Join();
            //threads[ls].Dispose();
         }
         return stopWatch.Elapsed;
          }
          finally {
         Thread.CurrentThread.Priority = ThreadPriority.Normal;
          }
    }
    public void Test(ResourceLock rl)
    {
        m_ResourceLock = new ThreadSafeCheckerResourceLockObserver(rl);

          // Spawn a bunch of threads that will attempt to read/write
          for (Int32 ThreadNum = 0; ThreadNum < m_Threads.Length; ThreadNum++) {
         m_Threads[ThreadNum] = new ManualResetEvent(false);
         ThreadPool.QueueUserWorkItem(ThreadFunc, ThreadNum);
          }
          WaitHandle.WaitAll(m_Threads);
          Console.WriteLine(m_ResourceLock.ToString());
    }
    private static void FuncTest_Deadlock_Test(ResourceLock l, Boolean write1st, Boolean write2nd, Boolean expectedToFail)
    {
        try {
         try {
            l.Enter(write1st);
            {
               l.Enter(write2nd);
               l.Leave();
            }
            l.Leave();

            if (expectedToFail)
               throw new InvalidProgramException("No deadlock detected when expected.");
         }
         catch (Exception<DeadlockExceptionArgs>) {
            if (!expectedToFail)
               throw new InvalidProgramException("Deadlock detected when not expected.");
         }
          }
          catch (InvalidOperationException) {
         // This can happen if deadlock detector throws before taking
         // a lock and the we try to release the lock anyway
          }
          //DeadlockDetector.ForceClear();
    }
Beispiel #10
0
 public ResourceLockConditionVariable(ResourceLock resourceLock) {
    m_resourceLock = resourceLock;
 }
Beispiel #11
0
 public DoneWritingDisposer(ResourceLock resLockObj)
 {
     this.m_resLockObj = resLockObj;
 }
Beispiel #12
0
 public ResourceLockConditionVariable(ResourceLock resourceLock)
 {
     m_resourceLock = resourceLock;
 }
 /// <summary>
 /// Causes the calling thread to enter a condition variable wait using the specified ResourceLock.
 /// </summary>
 /// <param name="resourceLock">A reference to the ResourceLock object that will be 
 /// temporarily released while waiting for the condition to change.</param>
 public void CVWait(ResourceLock resourceLock) {
    Contract.Requires(resourceLock != null);
    // If lock is held by a writer, reacquire it for writing
    Boolean writing = resourceLock.CurrentWriterCount() > 0;
    CVWait(resourceLock, writing);
 }