Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/04/19 12:55:52 (5 years ago)
Author:
abeham
Message:

#2975: merged to stable

Location:
stable
Files:
3 edited
1 copied
1 moved

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.ExtLibs

  • stable/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.1.1/SimSharp-3.1.1/Core/Resources/ResourcePool.cs

    r15972 r17053  
    11#region License Information
    22/* SimSharp - A .NET port of SimPy, discrete event simulation framework
    3 Copyright (C) 2016  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3Copyright (C) 2019  Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44
    55This program is free software: you can redistribute it and/or modify
     
    2222
    2323namespace SimSharp {
     24  /// <summary>
     25  /// A ResourcePool is a crossover between a <see cref="Resource"/> and a <see cref="Store"/>.
     26  /// There is a fixed number of non-anonymous resources.
     27  ///
     28  /// Requests are performed in FIFO order only when they match at least one resource in the pool.
     29  /// Releases are processed in FIFO order (usually no simulation time passes for a Release).
     30  /// </summary>
    2431  public class ResourcePool {
    2532    protected static readonly Func<object, bool> TrueFunc = _ => true;
     
    3138    public int Remaining { get { return Resources.Count; } }
    3239
    33     protected Environment Environment { get; private set; }
     40    protected Simulation Environment { get; private set; }
    3441
    3542    protected LinkedList<ResourcePoolRequest> RequestQueue { get; private set; }
    3643    protected Queue<Release> ReleaseQueue { get; private set; }
    3744    protected List<object> Resources { get; private set; }
     45    protected List<Event> WhenAnyQueue { get; private set; }
     46    protected List<Event> WhenFullQueue { get; private set; }
     47    protected List<Event> WhenEmptyQueue { get; private set; }
     48    protected List<Event> WhenChangeQueue { get; private set; }
    3849
    39     public ResourcePool(Environment environment, IEnumerable<object> resources) {
     50    public ResourcePool(Simulation environment, IEnumerable<object> resources) {
    4051      Environment = environment;
    4152      if (resources == null) throw new ArgumentNullException("resources");
     
    4556      RequestQueue = new LinkedList<ResourcePoolRequest>();
    4657      ReleaseQueue = new Queue<Release>();
     58      WhenAnyQueue = new List<Event>();
     59      WhenFullQueue = new List<Event>();
     60      WhenEmptyQueue = new List<Event>();
     61      WhenChangeQueue = new List<Event>();
    4762    }
    4863
     
    6378      TriggerRelease();
    6479      return release;
     80    }
     81
     82    public virtual Event WhenAny() {
     83      var whenAny = new Event(Environment);
     84      WhenAnyQueue.Add(whenAny);
     85      TriggerWhenAny();
     86      return whenAny;
     87    }
     88
     89    public virtual Event WhenFull() {
     90      var whenFull = new Event(Environment);
     91      WhenFullQueue.Add(whenFull);
     92      TriggerWhenFull();
     93      return whenFull;
     94    }
     95
     96    public virtual Event WhenEmpty() {
     97      var whenEmpty = new Event(Environment);
     98      WhenEmptyQueue.Add(whenEmpty);
     99      TriggerWhenEmpty();
     100      return whenEmpty;
     101    }
     102
     103    public virtual Event WhenChange() {
     104      var whenChange = new Event(Environment);
     105      WhenChangeQueue.Add(whenChange);
     106      return whenChange;
    65107    }
    66108
     
    93135          RequestQueue.Remove(current);
    94136          current = next;
     137          TriggerWhenEmpty();
     138          TriggerWhenChange();
    95139        } else current = current.Next;
    96140        if (Resources.Count == 0) break;
     
    101145      while (ReleaseQueue.Count > 0) {
    102146        var release = ReleaseQueue.Peek();
    103         DoRelease(release);
    104         if (release.IsTriggered) {
     147        if (release.Request.IsAlive) {
     148          if (!RequestQueue.Remove((ResourcePoolRequest)release.Request))
     149            throw new InvalidOperationException("Failed to cancel a request.");
     150          release.Succeed();
    105151          ReleaseQueue.Dequeue();
    106         } else break;
     152        } else {
     153          DoRelease(release);
     154          if (release.IsTriggered) {
     155            ReleaseQueue.Dequeue();
     156            TriggerWhenAny();
     157            TriggerWhenFull();
     158            TriggerWhenChange();
     159          } else break;
     160        }
    107161      }
     162    }
     163
     164    protected virtual void TriggerWhenAny() {
     165      if (Remaining > 0) {
     166        if (WhenAnyQueue.Count == 0) return;
     167        foreach (var evt in WhenAnyQueue)
     168          evt.Succeed();
     169        WhenAnyQueue.Clear();
     170      }
     171    }
     172
     173    protected virtual void TriggerWhenFull() {
     174      if (InUse == 0) {
     175        if (WhenFullQueue.Count == 0) return;
     176        foreach (var evt in WhenFullQueue)
     177          evt.Succeed();
     178        WhenFullQueue.Clear();
     179      }
     180    }
     181
     182    protected virtual void TriggerWhenEmpty() {
     183      if (Remaining == 0) {
     184        if (WhenEmptyQueue.Count == 0) return;
     185        foreach (var evt in WhenEmptyQueue)
     186          evt.Succeed();
     187        WhenEmptyQueue.Clear();
     188      }
     189    }
     190
     191    protected virtual void TriggerWhenChange() {
     192      if (WhenChangeQueue.Count == 0) return;
     193      foreach (var evt in WhenChangeQueue)
     194        evt.Succeed();
     195      WhenChangeQueue.Clear();
    108196    }
    109197  }
Note: See TracChangeset for help on using the changeset viewer.