Peano
Loading...
Searching...
No Matches
TaskEnumerator.cpp
Go to the documentation of this file.
1#include "TaskEnumerator.h"
2
3#include <bitset>
4
5#include "tarch/Assertions.h"
9
10
11std::map< int, tarch::multicore::BooleanSemaphore* > swift2::TaskEnumerator::_resources;
14
15
19
20
22 ResourcesSemaphore::Lock _lock( _resourcesSemaphore, ResourcesSemaphore::Lock::Write );
23 if (number!=tarch::Enumerator::NoNumber and _resources.count(number)==0 ) {
24 _resources.insert( {number, new tarch::multicore::BooleanSemaphore()} );
25 }
26 assertionEquals1( _resources.count(number), 1, number );
27}
28
29
31 std::bitset<TwoPowerD> entryMissing = 0;
32
33 {
34 ResourcesSemaphore::Lock _lock( _resourcesSemaphore, ResourcesSemaphore::Lock::Read );
35 for (int i=0; i<TwoPowerD; i++) {
36 entryMissing[i] = numbers[i]!=tarch::Enumerator::NoNumber and _resources.count(numbers[i])==0;
37 }
38 }
39
40 if ( entryMissing.any() ) {
41 for (int i=0; i<TwoPowerD; i++) {
42 insertNumber( numbers[i] );
43 }
44 }
45}
46
47
49 return _globalEnumerator.getNumber();
50}
51
52
54 _globalEnumerator.releaseNumber(value);
55}
56
57
59 return _globalEnumerator.size();
60}
61
62
64 return _globalEnumerator.toString();
65}
66
67
69 std::bitset<TwoPowerD> gotAllLocks = 0;
70
71 for (int i=0; i<TwoPowerD; i++) {
72 assertion2( numbers[i]==tarch::Enumerator::NoNumber or numbers[i]>=0, i, numbers[i] );
73 }
74
75 insertNumbers(numbers);
76
77 while (not gotAllLocks.all()) {
78 ResourcesSemaphore::Lock _lock( _resourcesSemaphore, ResourcesSemaphore::Lock::Read );
79 int counter = 0;
80 while (counter<TwoPowerD) {
81 if (numbers[counter] == tarch::Enumerator::NoNumber) {
82 gotAllLocks[counter] = true;
83 }
84 else {
85 assertionEquals2( _resources.count(numbers[counter]), 1, counter, numbers[counter] );
87 *_resources.at( numbers[counter] ),
88 false, false
89 );
90 gotAllLocks[counter] = lock.tryLock();
91 }
92 if (gotAllLocks[counter]) {
93 counter++;
94 }
95 else {
96 counter = TwoPowerD;
97 }
98 }
99
100 if (not gotAllLocks.all()) {
101 for (int i=0; i<TwoPowerD; i++) {
102 if (gotAllLocks[i]) {
103 gotAllLocks[i] = false;
104 assertionEquals2( _resources.count(numbers[i]), 1, i, numbers[i] );
106 *_resources.at( numbers[i] ),
107 false, false
108 );
109 lock.free();
110 }
111 }
112
114 } // Hasn't worked, so we have released all the locks and did yield.
115 // While loop fill try again next.
116 }
117}
118
119
121 for (int i=0; i<TwoPowerD; i++) {
122 if (numbers[i] != tarch::Enumerator::NoNumber) {
123 ResourcesSemaphore::Lock _lock( _resourcesSemaphore, ResourcesSemaphore::Lock::Read );
124 assertion1( _resources.count(numbers[i])==1, numbers[i] );
126 *_resources.at( numbers[i] ),
127 false, false
128 );
129 lock.free();
130 }
131 }
132}
#define assertion2(expr, param0, param1)
#define assertionEquals1(lhs, rhs, a)
#define assertion1(expr, param)
#define assertionEquals2(lhs, rhs, a, b)
#define TwoPowerD
Definition Globals.h:19
int size() const
Number of numbers handed out so far.
static void insertNumber(int number)
Create a new number.
static void insertNumbers(const tarch::la::Vector< TwoPowerD, int > &numbers)
static std::map< int, tarch::multicore::BooleanSemaphore * > _resources
Each task is tied to a resource, i.e.
static void unlockResources(const tarch::la::Vector< TwoPowerD, int > &numbers)
Free resources.
static ResourcesSemaphore _resourcesSemaphore
int getNumber()
Create a new task number.
static tarch::Enumerator _globalEnumerator
void releaseNumber(int value)
Free task number.
std::string toString() const
Decorator for tarch::Enumerator::toString().
static void lockResources(const tarch::la::Vector< TwoPowerD, int > &numbers)
Lock resources.
Simple rank-global enumerator.
Definition Enumerator.h:24
static constexpr int NoNumber
Definition Enumerator.h:26
static Core & getInstance()
Definition Core.cpp:56
void yield()
Wrapper around backend-specific yield.
Definition Core.cpp:80
Create a lock around a boolean semaphore region.
Definition Lock.h:19
void free()
Free the lock.
Definition Lock.cpp:37
Create a lock around a boolean semaphore region.
Simple vector class.
Definition Vector.h:134