/// <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. } } } }
/// <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(); } }