예제 #1
0
gapi_returnCode_t
_PublisherFree (
    _Publisher _this)
{
    gapi_returnCode_t result = GAPI_RETCODE_OK;
    _Status status;
    u_publisher p;

    assert(_this);

    status = _EntityStatus(_this);
    _StatusSetListener(status, NULL, 0);

    _EntityClaim(status);
    _StatusDeinit(status);

    gapi_dataWriterQos_free(&_this->_defDataWriterQos);

    p = U_PUBLISHER_GET(_this);
    _EntityDispose (_Entity(_this));
    if (u_publisherFree(p) != U_RESULT_OK) {
        result = GAPI_RETCODE_ERROR;
    }

    return result;
}
예제 #2
0
gapi_returnCode_t
_SubscriberFree (
    _Subscriber subscriber)
{
    gapi_returnCode_t result = GAPI_RETCODE_OK;
    _Status status;
    u_subscriber s;

    assert(subscriber);

    status = _EntityStatus(subscriber);
    _StatusSetListener(status, NULL, 0);

    _EntityClaim(status);
    _StatusDeinit(status);

    gapi_dataReaderQos_free(&subscriber->_defDataReaderQos);

    s = U_SUBSCRIBER_GET(subscriber);
    _EntityDispose(_Entity(subscriber));
    if (u_subscriberFree(s) != U_RESULT_OK) {
        result = GAPI_RETCODE_ERROR;
    }

    return result;
}
예제 #3
0
void
_BuiltinSubscriberFree (
    _Subscriber subscriber)
{
    _Status status;

    assert(subscriber != NULL);

    status = _EntityStatus(subscriber);
    _StatusSetListener(status, NULL, 0);

    _EntityClaim(status);
    _StatusDeinit(status);

    u_subscriberFree(U_SUBSCRIBER_GET(subscriber));

    _EntityDispose(_Entity(subscriber));
}
예제 #4
0
gapi_returnCode_t
_DataReaderFree (
    _DataReader _this)
{
    gapi_returnCode_t result = GAPI_RETCODE_OK;
    _Status status;
    u_dataReader r;

    assert(_this);

    /* The following refCount checking and destruction mechanism is not
     * bullet proof and may cause leakage.
     * This is a temporary situation during GAPI redesign and should be
     * resolved when the GAPI redesign is finished.
     */
    r = U_DATAREADER_GET(_this);
    _TopicDescriptionDecUse(_this->topicDescription);

    status = _EntityStatus(_this);

    _StatusSetListener(status, NULL, 0);

    _EntityClaim(status);
    _StatusDeinit(status);

    gapi_loanRegistry_free(_this->loanRegistry);

    /* Following the user layer reader object is deleted after the entity
     * dispose because it will otherwise lead to a double free of the user
     * layer reader.
     * This is caused by the status condition which is attached to an exiting
     * waitset and the fact that a status condition's user object is the user
     * layer reader.
     * This is a hack but besides of that the destruction of the user entity
     * should be part of the entity dispose method.
     * For now this works.
     */
    _EntityDispose(_Entity(_this));
    u_dataReaderFree(r);

    return result;
}
예제 #5
0
gapi_returnCode_t
_DataWriterFree (
    _DataWriter _this)
{
    gapi_returnCode_t result = GAPI_RETCODE_OK;
    _Status status;
    u_writer w;

    assert(_this);

    status = _EntityStatus(_this);
    _TopicDescriptionDecUse(_TopicDescription(_this->topic));

    _StatusSetListener(status, NULL, 0);

    _EntityClaim(status);
    _StatusDeinit(status);

    w = U_WRITER_GET(_this);
    _EntityDispose (_Entity(_this));
    u_writerFree(w);

    return result;
}