Esempio n. 1
0
        /// <summary>
        /// Attempts to acquire a proscribed quantity of a resource in this resource pool. If the
        /// resource has already been reserved under this resourceRequest, it simply acquires that
        /// resource. If no resource has been reserved, then the best available resource will be
        /// reserved, and then acquired.
        /// </summary>
        /// <param name="resourceRequest">The resource request under which the reservation is to take
        /// place, and describing the resources desired.</param>
        /// <param name="blockAwaitingAcquisition">If true, blocks until resource is acquired.</param>
        /// <returns>true if the acquisition was successful.</returns>
        public bool Acquire(IResourceRequest resourceRequest, bool blockAwaitingAcquisition)
        {
            if (s_diagnostics)
            {
                _Debug.WriteLine(Name + " servicing request to acquire (" + (blockAwaitingAcquisition?"with":"without") + " block) " + resourceRequest.QuantityDesired + " units of " + resourceRequest);
            }

            if (resourceRequest.RequiredResource != null)
            {
                _Debug.Assert(false, "Explicit targeting of resources not yet implemented.");
                // TODO: Explicit targeting of resources and keying of requests not yet implemented.
            }

            if (blockAwaitingAcquisition)
            {
                bool acquired = AcquireWithWait(resourceRequest);
                return(acquired);
            }

            bool ableToReserve = ReserveBestResource(resourceRequest);

            if (ableToReserve)
            {
                lock (resourceRequest.ResourceObtained) {
                    IResource rsc = resourceRequest.ResourceObtained;
                    rsc.Acquire(resourceRequest);
                    resourceRequest.ResourceObtainedFrom = this;
                    ResourceAcquired?.Invoke(resourceRequest, resourceRequest.ResourceObtained);
                }
            }
            return(ableToReserve);
        }
Esempio n. 2
0
        /// <summary>
        /// Acquires the resource and quantity specifed by the resource request, blocking
        /// until it can return successfully.
        /// </summary>
        /// <param name="request">The resource request that describes the desired resource and quantity.</param>
        /// <returns>Always true.</returns>
        protected bool AcquireWithWait(IResourceRequest request)
        {
            IDetachableEventController dec = Model.Executive.CurrentEventController;

            if (dec == null)
            {
                throw new ApplicationException("Someone tried to call AcquireWithWait() while not in a detachable event. This is not allowed.");
            }

            dec.SetAbortHandler(request.AbortHandler);
            request.ResourceRequestAborting += m_onResourceRequestAborting;
            while (!Acquire(request, false))
            {
                m_waiters.Add(request, dec);
                dec.Suspend();
                dec.ClearAbortHandler();
            }
            if (request.ResourceObtained != null)
            {
                ResourceAcquired?.Invoke(request, request.ResourceObtained);
                return(true);
            }
            else
            {
                return(false);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Acquires the specified request. Removes it from availability and from the resource pool.
 /// </summary>
 /// <param name="request">The request.</param>
 /// <returns><c>true</c> if if the resource was successfully acquired, <c>false</c> otherwise.</returns>
 public bool Acquire(IResourceRequest request)
 {
     ResourceRequested?.Invoke(request, this);
     RequestEvent?.Invoke(request, this);
     lock (this) {
         if (AttemptExecution(request))
         {
             AcquiredEvent?.Invoke(request, this);
             ResourceAcquired?.Invoke(request, this);
             return(true);
         }
         else
         {
             return(false);
         }
     }
 }