about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-10-27 22:42:33 -0400
committerJune McEnroe <june@causal.agency>2019-10-27 22:42:33 -0400
commit766210d614f249cf04b84b691351d03047f36754 (patch)
treedc21d9ae2c851ff54be19da4c6b8bd4fa3451939
parentSet SO_REUSEADDR on binds (diff)
downloadpounce-766210d614f249cf04b84b691351d03047f36754.tar.gz
pounce-766210d614f249cf04b84b691351d03047f36754.zip
Only increment consumer after successful send
-rw-r--r--bounce.h1
-rw-r--r--client.c3
-rw-r--r--ring.c10
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) {