~ubuntu-branches/debian/sid/nordugrid-arc/sid

« back to all changes in this revision

Viewing changes to src/hed/libs/message/MCCLoader.cpp

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2012-12-13 16:41:31 UTC
  • mfrom: (1.1.5)
  • Revision ID: package-import@ubuntu.com-20121213164131-0fumka0jar8mxm07
Tags: 2.0.1-1
* 2.0.1 Release
* Drop patches accepted upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
    // self-destruction or break links first or use semaphors in
22
22
    // MCC destructors
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();
 
28
    }
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();
33
38
    }
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 
 
42
    // processing left.
 
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);
 
47
      if(mcc) delete mcc;
 
48
    }
 
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;
40
55
    }
 
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;
 
61
    }
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;
46
67
    }
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;
52
 
    }
 
68
    // Last are SecHandlers because now there are no objects which 
 
69
    // could use them.
53
70
    for(sechandler_container_t::iterator sechandler_i = sechandlers_.begin();
54
71
        sechandler_i != sechandlers_.end();
55
72
        sechandler_i = sechandlers_.begin()) {
168
185
    }
169
186
    std::string id = cn.Attribute("id");
170
187
    if(id.empty()) {
171
 
      logger.msg(ERROR, "Component has no id attribute defined");
 
188
      logger.msg(ERROR, "Component has no ID attribute defined");
172
189
      return NULL;
173
190
    }
174
191
    MCCPluginArgument arg(&cfg_,context_);
207
224
        if(!cnn) break;
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;
213
230
          if(oldmcc) {
279
296
          if(!cnn) break;
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);
284
301
            success = false;
285
302
            continue;
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");
299
316
          success = false;
300
317
          continue;
301
318
        }
302
319
        std::string id = cn.Attribute("id");
303
320
        if(id.empty()) {
304
 
          logger.msg(ERROR, "Service has no id attribute defined");
 
321
          logger.msg(ERROR, "Service has no ID attribute defined");
305
322
          success = false;
306
323
          continue;
307
324
        }
345
362
    // 2nd stage - making links between elements.
346
363
 
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);
362
382
          continue;
363
383
        }
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);
403
425
          continue;
404
426
        }
405
427
        service_container_t::iterator service_l = services_.find(id);
429
451
    }
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);
 
459
    }
432
460
    return success;
433
461
  }
434
462