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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#include "FWCore/PluginManager/interface/ProblemTracker.h"
#include "FWCore/ServiceRegistry/test/stubs/DummyServiceE0.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ServiceRegistry/interface/ServicesManager.h"
#include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
#include "FWCore/ServiceRegistry/interface/ServiceWrapper.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "FWCore/ServiceRegistry/interface/ServiceToken.h"
#include <cstdlib>
#include <vector>
#include <memory>
#include <iostream>
class TestServicesManagerOrder {
public:
static edm::ServiceToken makeToken(std::shared_ptr<edm::serviceregistry::ServicesManager> iManager) {
return edm::ServiceToken(iManager);
}
};
int main() try {
using namespace edm::serviceregistry;
// We must initialize the plug-in manager first
edm::AssertHandler ah;
// These services check the order their constructor, postBeginJob,
// postEndJob, and destructor are called and if they are not
// called in the correct order they will abort
typedef testserviceregistry::DummyServiceE0 Service0;
typedef testserviceregistry::DummyServiceA1 Service1;
typedef testserviceregistry::DummyServiceD2 Service2;
typedef testserviceregistry::DummyServiceB3 Service3;
typedef testserviceregistry::DummyServiceC4 Service4;
// Build the services in a manner similar to the way the are constructed
// in a cmsRun job. Build one service directly, then three based
// on parameter sets, then another one directly. ServiceB3
// includes an explicit dependence on ServiceD2 so build on
// demand is also tested.
std::vector<edm::ParameterSet> vps;
auto legacy = std::make_shared<ServicesManager>(vps);
edm::ActivityRegistry ar;
edm::ParameterSet pset;
legacy->put(std::make_shared<ServiceWrapper<Service0>>(std::make_unique<Service0>(pset, ar)));
legacy->copySlotsFrom(ar);
edm::ServiceToken legacyToken = TestServicesManagerOrder::makeToken(legacy);
std::vector<edm::ParameterSet> vps1;
edm::ParameterSet ps1;
std::string typeName1("DummyServiceA1");
ps1.addParameter("@service_type", typeName1);
vps1.push_back(ps1);
// The next two are intentionally swapped to test build
// on demand feature. DummyServiceB3 depends on DummyServiceD2
// so they should end up getting built in the reverse of the
// order specified here.
edm::ParameterSet ps3;
std::string typeName3("DummyServiceB3");
ps3.addParameter("@service_type", typeName3);
vps1.push_back(ps3);
edm::ParameterSet ps2;
std::string typeName2("DummyServiceD2");
ps2.addParameter("@service_type", typeName2);
vps1.push_back(ps2);
auto legacy2 = std::make_shared<ServicesManager>(legacyToken, kTokenOverrides, vps1);
edm::ServiceToken legacyToken2 = TestServicesManagerOrder::makeToken(legacy2);
ServicesManager sm(legacyToken2, kOverlapIsError, vps);
edm::ActivityRegistry ar4;
edm::ParameterSet pset4;
sm.put(std::make_shared<ServiceWrapper<Service4>>(std::make_unique<Service4>(pset4, ar4)));
sm.copySlotsFrom(ar4);
edm::ActivityRegistry actReg;
sm.connectTo(actReg);
actReg.postBeginJobSignal_();
actReg.postEndJobSignal_();
return 0;
} catch (cms::Exception const& e) {
std::cerr << e.explainSelf() << std::endl;
return 1;
} catch (std::exception const& e) {
std::cerr << e.what() << std::endl;
return 1;
}
|