예제 #1
0
 protected virtual void DoRequest(Request request)
 {
     if (Users.Count < Capacity)
     {
         WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time));
         Users.Add(request);
         request.Succeed();
     }
 }
예제 #2
0
 protected virtual void DoRequest(ResourcePoolRequest request)
 {
     foreach (var o in Resources)
     {
         if (!request.Filter(o))
         {
             continue;
         }
         WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time));
         Resources.Remove(o);
         request.Succeed(o);
         return;
     }
 }
예제 #3
0
 protected virtual void DoRequest(PreemptiveRequest request)
 {
     if (Users.Count >= Capacity && request.Preempt)
     {
         // Check if we can preempt another process
         // MaxItems are the least important according to priorty, time, and preemption flag
         var preempt = Users.MaxItems(x => x).Last();
         if (preempt.CompareTo(request) > 0)
         {
             InterruptTime?.Add(Environment.ToDouble(Environment.Now - request.Time));
             preempt.IsPreempted = true;
             Users.Remove(preempt);
             preempt.Owner?.Interrupt(new Preempted(request.Owner, preempt.Time));
         }
     }
     if (Users.Count < Capacity)
     {
         WaitingTime?.Add(Environment.ToDouble(Environment.Now - request.Time));
         Users.Add(request);
         request.Succeed();
     }
 }