OpenDDS  Snapshot(2023/04/07-19:43)
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::OwnershipManager Class Reference

#include <OwnershipManager.h>

Collaboration diagram for OpenDDS::DCPS::OwnershipManager:
Collaboration graph
[legend]

Classes

struct  InstanceMap
 
struct  OwnershipWriterInfos
 
struct  WriterInfo
 

Public Member Functions

typedef OPENDDS_SET (DataReaderImpl *) ReaderSet
 
typedef OPENDDS_MAP (OPENDDS_STRING, InstanceMap) TypeInstanceMap
 
typedef OPENDDS_VECTOR (WriterInfo) WriterInfos
 
typedef OPENDDS_VECTOR (InstanceState_rch) 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, const RcHandle< RcObject > &instance_map, DataReaderImpl *reader)
 
RcHandle< RcObjectget_instance_map (const char *type_name, DataReaderImpl *reader)
 
void unregister_reader (const char *type_name, DataReaderImpl *reader)
 
void remove_writer (const GUID_t &pub_id)
 
void remove_writers (const DDS::InstanceHandle_t &instance_handle)
 
bool remove_writer (const DDS::InstanceHandle_t &instance_handle, const GUID_t &pub_id)
 
bool is_owner (const DDS::InstanceHandle_t &instance_handle, const GUID_t &pub_id)
 
bool select_owner (const DDS::InstanceHandle_t &instance_handle, const GUID_t &pub_id, const CORBA::Long &ownership_strength, InstanceState_rch instance_state)
 
void remove_owner (const DDS::InstanceHandle_t &instance_handle)
 
void remove_instance (InstanceState *instance_state)
 
void update_ownership_strength (const GUID_t &pub_id, const CORBA::Long &ownership_strength)
 

Private Member Functions

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

Private Attributes

ACE_Thread_Mutex instance_lock_
 
TypeInstanceMap type_instance_map_
 
InstanceOwnershipWriterInfos instance_ownership_infos_
 

Detailed Description

Definition at line 31 of file OwnershipManager.h.

Constructor & Destructor Documentation

◆ OwnershipManager()

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

Definition at line 33 of file OwnershipManager.cpp.

34 {
35 }

◆ ~OwnershipManager()

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

Definition at line 37 of file OwnershipManager.cpp.

References ACE_DEBUG, ACE_TEXT(), and LM_WARNING.

38 {
39  // The type->instance should be empty if unregister instance are performed
40  // by all readers, but in case the instance not unregistered for some reason,
41  // an error will be logged.
42  if (!type_instance_map_.empty()) {
43  // There is no way to pass the instance map to concrete datareader
44  // to delete, so it will be leaked.
45  ACE_DEBUG((LM_WARNING,
46  ACE_TEXT("(%P|%t) OwnershipManager::~OwnershipManager ")
47  ACE_TEXT("- non-empty type_instance_map_\n")));
48  }
49 }
#define ACE_DEBUG(X)
ACE_TEXT("TCP_Factory")

Member Function Documentation

◆ broadcast_new_owner()

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

Definition at line 385 of file OwnershipManager.cpp.

References ACE_DEBUG, ACE_TEXT(), OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::candidates_, OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::instance_states_, LM_DEBUG, OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, and OpenDDS::DCPS::OwnershipManager::WriterInfo::ownership_strength_.

388 {
389  if (DCPS_debug_level >= 1) {
390  // This may not be an error since it could happen that the sample
391  // is delivered to the datareader after the write is dis-associated
392  // with this datareader.
393  ACE_DEBUG((LM_DEBUG,
394  ACE_TEXT("(%P|%t) OwnershipManager::broadcast_new_owner: ")
395  ACE_TEXT("owner writer %C, instance handle %d strength %d num ")
396  ACE_TEXT("of candidates %d\n"),
397  LogGuid(owner).c_str(), instance_handle,
398  infos.owner_.ownership_strength_,
399  (int)infos.candidates_.size()));
400  }
401 
402  const InstanceStateVec::iterator the_end = infos.instance_states_.end();
403  for (InstanceStateVec::iterator iter = infos.instance_states_.begin();
404  iter != the_end; ++iter) {
405  (*iter)->set_owner(owner);
406  }
407 }
#define ACE_DEBUG(X)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")

◆ get_instance_map()

RcHandle< RcObject > 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 64 of file OwnershipManager.cpp.

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

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data().

66 {
67  InstanceMap* instance = 0;
68  if (0 != find(type_instance_map_, type_name, instance)) {
69  return RcHandle<RcObject>();
70  }
71 
72  instance->readers_.insert(reader);
73  return instance->map_;
74 }
int find(Container &c, const Key &key, typename Container::mapped_type *&value)
Definition: Util.h:71

◆ instance_lock_acquire()

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

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

Definition at line 52 of file OwnershipManager.cpp.

53 {
54  return instance_lock_.acquire();
55 }
int acquire(void)

◆ instance_lock_release()

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

Definition at line 58 of file OwnershipManager.cpp.

59 {
60  return instance_lock_.release();
61 }
int release(void)

◆ is_owner()

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

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

Definition at line 187 of file OwnershipManager.cpp.

References ACE_GUARD_RETURN.

Referenced by OpenDDS::DCPS::DataReaderImpl::data_received(), and OpenDDS::DCPS::InstanceState::dispose_was_received().

189 {
191 
192  InstanceOwnershipWriterInfos::iterator iter
193  = instance_ownership_infos_.find(instance_handle);
194  if (iter != instance_ownership_infos_.end()) {
195  return iter->second.owner_.pub_id_ == pub_id;
196  }
197 
198  return false;
199 }
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ OPENDDS_MAP() [1/2]

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

◆ OPENDDS_MAP() [2/2]

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

◆ OPENDDS_SET()

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

◆ OPENDDS_VECTOR() [1/2]

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

◆ OPENDDS_VECTOR() [2/2]

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

◆ remove_candidate()

void OpenDDS::DCPS::OwnershipManager::remove_candidate ( OwnershipWriterInfos infos,
const GUID_t pub_id 
)
private

Definition at line 260 of file OwnershipManager.cpp.

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

262 {
263  if (!infos.candidates_.empty()) {
264  WriterInfos::iterator const the_end = infos.candidates_.end();
265 
266  WriterInfos::iterator found_candidate = the_end;
267  // Supplied writer is not an owner, check if it exists in candidate list.
268  // If not, add it to the candidate list and sort the list.
269  for (WriterInfos::iterator iter = infos.candidates_.begin();
270  iter != the_end; ++iter) {
271  if (iter->pub_id_ == pub_id) {
272  found_candidate = iter;
273  break;
274  }
275  }
276 
277  if (found_candidate != the_end) {
278  infos.candidates_.erase(found_candidate);
279  }
280  }
281 }

◆ remove_instance()

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

Definition at line 132 of file OwnershipManager.cpp.

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

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

133 {
135  const DDS::InstanceHandle_t ih = instance_state->instance_handle();
136  InstanceOwnershipWriterInfos::iterator i = instance_ownership_infos_.find(ih);
137  if (i != instance_ownership_infos_.end()) {
138  InstanceStateVec& states = i->second.instance_states_;
139  for (size_t j = 0; j < states.size(); ++j) {
140  if (states[j].in() == instance_state) {
141  states.erase(states.begin() + j);
142  break;
143  }
144  }
145  }
146 }
#define ACE_GUARD(MUTEX, OBJ, LOCK)
HANDLE_TYPE_NATIVE InstanceHandle_t
Definition: DdsDcpsCore.idl:51
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ remove_owner() [1/2]

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

Remove an owner of the specified instance.

Definition at line 410 of file OwnershipManager.cpp.

References ACE_GUARD, and OPENDDS_END_VERSIONED_NAMESPACE_DECL.

411 {
413 
414  const InstanceOwnershipWriterInfos::iterator iter =
415  instance_ownership_infos_.find(instance_handle);
416 
417  if (iter != instance_ownership_infos_.end()) {
418  remove_owner(instance_handle, iter->second, false);
419  }
420 }
#define ACE_GUARD(MUTEX, OBJ, LOCK)
void remove_owner(const DDS::InstanceHandle_t &instance_handle)
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ remove_owner() [2/2]

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

Definition at line 234 of file OwnershipManager.cpp.

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

237 {
238  //change owner
239  GUID_t new_owner(GUID_UNKNOWN);
240  if (infos.candidates_.empty()) {
241  infos.owner_ = WriterInfo();
242 
243  } else {
244  if (sort) {
245  std::sort(infos.candidates_.begin(), infos.candidates_.end(),
247  }
248 
249  const WriterInfos::iterator begin = infos.candidates_.begin();
250  infos.owner_ = *begin;
251  infos.candidates_.erase(begin);
252  new_owner = infos.owner_.pub_id_;
253  }
254 
255  broadcast_new_owner(instance_handle, infos, new_owner);
256 }
void broadcast_new_owner(const DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, const GUID_t &owner)
const GUID_t GUID_UNKNOWN
Nil value for GUID.
Definition: GuidUtils.h:59
bool DescendingOwnershipStrengthSort(const OwnershipManager::WriterInfo &w1, const OwnershipManager::WriterInfo &w2)

◆ remove_writer() [1/3]

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

Remove a writer from all instances ownership collection.

Definition at line 119 of file OwnershipManager.cpp.

References ACE_GUARD.

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

120 {
122 
123  const InstanceOwnershipWriterInfos::iterator the_end =
125  for (InstanceOwnershipWriterInfos::iterator iter =
126  instance_ownership_infos_.begin(); iter != the_end; ++iter) {
127  remove_writer(iter->first, iter->second, pub_id);
128  }
129 }
#define ACE_GUARD(MUTEX, OBJ, LOCK)
void remove_writer(const GUID_t &pub_id)
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ remove_writer() [2/3]

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

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

Definition at line 203 of file OwnershipManager.cpp.

References ACE_GUARD_RETURN.

205 {
207 
208  InstanceOwnershipWriterInfos::iterator the_iter =
209  instance_ownership_infos_.find(instance_handle);
210  if (the_iter != instance_ownership_infos_.end()) {
211  return remove_writer(instance_handle, the_iter->second, pub_id);
212  }
213 
214  return false;
215 }
void remove_writer(const GUID_t &pub_id)
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ remove_writer() [3/3]

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

Definition at line 218 of file OwnershipManager.cpp.

References OpenDDS::DCPS::OwnershipManager::OwnershipWriterInfos::owner_, and OpenDDS::DCPS::OwnershipManager::WriterInfo::pub_id_.

221 {
222  if (infos.owner_.pub_id_ == pub_id) {
223  remove_owner(instance_handle, infos, false);
224  return true;
225 
226  } else {
227  remove_candidate(infos, pub_id);
228  return false;
229  }
230 }
void remove_owner(const DDS::InstanceHandle_t &instance_handle)
void remove_candidate(OwnershipWriterInfos &infos, const GUID_t &pub_id)

◆ remove_writers()

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

Remove all writers that write to the specified instance.

Definition at line 149 of file OwnershipManager.cpp.

References ACE_DEBUG, ACE_GUARD, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, and LM_DEBUG.

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

150 {
151  InstanceStateVec instances_to_reset;
152  {
154 
155  if (DCPS_debug_level >= 1) {
156  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) OwnershipManager::remove_writers:")
157  ACE_TEXT(" disassociate writers with instance %d\n"),
158  instance_handle));
159  }
160 
161  InstanceOwnershipWriterInfos::iterator owner_wi =
162  instance_ownership_infos_.find(instance_handle);
163  if (owner_wi != instance_ownership_infos_.end()) {
164  owner_wi->second.owner_ = WriterInfo();
165  owner_wi->second.candidates_.clear();
166  const InstanceStateVec::iterator end =
167  owner_wi->second.instance_states_.end();
168  for (InstanceStateVec::iterator iter =
169  owner_wi->second.instance_states_.begin(); iter != end; ++iter) {
170  // call after lock released, will call back to data reader
171  instances_to_reset.push_back(*iter);
172  }
173  owner_wi->second.instance_states_.clear();
174 
175  instance_ownership_infos_.erase(owner_wi);
176  }
177  }
178  // Lock released
179  for (InstanceStateVec::iterator instance = instances_to_reset.begin();
180  instance != instances_to_reset.end(); ++instance) {
181  (*instance)->reset_ownership(instance_handle);
182  }
183 }
#define ACE_DEBUG(X)
#define ACE_GUARD(MUTEX, OBJ, LOCK)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")
InstanceOwnershipWriterInfos instance_ownership_infos_

◆ select_owner()

bool OpenDDS::DCPS::OwnershipManager::select_owner ( const DDS::InstanceHandle_t instance_handle,
const GUID_t pub_id,
const CORBA::Long ownership_strength,
InstanceState_rch  instance_state 
)

Determine if the provided publication can be the owner.

Definition at line 284 of file OwnershipManager.cpp.

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

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

288 {
290 
291  InstanceOwnershipWriterInfos::iterator iter =
292  instance_ownership_infos_.find(instance_handle);
293  if (iter != instance_ownership_infos_.end()) {
294  OwnershipWriterInfos& infos = iter->second;
295  if (!instance_state->registered()) {
296  infos.instance_states_.push_back(instance_state);
297  instance_state->registered(true);
298  }
299 
300  // No owner at some point.
301  if (infos.owner_.pub_id_ == GUID_UNKNOWN) {
302  infos.owner_ = WriterInfo(pub_id, ownership_strength);
303  broadcast_new_owner(instance_handle, infos, pub_id);
304  return true;
305 
306  } else if (infos.owner_.pub_id_ == pub_id) { // is current owner
307  //still owner but strength changed to be bigger..
308  if (infos.owner_.ownership_strength_ <= ownership_strength) {
309  infos.owner_.ownership_strength_ = ownership_strength;
310  return true;
311 
312  } else { //update strength and reevaluate owner which broadcast new owner.
313  infos.candidates_.push_back(WriterInfo(pub_id, ownership_strength));
314  remove_owner(instance_handle, infos, true);
315  return infos.owner_.pub_id_ == pub_id;
316  }
317 
318  } else { // not current owner, reevaluate the owner
319  bool replace_owner = false;
320  // Add current owner to candidate list for owner reevaluation
321  // if provided pub has strength greater than current owner.
322  if (ownership_strength > infos.owner_.ownership_strength_) {
323  infos.candidates_.push_back(infos.owner_);
324  replace_owner = true;
325  }
326 
327  bool found = false;
328  bool sort = true;
329 
330  // check if it already existed in candidate list. If not,
331  // add it to the candidate list, otherwise update strength
332  // if strength was changed.
333  const WriterInfos::iterator the_end = infos.candidates_.end();
334 
335  for (WriterInfos::iterator iter = infos.candidates_.begin();
336  iter != the_end; ++iter) {
337 
338  if (iter->pub_id_ == pub_id) {
339  if (iter->ownership_strength_ != ownership_strength) {
340  iter->ownership_strength_ = ownership_strength;
341  } else {
342  sort = false;
343  }
344  found = true;
345  break;
346  }
347  }
348 
349  if (!found) {
350  infos.candidates_.push_back(WriterInfo(pub_id, ownership_strength));
351  }
352 
353  if (sort) {
354  std::sort(infos.candidates_.begin(), infos.candidates_.end(),
356  }
357 
358  if (replace_owner) {
359  // Owner was already moved to candidate list and the list was sorted
360  // already so pick owner from sorted list and replace current
361  // owner.
362  remove_owner(instance_handle, infos, false);
363  }
364 
365  return infos.owner_.pub_id_ == pub_id;
366  }
367 
368  } else {
369  // first writer of the instance so it's owner.
370  OwnershipWriterInfos& infos = instance_ownership_infos_[instance_handle];
371  infos.owner_ = WriterInfo(pub_id, ownership_strength);
372  if (!instance_state->registered()) {
373  infos.instance_states_.push_back(instance_state);
374  instance_state->registered(true);
375  }
376  broadcast_new_owner(instance_handle, infos, infos.owner_.pub_id_);
377  return true;
378  }
379 
380  return false;
381 }
void broadcast_new_owner(const DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, const GUID_t &owner)
const GUID_t GUID_UNKNOWN
Nil value for GUID.
Definition: GuidUtils.h:59
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
void remove_owner(const DDS::InstanceHandle_t &instance_handle)
InstanceOwnershipWriterInfos instance_ownership_infos_
bool DescendingOwnershipStrengthSort(const OwnershipManager::WriterInfo &w1, const OwnershipManager::WriterInfo &w2)

◆ set_instance_map()

void OpenDDS::DCPS::OwnershipManager::set_instance_map ( const char *  type_name,
const RcHandle< RcObject > &  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 77 of file OwnershipManager.cpp.

References ACE_DEBUG, ACE_ERROR, ACE_TEXT(), OpenDDS::DCPS::bind(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::RcHandle< T >::in(), LM_DEBUG, and LM_ERROR.

Referenced by OpenDDS::DCPS::DataReaderImpl_T< DynamicSample >::store_instance_data().

80 {
81  if (DCPS_debug_level >= 1) {
82  ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) OwnershipManager::set_instance_map ")
83  ACE_TEXT("instance map %X is created by reader %X\n"),
84  instance_map.in(), reader));
85  }
86 
87  if (0 != OpenDDS::DCPS::bind(type_instance_map_, type_name,
88  InstanceMap(instance_map, reader))) {
89  ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: OwnershipManager::set_instance_map "
90  "failed to bind instance for type \"%C\"\n", type_name));
91  }
92 }
#define ACE_DEBUG(X)
#define ACE_ERROR(X)
int bind(Container &c, const FirstType &first, const SecondType &second)
Definition: Util.h:20
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")

◆ unregister_reader()

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 95 of file OwnershipManager.cpp.

References ACE_DEBUG, ACE_GUARD, ACE_TEXT(), OpenDDS::DCPS::DCPS_debug_level, OpenDDS::DCPS::find(), LM_DEBUG, OpenDDS::DCPS::OwnershipManager::InstanceMap::map_, OpenDDS::DCPS::OwnershipManager::InstanceMap::readers_, and OpenDDS::DCPS::unbind().

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

97 {
99 
100  InstanceMap* instance = 0;
101  if (0 != find(type_instance_map_, type_name, instance)) {
102  return;
103  }
104 
105  instance->readers_.erase(reader);
106 
107  if (instance->readers_.empty()) {
108  if (DCPS_debug_level >= 1) {
109  ACE_DEBUG((LM_DEBUG,
110  ACE_TEXT("(%P|%t) OwnershipManager::unregister_reader ")
111  ACE_TEXT(" instance map %@ is deleted by reader %@\n"),
112  instance->map_.in(), reader));
113  }
114  unbind(type_instance_map_, type_name);
115  }
116 }
#define ACE_DEBUG(X)
#define ACE_GUARD(MUTEX, OBJ, LOCK)
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
ACE_TEXT("TCP_Factory")
int find(Container &c, const Key &key, typename Container::mapped_type *&value)
Definition: Util.h:71
int unbind(Container &c, const typename Container::key_type &k, typename Container::mapped_type &v)
Definition: Util.h:40

◆ update_ownership_strength()

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

Update the ownership strength of a publication.

Member Data Documentation

◆ instance_lock_

ACE_Thread_Mutex OpenDDS::DCPS::OwnershipManager::instance_lock_
private

Definition at line 173 of file OwnershipManager.h.

◆ instance_ownership_infos_

InstanceOwnershipWriterInfos OpenDDS::DCPS::OwnershipManager::instance_ownership_infos_
private

Definition at line 175 of file OwnershipManager.h.

◆ type_instance_map_

TypeInstanceMap OpenDDS::DCPS::OwnershipManager::type_instance_map_
private

Definition at line 174 of file OwnershipManager.h.


The documentation for this class was generated from the following files: