Line data Source code
1 : /////////////////////////////////////////////////////////////////////////// 2 : // Spetabaru - Berenger Bramas MPCDF - 2017 3 : // Under LGPL Licence, please you must read the LICENCE file. 4 : /////////////////////////////////////////////////////////////////////////// 5 : 6 : #include "UTester.hpp" 7 : #include "utestUtils.hpp" 8 : 9 : #include "Data/SpDataAccessMode.hpp" 10 : #include "Utils/SpUtils.hpp" 11 : 12 : #include "Task/SpTask.hpp" 13 : #include "Legacy/SpRuntime.hpp" 14 : 15 : class TestRace : public UTester< TestRace > { 16 : using Parent = UTester< TestRace >; 17 : 18 1 : void TestBasic(){ 19 1 : std::array<unsigned int,2> SleepTimes{0, 500000}; 20 3 : for(auto SleepTime : SleepTimes){ 21 4 : SpRuntime runtime; 22 : 23 2 : runtime.setSpeculationTest([](const int /*inNbReadyTasks*/, const SpProbability& /*inProbability*/) -> bool{ 24 0 : return true; 25 : }); 26 : 27 2 : const int arraySize = 6; 28 2 : int val[arraySize] = {0}; 29 : 30 2 : UTestRaceChecker counterAccess; 31 : 32 4 : runtime.task(SpReadArray(val,SpArrayView(arraySize)), [](SpArrayAccessor<const int>& /*valParam*/){ 33 2 : }); 34 : // val is 0 35 : 36 14 : for(int idx = 0 ; idx < arraySize ; ++idx){ 37 12 : runtime.task(SpWrite(val[idx]), 38 24 : SpReadArray(val,SpArrayView(arraySize).removeItem(idx)), 39 : [SleepTime,idx,&counterAccess] 40 250 : (int& valParam, const SpArrayAccessor<const int>& valArray) -> bool { 41 : { 42 12 : counterAccess.lock(); 43 12 : counterAccess.addWrite(&valParam); 44 72 : for(int idxTest = 0 ; idxTest < valArray.getSize() ; ++idxTest){ 45 60 : counterAccess.addRead(&valArray.getAt(idxTest)); 46 : } 47 12 : counterAccess.unlock(); 48 : } 49 : 50 12 : if(idx == 3){ 51 2 : valParam += 1; 52 : } 53 12 : if(idx == 5){ 54 2 : valParam += 10; 55 : } 56 12 : usleep(SleepTime); 57 : 58 : { 59 12 : counterAccess.lock(); 60 12 : counterAccess.releaseWrite(&valParam); 61 72 : for(int idxTest = 0 ; idxTest < valArray.getSize() ; ++idxTest){ 62 60 : counterAccess.releaseRead(&valArray.getAt(idxTest)); 63 : } 64 12 : counterAccess.unlock(); 65 : } 66 : 67 12 : return idx == 3 || idx == 5; 68 36 : }); 69 : } 70 : 71 2 : runtime.waitAllTasks(); 72 2 : runtime.stopAllThreads(); 73 : 74 2 : UASSERTEEQUAL(val[3], 1); 75 2 : UASSERTEEQUAL(val[5], 10); 76 : } 77 1 : } 78 : 79 1 : void SetTests() { 80 1 : Parent::AddTest(&TestRace::TestBasic, "Basic test for vec type"); 81 1 : } 82 : }; 83 : 84 : // You must do this 85 1 : TestClass(TestRace) 86 : 87 :