File: test_workers.cpp

package info (click to toggle)
taskflow 3.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 45,948 kB
  • sloc: cpp: 39,058; xml: 35,572; python: 12,935; javascript: 1,732; makefile: 59; sh: 16
file content (82 lines) | stat: -rw-r--r-- 1,835 bytes parent folder | download
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
77
78
79
80
81
82
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN

#include <doctest.h>
#include <taskflow/taskflow.hpp>

class CustomWorkerBehavior : public tf::WorkerInterface {

  public:

  CustomWorkerBehavior(std::atomic<size_t>& counter, std::vector<size_t>& ids) : 
    _counter {counter},
    _ids     {ids} {
  }
  
  void scheduler_prologue(tf::Worker& wv) override {
    _counter++;

    std::scoped_lock lock(_mutex);
    _ids.push_back(wv.id());
  }

  void scheduler_epilogue(tf::Worker&, std::exception_ptr) override {
    _counter++;
  }

  std::atomic<size_t>& _counter;
  std::vector<size_t>& _ids;

  std::mutex _mutex;

};

void worker_interface_basics(unsigned W) {

  std::atomic<size_t> counter{0};
  std::vector<size_t> ids;

  {
    tf::Executor executor(W, tf::make_worker_interface<CustomWorkerBehavior>(counter, ids));
  }

  REQUIRE(counter == W*2);
  REQUIRE(ids.size() == W);

  std::sort(ids.begin(), ids.end(), std::less<int>{});

  for(size_t i=0; i<W; i++) {
    REQUIRE(ids[i] == i);
  }
}

TEST_CASE("WorkerInterface.Basics.1thread" * doctest::timeout(300)) {
  worker_interface_basics(1);
}

TEST_CASE("WorkerInterface.Basics.2threads" * doctest::timeout(300)) {
  worker_interface_basics(2);
}

TEST_CASE("WorkerInterface.Basics.3threads" * doctest::timeout(300)) {
  worker_interface_basics(3);
}

TEST_CASE("WorkerInterface.Basics.4threads" * doctest::timeout(300)) {
  worker_interface_basics(4);
}

TEST_CASE("WorkerInterface.Basics.5threads" * doctest::timeout(300)) {
  worker_interface_basics(5);
}

TEST_CASE("WorkerInterface.Basics.6threads" * doctest::timeout(300)) {
  worker_interface_basics(6);
}

TEST_CASE("WorkerInterface.Basics.7threads" * doctest::timeout(300)) {
  worker_interface_basics(7);
}

TEST_CASE("WorkerInterface.Basics.8threads" * doctest::timeout(300)) {
  worker_interface_basics(8);
}