diff options
author | June McEnroe <june@causal.agency> | 2019-10-27 22:42:33 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-10-27 22:42:33 -0400 |
commit | 766210d614f249cf04b84b691351d03047f36754 (patch) | |
tree | dc21d9ae2c851ff54be19da4c6b8bd4fa3451939 | |
parent | Set SO_REUSEADDR on binds (diff) | |
download | pounce-766210d614f249cf04b84b691351d03047f36754.tar.gz pounce-766210d614f249cf04b84b691351d03047f36754.zip |
Only increment consumer after successful send
Diffstat (limited to '')
-rw-r--r-- | bounce.h | 1 | ||||
-rw-r--r-- | client.c | 3 | ||||
-rw-r--r-- | ring.c | 10 |
3 files changed, 11 insertions, 3 deletions
diff --git a/bounce.h b/bounce.h index 4a04acf..e412358 100644 --- a/bounce.h +++ b/bounce.h @@ -59,6 +59,7 @@ static inline struct Message parse(char *line) { void ringProduce(const char *line); size_t ringConsumer(const char *name); size_t ringDiff(size_t consumer); +const char *ringPeek(time_t *time, size_t consumer); const char *ringConsume(time_t *time, size_t consumer); void ringInfo(void); diff --git a/client.c b/client.c index b5fb36a..2b075ec 100644 --- a/client.c +++ b/client.c @@ -259,7 +259,7 @@ size_t clientDiff(const struct Client *client) { void clientConsume(struct Client *client) { time_t time; - const char *line = ringConsume(&time, client->consumer); + const char *line = ringPeek(&time, client->consumer); if (!line) return; if (client->serverTime) { char ts[sizeof("YYYY-MM-DDThh:mm:ss.sssZ")]; @@ -269,4 +269,5 @@ void clientConsume(struct Client *client) { } else { clientFormat(client, "%s\r\n", line); } + if (!client->error) ringConsume(NULL, client->consumer); } diff --git a/ring.c b/ring.c index 912d0d3..409fcd4 100644 --- a/ring.c +++ b/ring.c @@ -70,17 +70,23 @@ size_t ringDiff(size_t consumer) { return ring.write - read.ptrs[consumer]; } -const char *ringConsume(time_t *time, size_t consumer) { +const char *ringPeek(time_t *time, size_t consumer) { assert(consumer < read.len); if (!ringDiff(consumer)) return NULL; if (ringDiff(consumer) > RingLen) { read.ptrs[consumer] = ring.write - RingLen; } - size_t i = read.ptrs[consumer]++ % RingLen; + size_t i = read.ptrs[consumer] % RingLen; if (time) *time = ring.times[i]; return ring.lines[i]; } +const char *ringConsume(time_t *time, size_t consumer) { + const char *line = ringPeek(time, consumer); + read.ptrs[consumer]++; + return line; +} + void ringInfo(void) { fprintf(stderr, "producer: %zu\n", ring.write); for (size_t i = 0; i < read.len; ++i) { |