u_result u_subscriberDeleteContainedEntities ( u_subscriber _this) { u_result result; u_reader reader; c_iter list; if (_this != NULL) { result = u_entityLock(u_entity(_this)); if (result == U_RESULT_OK) { list = _this->readers; _this->readers = NULL; /* Unlock here because following code will take this lock. */ u_entityUnlock(u_entity(_this)); reader = c_iterTakeFirst(list); while (reader) { switch (u_entityKind(u_entity(reader))) { case U_READER: result = u_dataReaderDeleteContainedEntities(u_dataReader(reader)); result = u_dataReaderFree(u_dataReader(reader)); break; case U_GROUPQUEUE: result = u_groupQueueFree(u_groupQueue(reader)); break; case U_DATAVIEW: result = u_dataViewFree(u_dataView(reader)); break; case U_NETWORKREADER: result = u_networkReaderFree(u_networkReader(reader)); break; default: OS_REPORT_2(OS_WARNING, "u_subscriberDeleteContainedEntities",0, "invalid object type: " "For Subscriber = 0x%x, found Reader type = %s.", _this, u_kindImage(u_entityKind(u_entity(reader)))); assert(0); break; } u_entityDereference(u_entity(_this)); reader = c_iterTakeFirst(list); } c_iterFree(list); } else { OS_REPORT_2(OS_WARNING, "u_subscriberDeleteContainedEntities",0, "Operation u_entityLock failed: " "Subscriber = 0x%x, result = %s.", _this, u_resultImage(result)); } } else { OS_REPORT(OS_WARNING, "u_subscriberDeleteContainedEntities",0, "Invalid Subscriber <NULL>."); result = U_RESULT_ILL_PARAM; } return result; }
u_result u_serviceFree( u_service _this) { u_result result; c_bool destroy; result = u_entityLock(u_entity(_this)); if (result == U_RESULT_OK) { destroy = u_entityDereference(u_entity(_this)); /* if refCount becomes zero then this call * returns true and destruction can take place */ if (destroy) { if (u_entityOwner(u_entity(_this))) { result = u_serviceDeinit(_this); } else { /* This user entity is a proxy, meaning that it is not fully * initialized, therefore only the entity part of the object * can be deinitialized. * It would be better to either introduce a separate proxy * entity for clarity or fully initialize entities and make * them robust against missing information. */ result = u_entityDeinit(u_entity(_this)); } if (result == U_RESULT_OK) { u_entityDealloc(u_entity(_this)); } else { OS_REPORT_2(OS_WARNING, "u_serviceFree",0, "Operation u_serviceDeinit failed: " "Service = 0x%x, result = %s.", _this, u_resultImage(result)); u_entityUnlock(u_entity(_this)); } } else { u_entityUnlock(u_entity(_this)); } } else { OS_REPORT_2(OS_WARNING, "u_serviceFree",0, "Operation u_entityLock failed: " "Service = 0x%x, result = %s.", _this, u_resultImage(result)); } return result; }
u_result u_subscriberRemoveReader( u_subscriber _this, u_reader reader) { u_reader found; u_result result; result = u_entityLock(u_entity(_this)); if (result == U_RESULT_OK) { found = c_iterTake(_this->readers,reader); if (found) { u_entityDereference(u_entity(_this)); } u_entityUnlock(u_entity(_this)); } else { OS_REPORT(OS_WARNING, "u_subscriberRemoveReader",0, "Failed to lock Subscriber."); } return result; }
u_result u_subscriberDeinit( u_subscriber _this) { u_result result; u_dataReader reader; c_iter list; if (_this != NULL) { result = u_participantRemoveSubscriber(_this->participant,_this); if (result == U_RESULT_OK) { _this->participant = NULL; if (_this->readers) { list = _this->readers; _this->readers = NULL; u_entityUnlock(u_entity(_this)); reader = c_iterTakeFirst(list); while (reader) { /* Readers should not exist at this point! * This loop corrects this erronous state. */ result = u_dataReaderFree(reader); u_entityDereference(u_entity(_this)); reader = c_iterTakeFirst(list); } c_iterFree(list); result = u_entityLock(u_entity(_this)); } result = u_dispatcherDeinit(u_dispatcher(_this)); } } else { OS_REPORT_1(OS_ERROR, "u_subscriberDeinit",0, "Illegal parameter: _this = 0x%x.", _this); result = U_RESULT_ILL_PARAM; } return result; }
u_result u_topicFree( u_topic _this) { u_result result; c_bool destroy; result = u_entityLock(u_entity(_this)); if (result == U_RESULT_OK) { destroy = u_entityDereference(u_entity(_this)); /* if refCount becomes zero then this call * returns true and destruction can take place */ if (destroy) { result = u_topicDeinit(_this); if (result == U_RESULT_OK) { u_entityDealloc(u_entity(_this)); } else { OS_REPORT_2(OS_WARNING, "u_topicFree",0, "Operation u_topicDeinit failed: " "Topic = 0x%x, result = %s.", _this, u_resultImage(result)); u_entityUnlock(u_entity(_this)); } } else { u_entityUnlock(u_entity(_this)); } } else { OS_REPORT_2(OS_WARNING, "u_topicFree",0, "Operation u_entityLock failed: " "Topic = 0x%x, result = %s.", _this, u_resultImage(result)); } return result; }