LCOV - code coverage report
Current view: top level - UTests - testRace.cpp (source / functions) Hit Total Coverage
Test: Coverage example Lines: 40 41 97.6 %
Date: 2021-12-02 17:21:05 Functions: 5 6 83.3 %

          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             : 

Generated by: LCOV version 1.14