forked from Dr15Jones/root_serialization
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathEventSleepWaiter.cc
More file actions
76 lines (62 loc) · 2.15 KB
/
EventSleepWaiter.cc
File metadata and controls
76 lines (62 loc) · 2.15 KB
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
#include <vector>
#include <fstream>
#include <thread>
#include <iostream>
#include "EventIdentifier.h"
#include "DataProductRetriever.h"
#include "TaskHolder.h"
#include "WaiterBase.h"
#include "WaiterFactory.h"
namespace cce::tf {
class EventSleepWaiter : public WaiterBase {
public:
EventSleepWaiter(std::vector<double> iEventSleepTimes, std::size_t iNDataProducts):
sleepTimes_(std::move(iEventSleepTimes)),
nDataProducts_{iNDataProducts} {}
void waitAsync(unsigned int iLaneIndex, EventIdentifier const& iEventID, long iEventIndex,
std::vector<DataProductRetriever> const& iRetrievers, unsigned int index,
TaskHolder iCallback) const final {
iCallback.group()->run([iCallback, iEventIndex, this]() {
using namespace std::chrono_literals;
auto index = iEventIndex % sleepTimes_.size();
auto sleep = (sleepTimes_[index]/nDataProducts_)*1us;
//std::cout <<"sleep "<<sleep.count()<<std::endl;
std::this_thread::sleep_for( sleep);
//std::cout <<"awake"<<std::endl;
});
}
private:
std::vector<double> sleepTimes_;
std::size_t nDataProducts_;
};
}
namespace {
using namespace cce::tf;
class Maker : public WaiterMakerBase {
public:
Maker(): WaiterMakerBase("EventSleepWaiter") {}
std::unique_ptr<WaiterBase> create(unsigned int iNLanes, std::size_t iNDataProducts, ConfigurationParameters const& params) const final {
auto filename = params.get<std::string>("filename");
if(not filename) {
std::cout <<"no file name give for EventSleepWaiter"<<std::endl;
return {};
}
std::ifstream file(*filename);
if(not file.is_open()) {
std::cout <<"unable to open file "<<*filename<<" with sleep times";
return {};
}
double value;
std::vector<double> sleepTimes;
while(file >> value) {
sleepTimes.push_back(value);
}
if(sleepTimes.empty()) {
std::cout <<"file "<<*filename<<" contained no event times"<<std::endl;
return {};
}
return std::make_unique<EventSleepWaiter>(std::move(sleepTimes), iNDataProducts);
}
};
Maker s_maker;
}