21
21
// self-destruction or break links first or use semaphors in
23
23
// Unlink all objects
24
for(mcc_container_t::iterator mcc_i = mccs_unlinked_.begin();
25
mcc_i != mccs_unlinked_.end(); ++mcc_i) {
26
MCC* mcc = mcc_i->second;
27
if(mcc) mcc->Unlink();
24
29
for(mcc_container_t::iterator mcc_i = mccs_.begin();
25
30
mcc_i != mccs_.end(); ++mcc_i) {
26
31
MCC* mcc = mcc_i->second;
32
37
if(plexer) plexer->Unlink();
34
39
// Destroy all objects
40
// First unlinked MCC are destroyed because they handle spawned threads
41
// processing request. After they are destroyed there should be no
43
for(mcc_container_t::iterator mcc_i = mccs_unlinked_.begin();
44
mcc_i != mccs_unlinked_.end(); mcc_i = mccs_unlinked_.begin()) {
45
MCC* mcc = mcc_i->second;
46
mccs_unlinked_.erase(mcc_i);
49
// Then ordinary MCCs and other objects
35
50
for(mcc_container_t::iterator mcc_i = mccs_.begin();
36
51
mcc_i != mccs_.end(); mcc_i = mccs_.begin()) {
37
52
MCC* mcc = mcc_i->second;
38
53
mccs_.erase(mcc_i);
39
54
if(mcc) delete mcc;
56
for(plexer_container_t::iterator plexer_i = plexers_.begin();
57
plexer_i != plexers_.end(); plexer_i = plexers_.begin()) {
58
Plexer* plexer = plexer_i->second;
59
plexers_.erase(plexer_i);
60
if(plexer) delete plexer;
41
62
for(service_container_t::iterator service_i = services_.begin();
42
63
service_i != services_.end(); service_i = services_.begin()) {
43
64
Service* service = service_i->second;
44
65
services_.erase(service_i);
45
66
if(service) delete service;
47
for(plexer_container_t::iterator plexer_i = plexers_.begin();
48
plexer_i != plexers_.end(); plexer_i = plexers_.begin()) {
49
Plexer* plexer = plexer_i->second;
50
plexers_.erase(plexer_i);
51
if(plexer) delete plexer;
68
// Last are SecHandlers because now there are no objects which
53
70
for(sechandler_container_t::iterator sechandler_i = sechandlers_.begin();
54
71
sechandler_i != sechandlers_.end();
55
72
sechandler_i = sechandlers_.begin()) {
169
186
std::string id = cn.Attribute("id");
171
logger.msg(ERROR, "Component has no id attribute defined");
188
logger.msg(ERROR, "Component has no ID attribute defined");
174
191
MCCPluginArgument arg(&cfg_,context_);
208
225
std::string nid = cnn.Attribute("id");
209
226
if(nid.empty()) {
210
logger.msg(ERROR, "Component's %s(%s) next has no id "
227
logger.msg(ERROR, "Component's %s(%s) next has no ID "
211
228
"attribute defined", name, id);
212
229
if(plugin) delete plugin;
280
297
std::string nid = cnn.Attribute("id");
281
298
if(nid.empty()) {
282
logger.msg(ERROR, "Plexer's (%s) next has no id "
299
logger.msg(ERROR, "Plexer's (%s) next has no ID "
283
300
"attribute defined", id);
295
312
if(MatchXMLName(cn, "Service")) {
296
313
std::string name = cn.Attribute("name");
297
314
if(name.empty()) {
298
logger.msg(ERROR, "Service has no name attribute defined");
315
logger.msg(ERROR, "Service has no Name attribute defined");
302
319
std::string id = cn.Attribute("id");
304
logger.msg(ERROR, "Service has no id attribute defined");
321
logger.msg(ERROR, "Service has no ID attribute defined");
345
362
// 2nd stage - making links between elements.
347
364
// Making links from MCCs
365
mccs_unlinked_ = mccs_;
348
366
for(mcc_connectors_t::iterator mcc = mcc_connectors->begin();
349
367
mcc != mcc_connectors->end(); ++mcc) {
350
368
for(std::map<std::string, std::string>::iterator next =
359
377
logger.msg(DEBUG, "Linking MCC %s(%s) to MCC (%s) under %s",
360
378
mcc->name, mcc->mcc->first, id, label);
361
379
mcc->nexts.erase(next);
380
mcc_container_t::iterator mcc_ul = mccs_unlinked_.find(id);
381
if(mcc_ul != mccs_unlinked_.end()) mccs_unlinked_.erase(mcc_ul);
364
384
service_container_t::iterator service_l = services_.find(id);
400
420
logger.msg(INFO, "Linking Plexer %s to MCC (%s) under %s",
401
421
plexer->plexer->first, id, label);
402
422
plexer->nexts.erase(next);
423
mcc_container_t::iterator mcc_ul = mccs_unlinked_.find(id);
424
if(mcc_ul != mccs_unlinked_.end()) mccs_unlinked_.erase(mcc_ul);
405
427
service_container_t::iterator service_l = services_.find(id);
430
452
if(mcc_connectors) delete mcc_connectors;
431
453
if(plexer_connectors) delete plexer_connectors;
454
// Move all unlinked MCCs to dedicated container
455
for(mcc_container_t::iterator mcc = mccs_unlinked_.begin();
456
mcc != mccs_unlinked_.end();++mcc) {
457
mcc_container_t::iterator mcc_l = mccs_.find(mcc->first);
458
if(mcc_l != mccs_.end()) mccs_.erase(mcc_l);