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},
41  mutex_{open_or_create, uniqueName(channel_names::kMutex).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 
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 }
constexpr char const *const kConditionToMain
Definition: channel_names.h:33
boost::interprocess::named_condition cndToMain_
double seconds()
constexpr char const *const kConditionFromMain
Definition: channel_names.h:32
constexpr char const *const kStop
Definition: channel_names.h:34
constexpr char const *const kTransitionType
Definition: channel_names.h:36
boost::interprocess::named_mutex mutex_
constexpr char const *const kMutex
Definition: channel_names.h:31
bool wait(boost::interprocess::scoped_lock< boost::interprocess::named_mutex > &lock, edm::Transition iTrans, unsigned long long iTransID)
Transition
Definition: Transition.h:12
constexpr char const *const kKeepEvent
Definition: channel_names.h:35
uint16_t mem[nChs][nEvts]
boost::interprocess::named_condition cndFromMain_
constexpr char const *const kFromWorkerBufferInfo
Definition: channel_names.h:30
ControllerChannel(std::string const &iName, int iID, unsigned int iMaxWaitInSeconds)
def remove(d, key, TELL=False)
Definition: MatrixUtil.py:212
constexpr char const *const kTransitionID
Definition: channel_names.h:37
constexpr char const *const kToWorkerBufferInfo
Definition: channel_names.h:29
boost::interprocess::managed_shared_memory managed_sm_
std::string uniqueName(std::string iBase) const
static BufferInfo * bufferInfo(const char *iWhich, boost::interprocess::managed_shared_memory &mem)