void
  DdsDomainParticipantRepository::remove(std::string const& name)
  throw(ENotRegistered)
  {
    DDS::DomainParticipantFactory * dpf =
      DDS::DomainParticipantFactory::get_instance();
    InstanceMap::iterator i = instances_.find(name);
    if (i != instances_.end()) {
      DDS::DomainParticipant * p = dynamic_cast<DDS::DomainParticipant *>(i->second);
      DDS::ReturnCode_t rc = p->delete_contained_entities();
      if (rc != DDS::RETCODE_OK) {
        MIRO_LOG_OSTR(LL_ERROR, "Error deleting contained entities: " << DdsSupport::getError(rc));
      }

      rc = dpf->delete_participant(p);
      if (rc != DDS_RETCODE_OK) {
        MIRO_LOG_OSTR(LL_ERROR, "Error deleting DDS domain particpant: " << DdsSupport::getError(rc));
      }
      instances_.erase(i);
      if (instances_.size() == 0)
        SingletonType::ACE_Singleton_Type::close();
      return;
    }
    throw ENotRegistered(name);
  }
  // specializations
  DdsDomainParticipantRepository::~DdsDomainParticipantRepository() throw()
  {
    MIRO_LOG_DTOR("DdsDomainParticipantRepository");

    DDS::DomainParticipantFactory * dpf =
      DDS::DomainParticipantFactory::get_instance();
    // just to make sure, the repository should actually be empty at this point.
    InstanceMap::iterator first, last = instances_.end();
    for (first = instances_.begin(); first != last; ++first) {
      DDS::DomainParticipant * p = dynamic_cast<DDS::DomainParticipant *>(first->second);
      DDS::ReturnCode_t rc = p->delete_contained_entities();
      if (rc != DDS::RETCODE_OK) {
        MIRO_LOG_OSTR(LL_ERROR, "Error deleting contained entities: " << DdsSupport::getError(rc));
      }

      rc = dpf->delete_participant(dynamic_cast<DDS::DomainParticipant *>(p));
      if (rc != DDS_RETCODE_OK) {
        MIRO_LOG_OSTR(LL_ERROR, "Error deleting DDS domain particpant: " << DdsSupport::getError(rc));
      }
    }
  }