OpenDDS::DCPS::OwnershipManager Class Reference

#include <OwnershipManager.h>

List of all members.

Public Member Functions

typedef OPENDDS_VECTOR (DataReaderImpl *) ReaderVec
typedef OPENDDS_MAP (OPENDDS_STRING, InstanceMap) TypeInstanceMap
typedef OPENDDS_VECTOR (WriterInfo) WriterInfos
typedef OPENDDS_VECTOR (InstanceState *) InstanceStateVec
typedef OPENDDS_MAP (::DDS::InstanceHandle_t, OwnershipWriterInfos) InstanceOwnershipWriterInfos
 OwnershipManager ()
 ~OwnershipManager ()
int instance_lock_acquire ()
int instance_lock_release ()
void set_instance_map (const char *type_name, void *instance_map, DataReaderImpl *reader)
void * get_instance_map (const char *type_name, DataReaderImpl *reader)
void unregister_reader (const char *type_name, DataReaderImpl *reader)
void remove_writer (const PublicationId &pub_id)
void remove_writers (const ::DDS::InstanceHandle_t &instance_handle)
bool remove_writer (const ::DDS::InstanceHandle_t &instance_handle, const PublicationId &pub_id)
bool is_owner (const ::DDS::InstanceHandle_t &instance_handle, const PublicationId &pub_id)
bool select_owner (const ::DDS::InstanceHandle_t &instance_handle, const PublicationId &pub_id, const CORBA::Long &ownership_strength, InstanceState *instance_state)
void remove_owner (const ::DDS::InstanceHandle_t &instance_handle)
void remove_instance (InstanceState *instance_state)
void update_ownership_strength (const PublicationId &pub_id, const CORBA::Long &ownership_strength)

Private Member Functions

bool remove_writer (const ::DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, const PublicationId &pub_id)
void remove_owner (const ::DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, bool sort)
void remove_candidate (OwnershipWriterInfos &infos, const PublicationId &pub_id)
void broadcast_new_owner (const ::DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, const PublicationId &owner)

Private Attributes

ACE_Thread_Mutex instance_lock_
TypeInstanceMap type_instance_map_
InstanceOwnershipWriterInfos instance_ownership_infos_

Classes

struct  InstanceMap
struct  OwnershipWriterInfos
struct  WriterInfo


Detailed Description

Definition at line 29 of file OwnershipManager.h.


Constructor & Destructor Documentation

OpenDDS::DCPS::OwnershipManager::OwnershipManager (  ) 

Definition at line 36 of file OwnershipManager.cpp.

00037 {
00038 }

OpenDDS::DCPS::OwnershipManager::~OwnershipManager (  ) 

Definition at line 41 of file OwnershipManager.cpp.

References type_instance_map_.

00042 {
00043   // The type->instance should be empty if unregister instance are performed
00044   // by all readers, but in case the instance not unregistered for some reason,
00045   // an error will be logged.
00046   TypeInstanceMap::iterator const the_end = type_instance_map_.end ();
00047   TypeInstanceMap::iterator iter = type_instance_map_.begin ();
00048   while (iter != the_end)
00049   {
00050     // There is no way to pass the instance map to concrete datareader
00051     // to delete, so it will be leaked.
00052     // delete iter->second.map_;
00053     ACE_DEBUG((LM_WARNING,
00054       ACE_TEXT("(%P|%t) OwnershipManager::~OwnershipManager ")
00055       ACE_TEXT("- non-empty type_instance_map_\n")));
00056     ++ iter;
00057   }
00058 
00059   type_instance_map_.clear ();
00060 }


Member Function Documentation

void OpenDDS::DCPS::OwnershipManager::broadcast_new_owner ( const ::DDS::InstanceHandle_t instance_handle,
OwnershipWriterInfos infos,
const PublicationId owner 
) [private]

Definition at line 428 of file OwnershipManager.cpp.

References OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::candidates_, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::instance_states_, OPENDDS_STRING, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, and OpenDDS::DCPS::OwnershipManager::WriterInfo::ownership_strength_.

Referenced by remove_owner(), and select_owner().

00431 {
00432   if (DCPS_debug_level >= 1) {
00433     // This may not be an error since it could happen that the sample
00434     // is delivered to the datareader after the write is dis-associated
00435     // with this datareader.
00436     GuidConverter writer_converter(owner);
00437     ACE_DEBUG((LM_DEBUG,
00438       ACE_TEXT("(%P|%t) OwnershipManager::broadcast_new_owner: ")
00439       ACE_TEXT("owner writer %C, instance handle %d strength %d num of candidates %d\n"),
00440       OPENDDS_STRING(writer_converter).c_str(),
00441       instance_handle, infos.owner_.ownership_strength_, infos.candidates_.size()));
00442   }
00443 
00444   InstanceStateVec::iterator const the_end = infos.instance_states_.end();
00445   for (InstanceStateVec::iterator iter = infos.instance_states_.begin ();
00446     iter != the_end; ++iter) {
00447     (*iter)->set_owner (owner);
00448   }
00449 }

void * OpenDDS::DCPS::OwnershipManager::get_instance_map ( const char *  type_name,
DataReaderImpl reader 
)

Accesor of the instance map for provided type. It is called once for each new instance in a datareader.

Definition at line 76 of file OwnershipManager.cpp.

References OpenDDS::DCPS::find(), OpenDDS::DCPS::OwnershipManager::InstanceMap::map_, OpenDDS::DCPS::OwnershipManager::InstanceMap::readers_, and type_instance_map_.

00078 {
00079   InstanceMap* instance = 0;
00080   if (0 != find(type_instance_map_, type_name, instance)) {
00081     return 0;
00082   }
00083 
00084   instance->readers_.push_back (reader);
00085   return instance->map_;
00086 }

int OpenDDS::DCPS::OwnershipManager::instance_lock_acquire (  ) 

Acquire/release lock for type instance map. The following functions are synchnorized by instance_lock_.

Definition at line 64 of file OwnershipManager.cpp.

References instance_lock_.

00065 {
00066   return this->instance_lock_.acquire ();
00067 }

int OpenDDS::DCPS::OwnershipManager::instance_lock_release (  ) 

Definition at line 70 of file OwnershipManager.cpp.

References instance_lock_.

00071 {
00072   return this->instance_lock_.release ();
00073 }

bool OpenDDS::DCPS::OwnershipManager::is_owner ( const ::DDS::InstanceHandle_t instance_handle,
const PublicationId pub_id 
)

Return true if the provide writer is the owner of the instance.

Definition at line 211 of file OwnershipManager.cpp.

References instance_ownership_infos_.

00213 {
00214   ACE_GUARD_RETURN (ACE_Thread_Mutex,
00215                     guard,
00216                     this->instance_lock_,
00217                     false);
00218 
00219   InstanceOwnershipWriterInfos::iterator const the_end = instance_ownership_infos_.end ();
00220 
00221   InstanceOwnershipWriterInfos::iterator iter
00222     = instance_ownership_infos_.find (instance_handle);
00223   if (iter != the_end) {
00224     return iter->second.owner_.pub_id_ == pub_id;
00225   }
00226 
00227   return false;
00228 }

typedef OpenDDS::DCPS::OwnershipManager::OPENDDS_MAP ( ::DDS::InstanceHandle_t  ,
OwnershipWriterInfos   
)

typedef OpenDDS::DCPS::OwnershipManager::OPENDDS_MAP ( OPENDDS_STRING  ,
InstanceMap   
)

typedef OpenDDS::DCPS::OwnershipManager::OPENDDS_VECTOR ( InstanceState  ) 

typedef OpenDDS::DCPS::OwnershipManager::OPENDDS_VECTOR ( WriterInfo   ) 

typedef OpenDDS::DCPS::OwnershipManager::OPENDDS_VECTOR ( DataReaderImpl  ) 

void OpenDDS::DCPS::OwnershipManager::remove_candidate ( OwnershipWriterInfos infos,
const PublicationId pub_id 
) [private]

Definition at line 297 of file OwnershipManager.cpp.

References OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::candidates_.

Referenced by remove_writer().

00298 {
00299   if (! infos.candidates_.empty ()) {
00300     WriterInfos::iterator const the_end = infos.candidates_.end();
00301 
00302     WriterInfos::iterator found_candidate = the_end;
00303     // Supplied writer is not an owner, check if it exists in candicate list.If not,
00304     // add it to the candidate list and sort the list.
00305     for (WriterInfos::iterator iter = infos.candidates_.begin ();
00306       iter != the_end; ++iter) {
00307 
00308       if (iter->pub_id_ == pub_id) {
00309         found_candidate = iter;
00310         break;
00311       }
00312     }
00313 
00314     if (found_candidate != the_end) {
00315       infos.candidates_.erase (found_candidate);
00316     }
00317   }
00318 }

void OpenDDS::DCPS::OwnershipManager::remove_instance ( InstanceState instance_state  ) 

Definition at line 154 of file OwnershipManager.cpp.

References OpenDDS::DCPS::InstanceState::instance_handle(), and instance_ownership_infos_.

Referenced by OpenDDS::DCPS::InstanceState::~InstanceState().

00155 {
00156   ACE_GUARD(ACE_Thread_Mutex, guard, this->instance_lock_);
00157   DDS::InstanceHandle_t ih = instance_state->instance_handle();
00158   InstanceOwnershipWriterInfos::iterator i = instance_ownership_infos_.find(ih);
00159   if (i != instance_ownership_infos_.end()) {
00160     for (size_t j = 0; j < i->second.instance_states_.size(); ++j) {
00161       if (i->second.instance_states_[j] == instance_state) {
00162         i->second.instance_states_.erase(i->second.instance_states_.begin() + j);
00163         break;
00164       }
00165     }
00166   }
00167 }

void OpenDDS::DCPS::OwnershipManager::remove_owner ( const ::DDS::InstanceHandle_t instance_handle,
OwnershipWriterInfos infos,
bool  sort 
) [private]

Definition at line 271 of file OwnershipManager.cpp.

References broadcast_new_owner(), OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::candidates_, Util::DescendingOwnershipStrengthSort(), OpenDDS::DCPS::GUID_UNKNOWN, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, and OpenDDS::DCPS::OwnershipManager::WriterInfo::pub_id_.

00274 {
00275   //change owner
00276   PublicationId new_owner(GUID_UNKNOWN);
00277   if (infos.candidates_.empty ()) {
00278     infos.owner_ = WriterInfo();
00279   }
00280   else {
00281     if (sort) {
00282       std::sort (infos.candidates_.begin(), infos.candidates_.end(),
00283                  ::Util::DescendingOwnershipStrengthSort);
00284     }
00285 
00286     WriterInfos::iterator begin = infos.candidates_.begin();
00287     infos.owner_ = *begin;
00288     infos.candidates_.erase (begin);
00289     new_owner = infos.owner_.pub_id_;
00290   }
00291 
00292   this->broadcast_new_owner (instance_handle, infos, new_owner);
00293 }

void OpenDDS::DCPS::OwnershipManager::remove_owner ( const ::DDS::InstanceHandle_t instance_handle  ) 

Remove an owner of the specified instance.

Definition at line 452 of file OwnershipManager.cpp.

References instance_ownership_infos_.

Referenced by remove_writer(), and select_owner().

00453 {
00454   ACE_GUARD(ACE_Thread_Mutex,
00455             guard,
00456             this->instance_lock_);
00457 
00458   InstanceOwnershipWriterInfos::iterator iter
00459     = instance_ownership_infos_.find (instance_handle);
00460 
00461   this->remove_owner (instance_handle, iter->second, false);
00462 }

bool OpenDDS::DCPS::OwnershipManager::remove_writer ( const ::DDS::InstanceHandle_t instance_handle,
OwnershipWriterInfos infos,
const PublicationId pub_id 
) [private]

Definition at line 253 of file OwnershipManager.cpp.

References OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, OpenDDS::DCPS::OwnershipManager::WriterInfo::pub_id_, remove_candidate(), and remove_owner().

00256 {
00257   if (infos.owner_.pub_id_ == pub_id) {
00258     this->remove_owner (instance_handle, infos, false);
00259     return true;
00260   }
00261   else {
00262     this->remove_candidate (infos, pub_id);
00263     return false;
00264   }
00265 
00266   return false;
00267 }

bool OpenDDS::DCPS::OwnershipManager::remove_writer ( const ::DDS::InstanceHandle_t instance_handle,
const PublicationId pub_id 
)

Remove a writer that write to the specified instance. Return true if it's the owner writer removed.

Definition at line 232 of file OwnershipManager.cpp.

References instance_ownership_infos_, and remove_writer().

00235 {
00236   ACE_GUARD_RETURN (ACE_Thread_Mutex,
00237                     guard,
00238                     this->instance_lock_,
00239                     false);
00240 
00241   InstanceOwnershipWriterInfos::iterator const the_end = instance_ownership_infos_.end ();
00242 
00243   InstanceOwnershipWriterInfos::iterator the_iter
00244     = instance_ownership_infos_.find (instance_handle);
00245   if (the_iter != the_end) {
00246     return this->remove_writer (instance_handle, the_iter->second, pub_id);
00247   }
00248 
00249   return false;
00250 }

void OpenDDS::DCPS::OwnershipManager::remove_writer ( const PublicationId pub_id  ) 

Remove a writer from all instances ownership collection.

Definition at line 140 of file OwnershipManager.cpp.

References instance_ownership_infos_.

Referenced by remove_writer(), OpenDDS::DCPS::DataReaderImpl::writer_became_dead(), and OpenDDS::DCPS::DataReaderImpl::writer_removed().

00141 {
00142   ACE_GUARD(ACE_Thread_Mutex,
00143             guard,
00144             this->instance_lock_);
00145 
00146   InstanceOwnershipWriterInfos::iterator const the_end = instance_ownership_infos_.end ();
00147   for (InstanceOwnershipWriterInfos::iterator iter = instance_ownership_infos_.begin ();
00148         iter != the_end; ++ iter) {
00149     this->remove_writer (iter->first, iter->second, pub_id);
00150   }
00151 }

void OpenDDS::DCPS::OwnershipManager::remove_writers ( const ::DDS::InstanceHandle_t instance_handle  ) 

Remove all writers that write to the specified instance.

Definition at line 170 of file OwnershipManager.cpp.

References OpenDDS::DCPS::DCPS_debug_level, and instance_ownership_infos_.

Referenced by OpenDDS::DCPS::RequestedDeadlineWatchdog::execute(), and OpenDDS::DCPS::DataReaderImpl::release_instance().

00171 {
00172   InstanceStateVec instances_to_reset;
00173   {
00174     ACE_GUARD(ACE_Thread_Mutex,
00175               guard,
00176               this->instance_lock_);
00177 
00178     if (DCPS_debug_level >= 1) {
00179         ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) OwnershipManager::remove_writers: ")
00180                              ACE_TEXT("disassociate writers with instance %d\n"),
00181                              instance_handle));
00182     }
00183 
00184     InstanceOwnershipWriterInfos::iterator owner_wi
00185       = instance_ownership_infos_.find (instance_handle);
00186     if (owner_wi != instance_ownership_infos_.end()) {
00187       owner_wi->second.owner_ = WriterInfo();
00188       owner_wi->second.candidates_.clear ();
00189       InstanceStateVec::iterator const end = owner_wi->second.instance_states_.end();
00190       for (InstanceStateVec::iterator iter = owner_wi->second.instance_states_.begin();
00191         iter != end; ++iter) {
00192           // call after lock released, will call back to data reader
00193           instances_to_reset.push_back(*iter);
00194       }
00195       owner_wi->second.instance_states_.clear ();
00196 
00197       instance_ownership_infos_.erase(owner_wi);
00198     }
00199   }
00200   // Lock released
00201   InstanceStateVec::iterator instance;
00202   for (instance  = instances_to_reset.begin();
00203        instance != instances_to_reset.end(); ++instance)
00204   {
00205     (*instance)->reset_ownership(instance_handle);
00206   }
00207 }

bool OpenDDS::DCPS::OwnershipManager::select_owner ( const ::DDS::InstanceHandle_t instance_handle,
const PublicationId pub_id,
const CORBA::Long &  ownership_strength,
InstanceState instance_state 
)

Determine if the provided publication can be the owner.

Definition at line 321 of file OwnershipManager.cpp.

References broadcast_new_owner(), OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::candidates_, Util::DescendingOwnershipStrengthSort(), OpenDDS::DCPS::GUID_UNKNOWN, instance_ownership_infos_, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::instance_states_, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, OpenDDS::DCPS::OwnershipManager::WriterInfo::ownership_strength_, OpenDDS::DCPS::OwnershipManager::WriterInfo::pub_id_, OpenDDS::DCPS::InstanceState::registered(), and remove_owner().

00325 {
00326   ACE_GUARD_RETURN (ACE_Thread_Mutex,
00327                     guard,
00328                     this->instance_lock_,
00329                     false);
00330 
00331   InstanceOwnershipWriterInfos::iterator const the_end = instance_ownership_infos_.end ();
00332 
00333   InstanceOwnershipWriterInfos::iterator iter
00334     = instance_ownership_infos_.find (instance_handle);
00335   if (iter != the_end) {
00336     OwnershipWriterInfos& infos = iter->second;
00337     if (!instance_state->registered()) {
00338       infos.instance_states_.push_back (instance_state);
00339       instance_state->registered(true);
00340     }
00341 
00342     // No owner at some point.
00343     if (infos.owner_.pub_id_ == GUID_UNKNOWN) {
00344       infos.owner_ = WriterInfo(pub_id,ownership_strength);
00345       this->broadcast_new_owner (instance_handle, infos, pub_id);
00346 
00347       return true;
00348     }
00349     else if (infos.owner_.pub_id_ == pub_id) { // is current owner
00350       //still owner but strength changed to be bigger..
00351       if (infos.owner_.ownership_strength_ <= ownership_strength) {
00352         infos.owner_.ownership_strength_ = ownership_strength;
00353         return true;
00354       }
00355       else { //update strength and reevaluate owner which broadcast new owner.
00356         infos.candidates_.push_back (WriterInfo(pub_id,ownership_strength));
00357         this->remove_owner (instance_handle, infos, true);
00358         return infos.owner_.pub_id_ == pub_id;
00359       }
00360     }
00361     else { // not current owner, reevaluate the owner
00362       bool replace_owner = false;
00363       // Add current owner to candidate list for owner reevaluation
00364       // if provided pub has strength greater than currrent owner.
00365       if (ownership_strength > infos.owner_.ownership_strength_) {
00366         infos.candidates_.push_back (infos.owner_);
00367         replace_owner = true;
00368       }
00369 
00370       bool found = false;
00371       bool sort = true;
00372 
00373       // check if it already existed in candicate list. If not,
00374       // add it to the candidate list, otherwise update strength
00375       // if strength was changed.
00376       WriterInfos::iterator const the_end = infos.candidates_.end();
00377 
00378       for (WriterInfos::iterator iter = infos.candidates_.begin();
00379         iter != the_end; ++iter) {
00380 
00381         if (iter->pub_id_ == pub_id) {
00382           if (iter->ownership_strength_ != ownership_strength) {
00383             iter->ownership_strength_ = ownership_strength;
00384           }
00385           else {
00386             sort = false;
00387           }
00388           found = true;
00389           break;
00390         }
00391       }
00392 
00393       if (!found) {
00394         infos.candidates_.push_back (WriterInfo(pub_id,ownership_strength));
00395       }
00396 
00397       if (sort) {
00398         std::sort (infos.candidates_.begin(), infos.candidates_.end(), ::Util::DescendingOwnershipStrengthSort);
00399       }
00400 
00401       if (replace_owner) {
00402         // Owner was already moved to candidate list and the list was sorted
00403         // already so pick owner from sorted list and replace current
00404         // owner.
00405         this->remove_owner (instance_handle, infos, false);
00406       }
00407 
00408       return infos.owner_.pub_id_ == pub_id;
00409     }
00410   }
00411   else {
00412     // first writer of the instance so it's owner.
00413     OwnershipWriterInfos& infos = instance_ownership_infos_[instance_handle];
00414     infos.owner_ = WriterInfo(pub_id,ownership_strength);
00415     if (!instance_state->registered()) {
00416       infos.instance_states_.push_back (instance_state);
00417       instance_state->registered(true);
00418     }
00419     this->broadcast_new_owner (instance_handle, infos, infos.owner_.pub_id_);
00420     return true;
00421   }
00422 
00423   return false;
00424 }

void OpenDDS::DCPS::OwnershipManager::set_instance_map ( const char *  type_name,
void *  instance_map,
DataReaderImpl reader 
)

The instance map per type is created by the concrete datareader when first sample with the type is received.

Definition at line 89 of file OwnershipManager.cpp.

References OpenDDS::DCPS::bind(), OpenDDS::DCPS::DCPS_debug_level, and type_instance_map_.

00092 {
00093   if (DCPS_debug_level >= 1) {
00094     ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) OwnershipManager::set_instance_map ")
00095                           ACE_TEXT (" instance map %X is created by reader %X \n"),
00096                 instance_map, reader));
00097   }
00098 
00099   if (0 != OpenDDS::DCPS::bind(type_instance_map_, type_name, InstanceMap (instance_map, reader))) {
00100     ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: OwnershipManager::set_instance_map failed to "
00101                          "bind instance for type \"%s\"\n",type_name));
00102   }
00103 }

void OpenDDS::DCPS::OwnershipManager::unregister_reader ( const char *  type_name,
DataReaderImpl reader 
)

The readers that access the instance map are keep tracked as ref counting to the instance map. The readers need unregister itself with the instance map upon unregistering instance.The instance map is deleted upon the last reader unregistering an instance of the type.

Definition at line 106 of file OwnershipManager.cpp.

References OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::DataReaderImpl::delete_instance_map(), OpenDDS::DCPS::find(), OpenDDS::DCPS::OwnershipManager::InstanceMap::map_, OpenDDS::DCPS::OwnershipManager::InstanceMap::readers_, type_instance_map_, and OpenDDS::DCPS::unbind().

Referenced by OpenDDS::DCPS::DataReaderImpl::cleanup().

00108 {
00109   ACE_GUARD(ACE_Thread_Mutex,
00110             guard,
00111             this->instance_lock_);
00112 
00113   InstanceMap* instance = 0;
00114   if (0 != find(type_instance_map_, type_name, instance)) {
00115     return;
00116   }
00117 
00118   ReaderVec::iterator end = instance->readers_.end();
00119 
00120   for (ReaderVec::iterator it(instance->readers_.begin());
00121       it != end; ++it) {
00122     if (*it == reader) {
00123       instance->readers_.erase (it);
00124       break;
00125     }
00126   }
00127 
00128   if (instance->readers_.empty ()) {
00129     if (DCPS_debug_level >= 1) {
00130       ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) OwnershipManager::unregister_reader ")
00131                             ACE_TEXT (" instance map %X is deleted by reader %X \n"),
00132                   instance->map_, reader));
00133     }
00134     reader->delete_instance_map (instance->map_);
00135     unbind (type_instance_map_, type_name);
00136   }
00137 }

void OpenDDS::DCPS::OwnershipManager::update_ownership_strength ( const PublicationId pub_id,
const CORBA::Long &  ownership_strength 
)

Update the ownership strength of a publication.


Member Data Documentation

ACE_Thread_Mutex OpenDDS::DCPS::OwnershipManager::instance_lock_ [private]

Definition at line 165 of file OwnershipManager.h.

Referenced by instance_lock_acquire(), and instance_lock_release().

InstanceOwnershipWriterInfos OpenDDS::DCPS::OwnershipManager::instance_ownership_infos_ [private]

Definition at line 167 of file OwnershipManager.h.

Referenced by is_owner(), remove_instance(), remove_owner(), remove_writer(), remove_writers(), and select_owner().

TypeInstanceMap OpenDDS::DCPS::OwnershipManager::type_instance_map_ [private]

Definition at line 166 of file OwnershipManager.h.

Referenced by get_instance_map(), set_instance_map(), unregister_reader(), and ~OwnershipManager().


The documentation for this class was generated from the following files:
Generated on Fri Feb 12 20:06:20 2016 for OpenDDS by  doxygen 1.4.7