Пример #1
0
os_duration
v_messageQos_getLatencyPeriod(
    v_messageQos qos)
{
    os_duration budget;
    c_octet *dst;
    c_octet *src;

    if (v_messageQos_isZeroLatency(qos)) {
        budget = OS_DURATION_ZERO;
    } else {
        v_duration tmp;
        dst = (c_octet *)&tmp;
        src = &(((c_octet *)qos))[6+v_messageQos_strengthSize(qos)];
        _COPY8_(dst,src);
        budget = v_durationToOsDuration(tmp);
    }
    return budget;
}
Пример #2
0
os_duration
v_messageQos_getDeadlinePeriod(
    v_messageQos qos)
{
    os_duration period;
    c_octet *dst;
    c_octet *src;

    if (v_messageQos_isInfiniteDeadline(qos)) {
        period = OS_DURATION_INFINITE;
    } else {
        v_duration tmp;
        dst = (c_octet *)&tmp;
        src = &((c_octet *)qos)[6+
                                v_messageQos_strengthSize(qos)+
                                v_messageQos_latencySize(qos)];
        _COPY8_(dst,src);
        period = v_durationToOsDuration(tmp);
    }
    return period;
}
Пример #3
0
v_messageQos
in_messageQos_new(
    in_connectivityPeerWriter writer, c_base base)
{

    in_ddsiDiscoveredWriterData i =
        in_connectivityPeerWriterGetInfo(writer);

    /* inefficient, should be permenanent */
    c_type type;
    v_messageQos _this ;
    c_long transportQosValue = 0; /* TODO */
#ifdef _FAST_ACCESS_
    c_long offset            = 10, /* byte0 + byte1 + transport_priority + 4*time_offsets */
#else
    c_long offset            = 6, /* byte0 + byte1 + transport_priority */
#endif
           strength_offset   = 0,
           latency_offset    = 0,
           deadline_offset   = 0,
           liveliness_offset = 0,
           lifespan_offset   = 0;

    c_octet byte0 = 0,
            byte1 = 0;

    c_octet *dst, *src;

    type = c_metaArrayTypeNew(c_metaObject(base),
                              "C_ARRAY<c_octet>",
                              c_octet_t(base),
                              0);

    _this = c_newArray((c_collectionType)type,offset);
    c_free(type); /* remove if "type" becomes permenanent */

    if (_this) {
        byte0 |= _LSHIFT_(i->topicData.info.reliability.kind,
                          MQ_BYTE0_RELIABILITY_OFFSET);
        byte0 |= _LSHIFT_(i->topicData.info.ownership.kind,
                          MQ_BYTE0_OWNERSHIP_OFFSET);
        byte0 |= _LSHIFT_(i->topicData.info.destination_order.kind,
                          MQ_BYTE0_ORDERBY_OFFSET);
        byte0 |= _LSHIFT_(i->topicData.info.lifecycle.autodispose_unregistered_instances,
                          MQ_BYTE0_AUTODISPOSE_OFFSET);
        byte1 |= _LSHIFT_(i->topicData.info.durability.kind,
                          MQ_BYTE1_DURABILITY_OFFSET);
        byte1 |= _LSHIFT_(i->topicData.info.liveliness.kind,
                          MQ_BYTE1_LIVELINESS_OFFSET);
        byte1 |= _LSHIFT_(i->topicData.info.presentation.access_scope,
                          MQ_BYTE1_PRESENTATION_OFFSET);
        byte1 |= _LSHIFT_(i->topicData.info.presentation.coherent_access,
                          MQ_BYTE1_ORDERED_ACCESS_OFFSET);
        byte1 |= _LSHIFT_(i->topicData.info.presentation.ordered_access,
                          MQ_BYTE1_COHERENT_ACCESS_OFFSET);

        if (i->topicData.info.ownership.kind == V_OWNERSHIP_EXCLUSIVE) {
            strength_offset = offset;
            offset += sizeof(i->topicData.info.ownership_strength.value);
        }

        if (c_timeIsZero(i->topicData.info.latency_budget.duration)) {
            byte0 |= _LSHIFT_(1,MQ_BYTE0_LATENCY_OFFSET);
        } else {
            latency_offset = offset;
            offset += sizeof(i->topicData.info.latency_budget.duration);
        }
        if (c_timeIsInfinite(i->topicData.info.deadline.period)) {
            byte0 |= _LSHIFT_(1,MQ_BYTE0_DEADLINE_OFFSET);
        } else {
            deadline_offset = offset;
            offset += sizeof(i->topicData.info.deadline.period);
        }
        if (c_timeIsInfinite(i->topicData.info.liveliness.lease_duration)) {
            byte0 |= _LSHIFT_(1,MQ_BYTE0_LIVELINESS_OFFSET);
        } else {
            liveliness_offset = offset;
            offset += sizeof(i->topicData.info.liveliness.lease_duration);
        }
        if (c_timeIsInfinite(i->topicData.info.lifespan.duration)) {
            byte0 |= _LSHIFT_(1,MQ_BYTE0_LIFESPAN_OFFSET);
        } else {
            lifespan_offset = offset;
            offset += sizeof(i->topicData.info.lifespan.duration);
        }

        ((c_octet *)_this)[0] = byte0;
        ((c_octet *)_this)[1] = byte1;

        src = (c_octet *)&(transportQosValue); /* TODO fix*/
        dst = (c_octet *)&((c_octet *)_this)[2];
        _COPY4_(dst,src);

        if (strength_offset) {
            src = (c_octet *)&(i->topicData.info.ownership_strength.value);
            dst = (c_octet *)&((c_octet *)_this)[strength_offset];
            _COPY4_(dst,src);
        }
        if (latency_offset) {
            src = (c_octet *)&(i->topicData.info.latency_budget.duration);
            dst = (c_octet *)&((c_octet *)_this)[latency_offset];
            _COPY8_(dst,src);
        }
        if (deadline_offset) {
            src = (c_octet *)&(i->topicData.info.deadline.period);
            dst = (c_octet *)&((c_octet *)_this)[deadline_offset];
            _COPY8_(dst,src);
        }
        if (liveliness_offset) {
            src = (c_octet *)&(i->topicData.info.liveliness.lease_duration);
            dst = (c_octet *)&((c_octet *)_this)[liveliness_offset];
            _COPY8_(dst,src);
        }
        if (lifespan_offset) {
            src = (c_octet *)&(i->topicData.info.lifespan.duration);
            dst = (c_octet *)&((c_octet *)_this)[lifespan_offset];
            _COPY8_(dst,src);
        }
    } else {
        assert(FALSE);
    }

    return _this;
}
Пример #4
0
v_messageQos
v_messageQos_from_wqos_new(
    v_writerQos wqos,
    c_type msgQosType,
    v_presentationKind access_scope,
    c_bool coherent_access,
    c_bool ordered_access)
{
    v_messageQos _this;
    c_base base;
    v_duration tdur;
    c_ulong offset    = 6, /* byte0 + byte1 + transport_priority */
    strength_offset   = 0,
    latency_offset    = 0,
    deadline_offset   = 0,
    liveliness_offset = 0,
    lifespan_offset   = 0;

    c_octet byte0, byte1;

    c_octet *dst, *src;

    assert(C_TYPECHECK(wqos,v_writerQos));

    base = c_getBase(wqos);

    if (msgQosType == NULL) {
        msgQosType = c_metaArrayTypeNew(c_metaObject(base),
                                  "C_ARRAY<c_octet>",
                                  c_octet_t(base),
                                  0);
    }
    byte0 = (c_octet) (_LSHIFT_(wqos->reliability.v.kind, MQ_BYTE0_RELIABILITY_OFFSET) |
                       _LSHIFT_(wqos->ownership.v.kind, MQ_BYTE0_OWNERSHIP_OFFSET) |
                       _LSHIFT_(wqos->orderby.v.kind, MQ_BYTE0_ORDERBY_OFFSET) |
                       _LSHIFT_(wqos->lifecycle.v.autodispose_unregistered_instances, MQ_BYTE0_AUTODISPOSE_OFFSET));
    byte1 = (c_octet) (_LSHIFT_(wqos->durability.v.kind, MQ_BYTE1_DURABILITY_OFFSET) |
                       _LSHIFT_(wqos->liveliness.v.kind, MQ_BYTE1_LIVELINESS_OFFSET) |
                       /* writer->resend._d contains the access_scope of the publisher-QoS */
                       _LSHIFT_(access_scope, MQ_BYTE1_PRESENTATION_OFFSET) |
                       _LSHIFT_(coherent_access, MQ_BYTE1_COHERENT_ACCESS_OFFSET) |
                       _LSHIFT_(ordered_access, MQ_BYTE1_ORDERED_ACCESS_OFFSET));

    if (wqos->ownership.v.kind == V_OWNERSHIP_EXCLUSIVE) {
        strength_offset = offset;
        offset += (c_ulong) sizeof(wqos->strength.v.value);
    }
    if (OS_DURATION_ISZERO(wqos->latency.v.duration)) {
        byte0 = (c_octet) (byte0 | _LSHIFT_(1,MQ_BYTE0_LATENCY_OFFSET));
    } else {
        latency_offset = offset;
        offset += (c_ulong) sizeof(wqos->latency.v.duration);
    }
    if (OS_DURATION_ISINFINITE(wqos->deadline.v.period)) {
        byte0 = (c_octet) (byte0 | _LSHIFT_(1,MQ_BYTE0_DEADLINE_OFFSET));
    } else {
        deadline_offset = offset;
        offset += (c_ulong) sizeof(wqos->deadline.v.period);
    }
    if (OS_DURATION_ISINFINITE(wqos->liveliness.v.lease_duration)) {
        byte0 = (c_octet) (byte0 | _LSHIFT_(1,MQ_BYTE0_LIVELINESS_OFFSET));
    } else {
        liveliness_offset = offset;
        offset += (c_ulong) sizeof(wqos->liveliness.v.lease_duration);
    }
    if (OS_DURATION_ISINFINITE(wqos->lifespan.v.duration)) {
        byte0 = (c_octet) (byte0 | _LSHIFT_(1,MQ_BYTE0_LIFESPAN_OFFSET));
    } else {
        lifespan_offset = offset;
        offset += (c_ulong) sizeof(wqos->lifespan.v.duration);
    }

    _this = c_newArray((c_collectionType)msgQosType,offset);

    if (_this) {
        ((c_octet *)_this)[0] = byte0;
        ((c_octet *)_this)[1] = byte1;
        src = (c_octet *)&wqos->transport.v.value;
        dst = (c_octet *)&((c_octet *)_this)[2];
        _COPY4_(dst,src);

        if (strength_offset) {
            src = (c_octet *)&wqos->strength.v.value;
            dst = (c_octet *)&((c_octet *)_this)[strength_offset];
            _COPY4_(dst,src);
        }
        if (latency_offset) {
            tdur = v_durationFromOsDuration(wqos->latency.v.duration);
            src = (c_octet *)&tdur;
            dst = (c_octet *)&((c_octet *)_this)[latency_offset];
            _COPY8_(dst,src);
        }
        if (deadline_offset) {
            tdur = v_durationFromOsDuration(wqos->deadline.v.period);
            src = (c_octet *)&tdur;
            dst = (c_octet *)&((c_octet *)_this)[deadline_offset];
            _COPY8_(dst,src);
        }
        if (liveliness_offset) {
            tdur = v_durationFromOsDuration(wqos->liveliness.v.lease_duration);
            src = (c_octet *)&tdur;
            dst = (c_octet *)&((c_octet *)_this)[liveliness_offset];
            _COPY8_(dst,src);
        }
        if (lifespan_offset) {
            tdur = v_durationFromOsDuration(wqos->lifespan.v.duration);
            src = (c_octet *)&tdur;
            dst = (c_octet *)&((c_octet *)_this)[lifespan_offset];
            _COPY8_(dst,src);
        }
    } else {
        OS_REPORT(OS_CRITICAL,
                  "v_messageQos_new",V_RESULT_INTERNAL_ERROR,
                  "Failed to allocate messageQos.");
        assert(FALSE);
    }
    return _this;
}
Пример #5
0
c_bool
v_messageQos_isReaderCompatible (
    v_messageQos _this,
    v_reader r)
{
    v_duration duration;
    c_octet *dst, *src;
    c_long offset;
    v_readerQos qos;

    qos = r->qos;
    if (_this == NULL) {
        /* Messages without Qos are implied lifecycle changes (for example resulting
         * from a call to the dispose_all_data operation on the topic) and should
         * always be delivered to all readers. Readers that have no corresponding
         * instance will automatically ignore these implied lifecycle changes.
         */
        return TRUE;
    }

    if ((qos->reliability.v.kind == V_RELIABILITY_RELIABLE) &&
        !v_messageQos_isReliable(_this)) {
        return FALSE;
    }
    if (qos->durability.v.kind > v_messageQos_durabilityKind(_this)) {
        return FALSE;
    }
    if (qos->ownership.v.kind != v_messageQos_ownershipKind(_this)) {
        return FALSE;
    }
    if (r->subQos->presentation.v.access_scope > v_messageQos_presentationKind(_this)) {
        return FALSE;
    }
    if ((r->subQos->presentation.v.ordered_access == TRUE) &&
        (!v_messageQos_isOrderedAccess(_this))) {
        return FALSE;
    }
    if ((r->subQos->presentation.v.coherent_access == TRUE) &&
        (!v_messageQos_isCoherentAccess(_this))) {
        return FALSE;
    }
    if (qos->liveliness.v.kind > v_messageQos_livelinessKind(_this)) {
        return FALSE;
    }
    if (qos->orderby.v.kind > v_messageQos_orderbyKind(_this)) {
        return FALSE;
    }

    dst = (c_octet *)&duration;

    offset = 6 + v_messageQos_strengthSize(_this);
    if (!v_messageQos_isZeroLatency(_this)) {
        if (!OS_DURATION_ISINFINITE(qos->latency.v.duration)) {
            src = &(((c_octet *)_this))[offset];
            _COPY8_(dst,src);
            if (os_durationCompare(v_durationToOsDuration(duration), qos->latency.v.duration) == OS_MORE) {
                return FALSE;
            }
        }
        offset += 8;
    }

    if (!OS_DURATION_ISINFINITE(qos->deadline.v.period)) {
        if (v_messageQos_isInfiniteDeadline(_this)) {
            return FALSE;
        } else {
            src = &(((c_octet *)_this))[offset];
            _COPY8_(dst,src);
            if (os_durationCompare(v_durationToOsDuration(duration), qos->deadline.v.period) == OS_MORE) {
                return FALSE;
            }
        }
    }
    offset += v_messageQos_deadlineSize(_this);

    if (!OS_DURATION_ISINFINITE(qos->liveliness.v.lease_duration)) {
        if (!v_messageQos_isInfiniteLiveliness(_this)) {
            src = &(((c_octet *)_this))[offset];
            _COPY8_(dst,src);
            if (os_durationCompare(v_durationToOsDuration(duration), qos->liveliness.v.lease_duration) == OS_MORE) {
                return FALSE;
            }
        }
    }
    return TRUE;
}