Free cookie consent management tool by TermsFeed Policy Generator

source: stable/HeuristicLab.ExtLibs/HeuristicLab.SimSharp/3.0.9/SimSharp-3.0.9/Core/Resources/Resource.cs @ 15584

Last change on this file since 15584 was 15584, checked in by swagner, 6 years ago

#2640: Updated year of copyrights in license headers on stable

File size: 3.4 KB
Line 
1#region License Information
2/* SimSharp - A .NET port of SimPy, discrete event simulation framework
3Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4
5This program is free software: you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation, either version 3 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program.  If not, see <http://www.gnu.org/licenses/>.*/
17#endregion
18
19using System;
20using System.Collections.Generic;
21
22namespace SimSharp {
23  public class Resource {
24
25    public int Capacity { get; protected set; }
26
27    public int InUse { get { return Users.Count; } }
28
29    public int Remaining { get { return Capacity - InUse; } }
30
31    protected Environment Environment { get; private set; }
32
33    protected LinkedList<Request> RequestQueue { get; private set; }
34    protected Queue<Release> ReleaseQueue { get; private set; }
35    protected HashSet<Request> Users { get; private set; }
36
37    public Resource(Environment environment, int capacity = 1) {
38      if (capacity <= 0) throw new ArgumentException("Capacity must > 0.", "capacity");
39      Environment = environment;
40      Capacity = capacity;
41      RequestQueue = new LinkedList<Request>();
42      ReleaseQueue = new Queue<Release>();
43      Users = new HashSet<Request>();
44    }
45
46    public virtual Request Request() {
47      var request = new Request(Environment, TriggerRelease, DisposeCallback);
48      RequestQueue.AddLast(request);
49      TriggerRequest();
50      return request;
51    }
52
53    public virtual Release Release(Request request) {
54      var release = new Release(Environment, request, TriggerRequest);
55      ReleaseQueue.Enqueue(release);
56      TriggerRelease();
57      return release;
58    }
59
60    protected virtual void DisposeCallback(Event @event) {
61      var request = @event as Request;
62      if (request != null) {
63        Release(request);
64      }
65    }
66
67    protected virtual void DoRequest(Request request) {
68      if (Users.Count < Capacity) {
69        Users.Add(request);
70        request.Succeed();
71      }
72    }
73
74    protected virtual void DoRelease(Release release) {
75      if (!Users.Remove(release.Request)) {
76        var current = RequestQueue.First;
77        while (current != null && current.Value != release.Request)
78          current = current.Next;
79        if (current != null) RequestQueue.Remove(current);
80      }
81      release.Succeed();
82    }
83
84    protected virtual void TriggerRequest(Event @event = null) {
85      while (RequestQueue.Count > 0) {
86        var request = RequestQueue.First.Value;
87        DoRequest(request);
88        if (request.IsTriggered) {
89          RequestQueue.RemoveFirst();
90        } else break;
91      }
92    }
93
94    protected virtual void TriggerRelease(Event @event = null) {
95      while (ReleaseQueue.Count > 0) {
96        var release = ReleaseQueue.Peek();
97        DoRelease(release);
98        if (release.IsTriggered) {
99          ReleaseQueue.Dequeue();
100        } else break;
101      }
102    }
103  }
104}
Note: See TracBrowser for help on using the repository browser.