Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
/*----------------------------------------------------------------------
Test program for edm::TypeID class.
 ----------------------------------------------------------------------*/

#include <cassert>
#include <catch.hpp>
#include "FWCore/Utilities/interface/CallOnceNoWait.h"
#include "FWCore/Utilities/interface/CallNTimesNoWait.h"
#include <thread>
#include <atomic>
#include <vector>

TEST_CASE("CallXNoWait", "[CallXNoWait]") {
  SECTION("onceTest") {
    edm::CallOnceNoWait guard;
    unsigned int iCount = 0;
    guard([&iCount]() { ++iCount; });
    REQUIRE(iCount == 1u);
    guard([&iCount]() { ++iCount; });
    REQUIRE(iCount == 1u);
  }

  SECTION("nTimesTest") {
    edm::CallNTimesNoWait guard{3};
    unsigned int iCount = 0;
    for (unsigned int i = 0; i < 6; ++i) {
      guard([&iCount]() { ++iCount; });
      if (i < 3) {
        REQUIRE(iCount == i + 1);
      } else {
        REQUIRE(iCount == 3u);
      }
    }
  }

  SECTION("onceThreadedTest") {
    edm::CallOnceNoWait guard;
    std::atomic<unsigned int> iCount{0};
    std::vector<std::thread> threads;
    std::atomic<bool> start{false};
    for (unsigned int i = 0; i < 4; ++i) {
      threads.emplace_back([&guard, &iCount, &start]() {
        while (!start) {
        }
        guard([&iCount]() { ++iCount; });
      });
    }
    REQUIRE(iCount == 0u);
    start = true;
    for (auto& t : threads) {
      t.join();
    }
    REQUIRE(iCount == 1u);
  }

  SECTION("nTimesThreadedTest") {
    const unsigned short kMaxTimes = 3;
    edm::CallNTimesNoWait guard(kMaxTimes);
    std::atomic<unsigned int> iCount{0};
    std::vector<std::thread> threads;
    std::atomic<bool> start{false};
    for (unsigned int i = 0; i < 2 * kMaxTimes; ++i) {
      threads.emplace_back([&guard, &iCount, &start]() {
        while (!start) {
        }
        guard([&iCount]() { ++iCount; });
      });
    }
    REQUIRE(iCount == 0u);
    start = true;
    for (auto& t : threads) {
      t.join();
    }
    REQUIRE(iCount == kMaxTimes);
  }
}