10 #ifndef OPENDDS_NO_OWNERSHIP_KIND_EXCLUSIVE 42 if (!type_instance_map_.empty()) {
46 ACE_TEXT(
"(%P|%t) OwnershipManager::~OwnershipManager ")
47 ACE_TEXT(
"- non-empty type_instance_map_\n")));
54 return instance_lock_.acquire();
60 return instance_lock_.release();
68 if (0 !=
find(type_instance_map_, type_name, instance)) {
73 return instance->
map_;
83 ACE_TEXT(
"instance map %X is created by reader %X\n"),
84 instance_map.
in(), reader));
90 "failed to bind instance for type \"%C\"\n", type_name));
101 if (0 !=
find(type_instance_map_, type_name, instance)) {
110 ACE_TEXT(
"(%P|%t) OwnershipManager::unregister_reader ")
111 ACE_TEXT(
" instance map %@ is deleted by reader %@\n"),
112 instance->
map_.in(), reader));
114 unbind(type_instance_map_, type_name);
123 const InstanceOwnershipWriterInfos::iterator the_end =
124 instance_ownership_infos_.end();
125 for (InstanceOwnershipWriterInfos::iterator iter =
126 instance_ownership_infos_.begin(); iter != the_end; ++iter) {
127 remove_writer(iter->first, iter->second, pub_id);
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);
151 InstanceStateVec instances_to_reset;
157 ACE_TEXT(
" disassociate writers with instance %d\n"),
161 InstanceOwnershipWriterInfos::iterator owner_wi =
162 instance_ownership_infos_.find(instance_handle);
163 if (owner_wi != instance_ownership_infos_.end()) {
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) {
171 instances_to_reset.push_back(*iter);
173 owner_wi->second.instance_states_.clear();
175 instance_ownership_infos_.erase(owner_wi);
179 for (InstanceStateVec::iterator instance = instances_to_reset.begin();
180 instance != instances_to_reset.end(); ++instance) {
181 (*instance)->reset_ownership(instance_handle);
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;
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);
223 remove_owner(instance_handle, infos,
false);
227 remove_candidate(infos, pub_id);
249 const WriterInfos::iterator begin = infos.
candidates_.begin();
255 broadcast_new_owner(instance_handle, infos, new_owner);
264 WriterInfos::iterator
const the_end = infos.
candidates_.end();
266 WriterInfos::iterator found_candidate = the_end;
269 for (WriterInfos::iterator iter = infos.
candidates_.begin();
270 iter != the_end; ++iter) {
271 if (iter->pub_id_ == pub_id) {
272 found_candidate = iter;
277 if (found_candidate != the_end) {
291 InstanceOwnershipWriterInfos::iterator iter =
292 instance_ownership_infos_.find(instance_handle);
293 if (iter != instance_ownership_infos_.end()) {
303 broadcast_new_owner(instance_handle, infos, pub_id);
314 remove_owner(instance_handle, infos,
true);
319 bool replace_owner =
false;
324 replace_owner =
true;
333 const WriterInfos::iterator the_end = infos.
candidates_.end();
335 for (WriterInfos::iterator iter = infos.
candidates_.begin();
336 iter != the_end; ++iter) {
338 if (iter->pub_id_ == pub_id) {
339 if (iter->ownership_strength_ != ownership_strength) {
340 iter->ownership_strength_ = ownership_strength;
362 remove_owner(instance_handle, infos,
false);
376 broadcast_new_owner(instance_handle, infos, infos.
owner_.
pub_id_);
394 ACE_TEXT(
"(%P|%t) OwnershipManager::broadcast_new_owner: ")
395 ACE_TEXT(
"owner writer %C, instance handle %d strength %d num ")
397 LogGuid(owner).c_str(), instance_handle,
404 iter != the_end; ++iter) {
405 (*iter)->set_owner(owner);
414 const InstanceOwnershipWriterInfos::iterator iter =
415 instance_ownership_infos_.find(instance_handle);
417 if (iter != instance_ownership_infos_.end()) {
418 remove_owner(instance_handle, iter->second,
false);
428 #endif // OPENDDS_NO_OWNERSHIP_KIND_EXCLUSIVE InstanceStateVec instance_states_
manage the states of a received data instance.
#define ACE_GUARD(MUTEX, OBJ, LOCK)
void set_instance_map(const char *type_name, const RcHandle< RcObject > &instance_map, DataReaderImpl *reader)
int instance_lock_acquire()
const GUID_t GUID_UNKNOWN
Nil value for GUID.
int bind(Container &c, const FirstType &first, const SecondType &second)
bool is_owner(const DDS::InstanceHandle_t &instance_handle, const GUID_t &pub_id)
void unregister_reader(const char *type_name, DataReaderImpl *reader)
CORBA::Long ownership_strength_
void remove_instance(InstanceState *instance_state)
int instance_lock_release()
RcHandle< RcObject > get_instance_map(const char *type_name, DataReaderImpl *reader)
bool select_owner(const DDS::InstanceHandle_t &instance_handle, const GUID_t &pub_id, const CORBA::Long &ownership_strength, InstanceState_rch instance_state)
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
DDS::InstanceHandle_t instance_handle() const
Implements the DDS::DataReader interface.
bool DescendingOwnershipStrengthSort(const OwnershipManager::WriterInfo &w1, const OwnershipManager::WriterInfo &w2)
HANDLE_TYPE_NATIVE InstanceHandle_t
void remove_owner(const DDS::InstanceHandle_t &instance_handle)
void remove_writer(const GUID_t &pub_id)
RcHandle< RcObject > map_
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
void remove_candidate(OwnershipWriterInfos &infos, const GUID_t &pub_id)
void remove_writers(const DDS::InstanceHandle_t &instance_handle)
The Internal API and Implementation of OpenDDS.
int unbind(Container &c, const typename Container::key_type &k, typename Container::mapped_type &v)
void broadcast_new_owner(const DDS::InstanceHandle_t &instance_handle, OwnershipWriterInfos &infos, const GUID_t &owner)
int find(Container &c, const Key &key, typename Container::mapped_type *&value)