We fixed the comparison operation

This commit is contained in:
Quentin 2019-03-19 18:22:23 +01:00
parent d028638c95
commit 372aae6f61
2 changed files with 17 additions and 12 deletions

View file

@ -79,6 +79,7 @@ int set_timeout(struct evt_core_ctx* evts, uint64_t micro_sec, struct waited_pkt
fdinfo.cat = &cat; fdinfo.cat = &cat;
fdinfo.url = url; fdinfo.url = url;
printf("Will add a timeout of %ld ms\n", micro_sec);
if (clock_gettime(CLOCK_REALTIME, &now) == -1) { if (clock_gettime(CLOCK_REALTIME, &now) == -1) {
perror("clock_gettime"); perror("clock_gettime");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -120,6 +121,7 @@ void rr_pkt_register(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo,
} }
// 2. If packet arrived too late, we discard it // 2. If packet arrived too late, we discard it
printf("== %d > %d ? %d\n", rr->recv_id, bp->ip.ap.str.id - 1, ring_gt(rr->recv_id, bp->ip.ap.str.id - 1));
if (ring_gt(rr->recv_id, bp->ip.ap.str.id - 1)) { if (ring_gt(rr->recv_id, bp->ip.ap.str.id - 1)) {
// Packet has already been delivered or dropped, we free the buffer // Packet has already been delivered or dropped, we free the buffer
mv_buffer_wtor (app_ctx, fdinfo, bp); mv_buffer_wtor (app_ctx, fdinfo, bp);
@ -127,6 +129,7 @@ void rr_pkt_register(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo,
} }
// 3. If packet arrived too early, we register a timer // 3. If packet arrived too early, we register a timer
printf("== %d < %d ? %d\n", rr->recv_id, bp->ip.ap.str.id - 1, ring_lt(rr->recv_id, bp->ip.ap.str.id - 1));
if (ring_lt(rr->recv_id, bp->ip.ap.str.id - 1)) { if (ring_lt(rr->recv_id, bp->ip.ap.str.id - 1)) {
int64_t timeout = rr->mjit - (int64_t) bp->ip.ap.str.deltat; int64_t timeout = rr->mjit - (int64_t) bp->ip.ap.str.deltat;
if (timeout <= 0) timeout = 0; if (timeout <= 0) timeout = 0;
@ -362,6 +365,8 @@ int rr_on_timer(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
struct algo_ctx* app_ctx = fdinfo->cat->app_ctx; struct algo_ctx* app_ctx = fdinfo->cat->app_ctx;
struct rr_ctx* rr = app_ctx->misc; struct rr_ctx* rr = app_ctx->misc;
printf("Timer has been triggered\n");
struct waited_pkt* pkt = fdinfo->other; struct waited_pkt* pkt = fdinfo->other;
pkt->on = 0; pkt->on = 0;
evt_core_rm_fd(ctx, fdinfo->fd); evt_core_rm_fd(ctx, fdinfo->fd);

View file

@ -61,22 +61,22 @@ int ring_buffer_used_space(struct ring_buffer* rb) {
return RING_BUFFER_SIZE - ring_buffer_free_space (rb); return RING_BUFFER_SIZE - ring_buffer_free_space (rb);
} }
int ring_gt(uint16_t v1, uint16_t v2) { // Why we are using modulo, plus and modulo again:
int32_t vv1 = (int32_t) v1, vv2 = (int32_t) v2; // https://stackoverflow.com/a/1907585
return v1 != v2 && (vv1 - vv2) % UINT16_MAX <= UINT16_MAX / 2;
}
int ring_ge(uint16_t v1, uint16_t v2) { int ring_ge(uint16_t v1, uint16_t v2) {
int32_t vv1 = (int32_t) v1, vv2 = (int32_t) v2; uint32_t vv1 = (uint32_t) v1, vv2 = (uint32_t) v2;
return (vv1 - vv2) % UINT16_MAX <= UINT16_MAX / 2; return (((vv1 - vv2) % UINT16_MAX) + UINT16_MAX) % UINT16_MAX <= UINT16_MAX / 2;
} }
int ring_lt(uint16_t v1, uint16_t v2) { int ring_gt(uint16_t v1, uint16_t v2) {
int32_t vv1 = (int32_t) v1, vv2 = (int32_t) v2; if (v1 == v2) return 0;
return v1 != v2 && (vv1 - vv2) % UINT16_MAX > UINT16_MAX / 2; return ring_ge(v1,v2);
} }
int ring_le(uint16_t v1, uint16_t v2) { int ring_le(uint16_t v1, uint16_t v2) {
int32_t vv1 = (int32_t) v1, vv2 = (int32_t) v2; return ring_gt(v2, v1);
return (vv1 - vv2) % UINT16_MAX > UINT16_MAX / 2; }
int ring_lt(uint16_t v1, uint16_t v2) {
return ring_ge(v2, v1);
} }