CMS 3D CMS Logo

ControllerChannel.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FWCore/SharedMemory
4 // Class : ControllerChannel
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author: Chris Jones
10 // Created: 21/01/2020
11 //
12 
13 // system include files
14 #include <cassert>
15 
16 // user include files
19 
20 //
21 // constants, enums and typedefs
22 //
23 using namespace edm::shared_memory;
24 using namespace boost::interprocess;
25 
26 //
27 // static data member definitions
28 //
29 
30 //
31 // constructors and destructor
32 //
33 
34 ControllerChannel::ControllerChannel(std::string const& iName, int id, unsigned int iMaxWaitInSeconds)
35  : id_{id},
36  maxWaitInSeconds_{iMaxWaitInSeconds},
37  smName_{uniqueName(iName)},
38  managed_sm_{open_or_create, smName_.c_str(), 1024},
39  toWorkerBufferInfo_{bufferInfo(channel_names::kToWorkerBufferInfo, managed_sm_)},
40  fromWorkerBufferInfo_{bufferInfo(channel_names::kFromWorkerBufferInfo, managed_sm_)},
41  mutex_{open_or_create, uniqueName(channel_names::kMutex).c_str()},
42  cndFromMain_{open_or_create, uniqueName(channel_names::kConditionFromMain).c_str()},
43  cndToMain_{open_or_create, uniqueName(channel_names::kConditionToMain).c_str()} {
44  managed_sm_.destroy<bool>(channel_names::kStop);
45  stop_ = managed_sm_.construct<bool>(channel_names::kStop)(false);
46  assert(stop_);
47  keepEvent_ = managed_sm_.construct<bool>(channel_names::kKeepEvent)(true);
48  assert(keepEvent_);
49 
50  managed_sm_.destroy<edm::Transition>(channel_names::kTransitionType);
51  transitionType_ =
53  assert(transitionType_);
54 
55  managed_sm_.destroy<unsigned long long>(channel_names::kTransitionID);
56  transitionID_ = managed_sm_.construct<unsigned long long>(channel_names::kTransitionID)(0);
57  assert(transitionID_);
58 }
59 
62  managed_sm_.destroy<bool>(channel_names::kStop);
63  managed_sm_.destroy<unsigned int>(channel_names::kTransitionType);
64  managed_sm_.destroy<unsigned long long>(channel_names::kTransitionID);
67 
71 }
72 
73 //
74 // member functions
75 //
77  auto pid = getpid();
78  iBase += std::to_string(pid);
79  iBase += "_";
80  iBase += std::to_string(id_);
81 
82  return iBase;
83 }
84 
85 bool ControllerChannel::wait(scoped_lock<named_mutex>& lock, edm::Transition iTrans, unsigned long long iTransID) {
86  *transitionType_ = iTrans;
87  *transitionID_ = iTransID;
88  //std::cout << id_ << " notifying" << std::endl;
89  cndFromMain_.notify_all();
90 
91  //std::cout << id_ << " waiting" << std::endl;
92  using namespace boost::posix_time;
93  if (not cndToMain_.timed_wait(lock, microsec_clock::universal_time() + seconds(maxWaitInSeconds_))) {
94  //std::cout << id_ << " waiting FAILED" << std::endl;
95  return false;
96  }
97  return true;
98 }
99 
100 //
101 // const member functions
102 //
103 
104 //
105 // static member functions
106 //
107 BufferInfo* ControllerChannel::bufferInfo(const char* iWhich, managed_shared_memory& mem) {
108  mem.destroy<BufferInfo>(iWhich);
109  BufferInfo* v = mem.construct<BufferInfo>(iWhich)();
110  return v;
111 }
edm::shared_memory::ControllerChannel::cndToMain_
boost::interprocess::named_condition cndToMain_
Definition: ControllerChannel.h:127
edm::shared_memory::ControllerChannel::transitionType_
edm::Transition * transitionType_
Definition: ControllerChannel.h:129
edm::shared_memory::ControllerChannel::managed_sm_
boost::interprocess::managed_shared_memory managed_sm_
Definition: ControllerChannel.h:120
edm::shared_memory::channel_names::kToWorkerBufferInfo
constexpr char const *const kToWorkerBufferInfo
Definition: channel_names.h:29
edm::shared_memory::channel_names::kFromWorkerBufferInfo
constexpr char const *const kFromWorkerBufferInfo
Definition: channel_names.h:30
channel_names.h
edm::shared_memory::ControllerChannel::uniqueName
std::string uniqueName(std::string iBase) const
Definition: ControllerChannel.cc:76
cms::cuda::assert
assert(be >=bs)
findQualityFiles.v
v
Definition: findQualityFiles.py:179
edm::shared_memory::channel_names::kKeepEvent
constexpr char const *const kKeepEvent
Definition: channel_names.h:35
mem
uint16_t mem[nChs][nEvts]
Definition: recycleTccEmu.cc:13
edm::shared_memory::channel_names::kConditionToMain
constexpr char const *const kConditionToMain
Definition: channel_names.h:33
edm::shared_memory::ControllerChannel::transitionID_
unsigned long long * transitionID_
Definition: ControllerChannel.h:130
seconds
double seconds()
edm::shared_memory::BufferInfo
Definition: BufferInfo.h:27
edm::shared_memory::ControllerChannel::cndFromMain_
boost::interprocess::named_condition cndFromMain_
Definition: ControllerChannel.h:125
edm::Transition::NumberOfTransitions
edm::shared_memory::ControllerChannel::wait
bool wait(boost::interprocess::scoped_lock< boost::interprocess::named_mutex > &lock, edm::Transition iTrans, unsigned long long iTransID)
Definition: ControllerChannel.cc:85
edm::shared_memory::channel_names::kTransitionID
constexpr char const *const kTransitionID
Definition: channel_names.h:37
edm::shared_memory::ControllerChannel::bufferInfo
static BufferInfo * bufferInfo(const char *iWhich, boost::interprocess::managed_shared_memory &mem)
Definition: ControllerChannel.cc:107
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::shared_memory::ControllerChannel::id_
int id_
Definition: ControllerChannel.h:117
edm::shared_memory::channel_names::kStop
constexpr char const *const kStop
Definition: channel_names.h:34
ControllerChannel.h
edm::shared_memory::ControllerChannel::~ControllerChannel
~ControllerChannel()
Definition: ControllerChannel.cc:60
edm::Transition
Transition
Definition: Transition.h:12
CommonMethods.lock
def lock()
Definition: CommonMethods.py:82
edm::shared_memory::ControllerChannel::ControllerChannel
ControllerChannel(std::string const &iName, int iID, unsigned int iMaxWaitInSeconds)
Definition: ControllerChannel.cc:34
edm::shared_memory
Definition: buffer_names.h:27
edm::shared_memory::channel_names::kConditionFromMain
constexpr char const *const kConditionFromMain
Definition: channel_names.h:32
edm::shared_memory::channel_names::kMutex
constexpr char const *const kMutex
Definition: channel_names.h:31
MatrixUtil.remove
def remove(d, key, TELL=False)
Definition: MatrixUtil.py:219
edm::shared_memory::ControllerChannel::maxWaitInSeconds_
unsigned int maxWaitInSeconds_
Definition: ControllerChannel.h:118
edm::shared_memory::channel_names::kTransitionType
constexpr char const *const kTransitionType
Definition: channel_names.h:36