aboutsummaryrefslogtreecommitdiffstats
path: root/native/src/blocking/global-fmlp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/blocking/global-fmlp.cpp')
-rw-r--r--native/src/blocking/global-fmlp.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/native/src/blocking/global-fmlp.cpp b/native/src/blocking/global-fmlp.cpp
new file mode 100644
index 0000000..b7cd25b
--- /dev/null
+++ b/native/src/blocking/global-fmlp.cpp
@@ -0,0 +1,53 @@
1#include "sharedres.h"
2#include "blocking.h"
3
4#include "stl-helper.h"
5
6
7BlockingBounds* global_fmlp_bounds(const ResourceSharingInfo& info)
8{
9 // split every thing by resources, sort, and then start counting.
10 Resources resources;
11
12 split_by_resource(info, resources);
13 sort_by_request_length(resources);
14
15
16 unsigned int i;
17 BlockingBounds* _results = new BlockingBounds(info);
18 BlockingBounds& results = *_results;
19
20 unsigned int num_tasks = info.get_tasks().size();
21
22 for (i = 0; i < info.get_tasks().size(); i++)
23 {
24 const TaskInfo& tsk = info.get_tasks()[i];
25 Interference bterm;
26
27
28 foreach(tsk.get_requests(), jt)
29 {
30 const RequestBound& req = *jt;
31 const ContentionSet& cs =
32 resources[req.get_resource_id()];
33
34 unsigned long interval = tsk.get_response();
35 unsigned long issued = req.get_num_requests();
36
37 // every other task may block once per request
38 unsigned int total_limit = (num_tasks - 1) * issued;
39 unsigned int per_src_limit = issued;
40
41 bterm += bound_blocking(cs,
42 interval,
43 total_limit,
44 per_src_limit,
45 &tsk);
46 }
47
48 results[i] = bterm;
49 }
50
51 return _results;
52}
53