Beispiel #1
0
 /// <summary>
 /// Releases the resource held under this resource request back into the resource pool.
 /// </summary>
 /// <param name="resourceRequest">The resource request under which the resource has previously
 /// been acquired.</param>
 public void Release(IResourceRequest resourceRequest)
 {
     if (resourceRequest.ResourceObtained != null)
     {
         if (s_diagnostics)
         {
             string fromWhom = resourceRequest.ToString();
             if (resourceRequest.ResourceObtained != null)
             {
                 fromWhom = resourceRequest.ResourceObtained.Name;
             }
             _Debug.WriteLine(Name + " servicing request to release " + resourceRequest.QuantityDesired + " units of " + fromWhom);
         }
         IResource resourceReleased = resourceRequest.ResourceObtained;
         resourceRequest.ResourceObtained?.Release(resourceRequest);
         resourceRequest.Status = RequestStatus.Free;
         ResourceReleased?.Invoke(resourceRequest, resourceReleased);
         while (m_waiters.Count > 0)
         {
             IDetachableEventController dec = (IDetachableEventController)m_waiters[0];
             m_waiters.RemoveAt(0);
             if (dec.IsWaiting())
             {
                 dec.Resume();                    // We might be releasing all resources as a part of an abort.
             }
         }
     }
 }
Beispiel #2
0
 /// <summary>
 /// Releases the specified request. Returns it to availability and the resource pool.
 /// </summary>
 /// <param name="request">The request.</param>
 public void Release(IResourceRequest request)
 {
     lock (this) {
         DoRollback(request);
         ReleasedEvent?.Invoke(request, this);
         ResourceReleased?.Invoke(request, this);
     }
     while (m_waiters.Count > 0)
     {
         IDetachableEventController dec = (IDetachableEventController)m_waiters[0];
         m_waiters.RemoveAt(0);
         dec.Resume();
     }
 }