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) {
='logmsg'> 2021-02-07Add bindings for brightness controlJune McEnroe Weirdly the Fn key doesn't change how the F row registers... I wonder if I can do something about that. 2021-02-07Set X key repeat rateJune McEnroe 2021-02-07Bump font size to 12June McEnroe 11 is what I use on macOS, but I feel like my eyes are working harder here. 2021-02-07Fully configure and rebind cwmJune McEnroe This is sort of a mix of trying to emulate macOS somewhat for my muscle memory and just rebinding some of the cwm defaults to use 4- rather than M-. 2021-02-07Add BintiJune McEnroe 2021-02-07Finish configuring xtermJune McEnroe 2021-02-06Enable tapping, reverse scroll, set scaling in wsconsctlJune McEnroe 2021-02-06Set root window to black on purple snowJune McEnroe 2021-02-06Add xmodmap configurationJune McEnroe 2021-02-06Add initial OpenBSD X configurationJune McEnroe cwm still needs a lot more rebinding, and I need to actually look at its other options. xterm definitely still needs some configuration, but I at least managed to get it to use a decent looking font. Very happy that OpenBSD includes Luxi Mono, which is what my usual font, Go Mono, is based on anyway. Still missing is xmodmap and such. 2021-02-06Add xterm output to schemeJune McEnroe