23 #include "common_priv.h"
35 : loglevel(
Logger::WARNING), numlivenodes(0), shutdown(false), counter(0)
44 std::cerr << level <<
":" << msg << std::endl;
59 const std::string &servname,
KernelBase *kernel) {
62 if (!kernel) {
throw std::invalid_argument(
"Must have non null Kernel."); }
64 throw std::invalid_argument(
"Cannot create two kernels with the same name");
66 shared_ptr<KernelInfo> hinfo = shared_ptr<KernelInfo>(
new KernelInfo);
68 hinfo->hostname = hostname;
69 hinfo->servname = servname;
70 hinfo->kernel = kernel;
73 hinfo->allowremote =
true;
75 kernelmap.insert(std::make_pair(key, hinfo));
83 if (!kernel) {
throw std::invalid_argument(
"Must have non null Kernel."); }
85 throw std::invalid_argument(
"Cannot create two kernels with the same name");
87 shared_ptr<KernelInfo> hinfo = shared_ptr<KernelInfo>(
new KernelInfo);
89 hinfo->kernel = kernel;
92 hinfo->allowremote =
false;
94 kernelmap.insert(std::make_pair(key, hinfo));
103 NameMap::iterator entry =
kernelnames.find(kernel);
105 throw std::invalid_argument(
"No such kernel");
107 return entry->second;
113 KernelMap::iterator entry =
kernelmap.find(kernelkey);
115 throw std::invalid_argument(
"No such kernel");
117 return entry->second->name;
123 KernelMap::iterator entry =
kernelmap.find(kernelkey);
125 throw std::invalid_argument(
"No such kernel");
127 ASSERT(entry->second->allowremote,
"Kernel does not have remote configured.");
128 hostname = entry->second->hostname;
129 servname = entry->second->servname;
134 KernelMap::iterator entry =
kernelmap.find(kernelkey);
136 throw std::invalid_argument(
"No such kernel");
138 entry->second->dead =
true;
146 NameMap::iterator entry =
kernelnames.find(kernel);
148 KernelMap::iterator hentry =
kernelmap.find(entry->second);
149 if (hentry->second->live) {
150 return entry->second;
161 KernelMap::iterator entry =
kernelmap.find(kernelkey);
163 throw std::invalid_argument(
"No such kernel");
165 entry->second->live =
true;
174 shared_ptr<KernelInfo> hinfo =
kernelmap[kernelkey];
175 kernel = hinfo->kernel;
186 shared_ptr<KernelInfo> hinfo =
kernelmap[kernelkey];
187 kernel = hinfo->kernel;
198 shared_ptr<KernelInfo> hinfo =
kernelmap[kernelkey];
199 kernel = hinfo->kernel;
210 shared_ptr<KernelInfo> hinfo =
kernelmap[kernelkey];
211 kernel = hinfo->kernel;
220 NameMap::iterator nameentry =
nodenames.find(nodename);
223 shared_ptr<NodeInfo> ninfo = shared_ptr<NodeInfo>(
new NodeInfo);
224 ninfo->name = nodename;
225 ninfo->started =
false;
227 ninfo->kernelkey = kernelkey;
229 nodenames.insert(std::make_pair(nodename, key));
230 nodemap.insert(std::make_pair(key, ninfo));
232 throw std::invalid_argument(
"Node " + nodename +
" already exists.");
240 NameMap::iterator nameentry =
nodenames.find(nodename);
242 throw std::invalid_argument(
"No such node");
244 return nameentry->second;
250 NodeMap::iterator entry =
nodemap.find(nodekey);
252 throw std::invalid_argument(
"No such node");
254 return entry->second->name;
260 NodeMap::iterator entry =
nodemap.find(nodekey);
262 throw std::invalid_argument(
"No such node");
264 entry->second->started =
true;
272 NodeMap::iterator entry =
nodemap.find(nodekey);
274 throw std::invalid_argument(
"No such node");
276 entry->second->dead =
true;
286 NameMap::iterator nameentry =
nodenames.find(nodename);
288 NodeMap::iterator entry =
nodemap.find(nameentry->second);
290 if (entry->second->started) {
303 NameMap::iterator nameentry =
nodenames.find(nodename);
305 NodeMap::iterator entry =
nodemap.find(nameentry->second);
307 if (entry->second->dead) {
308 ASSERT(entry->second->started,
"Node died before it started!?");
327 NodeMap::iterator entry =
nodemap.find(nodekey);
329 throw std::invalid_argument(
"No such node");
331 return entry->second->kernelkey;
337 NodeMap::iterator entry =
nodemap.find(nodekey);
339 throw std::invalid_argument(
"No such node");
341 NameMap::iterator portentry = entry->second->readers.find(portname);
342 if (portentry == entry->second->readers.end()) {
344 entry->second->readers.insert(std::make_pair(portname, key));
345 shared_ptr<PortInfo> pinfo = shared_ptr<PortInfo>(
new PortInfo);
346 pinfo->name = portname;
347 pinfo->nodekey = nodekey;
348 pinfo->opposingport = 0;
350 readports.insert(std::make_pair(key, pinfo));
353 return portentry->second;
359 PortMap::iterator entry =
readports.find(portkey);
361 throw std::invalid_argument(
"No such port");
363 return entry->second->nodekey;
374 PortMap::iterator entry =
readports.find(portkey);
376 throw std::invalid_argument(
"No such port");
378 return entry->second->name;
384 NodeMap::iterator entry =
nodemap.find(nodekey);
386 throw std::invalid_argument(
"No such node");
388 NameMap::iterator portentry = entry->second->writers.find(portname);
389 if (portentry == entry->second->writers.end()) {
391 entry->second->writers.insert(std::make_pair(portname, key));
392 shared_ptr<PortInfo> pinfo = shared_ptr<PortInfo>(
new PortInfo);
393 pinfo->name = portname;
394 pinfo->nodekey = nodekey;
395 pinfo->opposingport = 0;
397 writeports.insert(std::make_pair(key, pinfo));
400 return portentry->second;
406 PortMap::iterator entry =
writeports.find(portkey);
408 throw std::invalid_argument(
"No such port");
410 return entry->second->nodekey;
421 PortMap::iterator entry =
writeports.find(portkey);
423 throw std::invalid_argument(
"No such port");
425 return entry->second->name;
431 PortMap::iterator writeentry =
writeports.find(writerkey);
433 throw std::invalid_argument(
"Write port does not exist.");
435 PortMap::iterator readentry =
readports.find(readerkey);
437 throw std::invalid_argument(
"Read port does not exist.");
440 writeentry->second->opposingport = readerkey;
441 readentry->second->opposingport = writerkey;
443 readentry->second->qname = qname;
444 writeentry->second->qname = qname;
450 PortMap::iterator readentry =
readports.find(readerkey);
452 throw std::invalid_argument(
"Read port does not exist.");
454 return readentry->second->opposingport;
460 PortMap::iterator writeentry =
writeports.find(writerkey);
462 throw std::invalid_argument(
"Write port does not exist.");
464 return writeentry->second->opposingport;
476 KernelMap::iterator itr = mapcopy.begin();
477 while (itr != mapcopy.end()) {
478 if (!itr->second->dead) {
479 itr->second->kernel->NotifyTerminate();
Logger object that is used for forwarding log messages.
virtual Key_t GetWriterNode(Key_t portkey)
PthreadCondition & Wait(PthreadMutex &mutex)
std::map< Key_t, shared_ptr< KernelInfo > > KernelMap
virtual void SendCreateReader(Key_t kernelkey, const SimpleQueueAttr &attr)
Tell a given kernel that it needs to create a queue read end.
virtual Key_t GetWriterKernel(Key_t portkey)
virtual void SignalKernelEnd(Key_t kernelkey)
Signal to the Context that the given kernel is dead.
virtual std::string GetWriterName(Key_t portkey)
PthreadCondition & Broadcast(void)
void InternalCheckTerminated()
virtual Key_t GetNodeKey(const std::string &nodename)
virtual Key_t SetupKernel(const std::string &name, const std::string &hostname, const std::string &servname, KernelBase *kernel)
Called by the Kernel when it has successfully set it self up. This gives the Context a way to notify ...
virtual void ConnectEndpoints(Key_t writerkey, Key_t readerkey, const std::string &qname)
Called by the kernel when a queue is created. Note that the endpoints may have been created when the ...
virtual Key_t GetReadersWriter(Key_t readerkey)
virtual void SignalNodeEnd(Key_t nodekey)
Called by the node cleanup routine to indicate that the node has ended.
An implemenation of Context for a local process specific context.
virtual void GetKernelConnectionInfo(Key_t kernelkey, std::string &hostname, std::string &servname)
obtain the connection information for the given kernel
virtual void SignalNodeStart(Key_t nodekey)
Called by the node startup routine to indicate that the node has started.
The exceptions specified for the CPN network.
virtual void SendCreateQueue(Key_t kernelkey, const SimpleQueueAttr &attr)
Tell a given kernel that it needs to create a queue.
PthreadCondition kernellivedead
virtual void RemoteCreateNode(NodeAttr attr)
virtual void RemoteCreateWriter(SimpleQueueAttr attr)
virtual Key_t WaitForKernelStart(const std::string &kernel)
Does not return until the given kernel has started.
virtual Key_t GetWritersReader(Key_t writerkey)
virtual Key_t GetCreateWriterKey(Key_t nodekey, const std::string &portname)
virtual void SendCreateWriter(Key_t kernelkey, const SimpleQueueAttr &attr)
Tell a given kernel that it needs to create a queue write end.
virtual std::string GetReaderName(Key_t portkey)
virtual void WaitForAllNodeEnd()
Convenience method which waits until there are no nodes running. If no node have started then this wi...
virtual int LogLevel() const
virtual void SignalKernelStart(Key_t kernelkey)
Signal to the context that the given kernel has started.
virtual std::string GetNodeName(Key_t nodekey)
virtual void Terminate()
Signal to the Context that the network is terminating. After this call most methods will throw a Shut...
An exception indicating that the Kernel has shut down.
virtual Key_t GetCreateReaderKey(Key_t nodekey, const std::string &portname)
Get the key associated with the given endpoint for the given node. Creates the information if it does...
virtual Key_t GetKernelKey(const std::string &kernel)
Definition of the kernel attributes.
virtual std::string GetKernelName(Key_t kernelkey)
virtual void RemoteCreateQueue(SimpleQueueAttr attr)
virtual bool IsTerminated()
virtual void SendCreateNode(Key_t kernelkey, const NodeAttr &attr)
Tell a given kernel that it needs to create a node.
PthreadCondition nodelivedead
virtual Key_t GetReaderKernel(Key_t portkey)
virtual Key_t GetReaderNode(Key_t portkey)
This is a simplified internal representation of the queue attributes needed to create a queue...
virtual void RemoteCreateReader(SimpleQueueAttr attr)
virtual void WaitForNodeEnd(const std::string &nodename)
Waits for the given node to signal end.
virtual void Log(int level, const std::string &msg)
Log a message to this outputer.
virtual Key_t GetNodeKernel(Key_t nodekey)
virtual Key_t CreateNodeKey(Key_t kernelkey, const std::string &nodename)
Tell the context to allocate a new node key and data structure for a node with nodename which is on k...
virtual Key_t WaitForNodeStart(const std::string &nodename)
Waits until the node starts and returns the key, if the node is already started returns the key...