stepcompress: Invert the meaning of the min_clock flag

Use a non-zero qm->min_clock value to indicate that the command uses
the move queue and to also store the clock of when that move queue
item will be released.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2016-11-01 23:11:27 -04:00
parent ff6fef927a
commit 8025921fc8
1 changed files with 10 additions and 12 deletions

View File

@ -360,7 +360,7 @@ stepcompress_flush(struct stepcompress *sc, uint64_t move_clock)
sc->queue_step_msgid, sc->oid, move.interval, move.count, move.add
};
struct queue_message *qm = message_alloc_and_encode(msg, 5);
qm->req_clock = sc->last_step_clock;
qm->min_clock = qm->req_clock = sc->last_step_clock;
list_add_tail(&qm->node, &sc->msg_queue);
uint32_t addfactor = move.count*(move.count-1)/2;
@ -389,7 +389,6 @@ stepcompress_queue_msg(struct stepcompress *sc, uint32_t *data, int len)
stepcompress_flush(sc, UINT64_MAX);
struct queue_message *qm = message_alloc_and_encode(data, len);
qm->min_clock = -1;
qm->req_clock = sc->last_step_clock;
list_add_tail(&qm->node, &sc->msg_queue);
}
@ -483,7 +482,6 @@ steppersync_flush(struct steppersync *ss, uint64_t move_clock)
// Order commands by the reqclock of each pending command
struct list_head msgs;
list_init(&msgs);
uint64_t min_clock = ss->move_clocks[0];
for (;;) {
// Find message with lowest reqclock
uint64_t req_clock = MAX_CLOCK;
@ -499,17 +497,17 @@ steppersync_flush(struct steppersync *ss, uint64_t move_clock)
}
}
}
if (!qm || (!qm->min_clock && req_clock > move_clock))
if (!qm || (qm->min_clock && req_clock > move_clock))
break;
// Set the min_clock for this command
if (!qm->min_clock) {
qm->min_clock = min_clock;
heap_replace(ss, req_clock);
min_clock = ss->move_clocks[0];
} else {
qm->min_clock = min_clock;
}
uint64_t next_avail = ss->move_clocks[0];
if (qm->min_clock)
// The qm->min_clock field is overloaded to indicate that
// the command uses the 'move queue' and to store the time
// that move queue item becomes available.
heap_replace(ss, qm->min_clock);
// Reset the min_clock to its normal meaning (minimum transmit time)
qm->min_clock = next_avail;
// Batch this command
list_del(&qm->node);