예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}