diff options
author | June McEnroe <june@causal.agency> | 2019-10-25 01:42:10 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-10-25 01:42:10 -0400 |
commit | b33e336cbd75a8f7810b14650e9ccf439dd4cebb (patch) | |
tree | e66dae6c08a941ebd53dbee2a926ea9388d0a68d | |
parent | Remove manual client naming from manual page (diff) | |
download | pounce-b33e336cbd75a8f7810b14650e9ccf439dd4cebb.tar.gz pounce-b33e336cbd75a8f7810b14650e9ccf439dd4cebb.zip |
Implement ringDiff and ringRead
-rw-r--r-- | bounce.h | 3 | ||||
-rw-r--r-- | ring.c | 44 |
2 files changed, 33 insertions, 14 deletions
diff --git a/bounce.h b/bounce.h index 4c0fefb..d81acf9 100644 --- a/bounce.h +++ b/bounce.h @@ -17,6 +17,7 @@ #include <stdbool.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <tls.h> #ifndef DEFAULT_CERT_PATH @@ -82,3 +83,5 @@ void stateSync(struct Client *client); void ringWrite(const char *line); size_t ringReader(const char *name); +size_t ringDiff(size_t reader); +const char *ringRead(time_t *time, size_t reader); diff --git a/ring.c b/ring.c index ff83cea..d3b04f6 100644 --- a/ring.c +++ b/ring.c @@ -41,25 +41,41 @@ void ringWrite(const char *line) { static struct { char **names; - size_t *reads; + size_t *ptrs; size_t cap, len; -} reader; +} read; size_t ringReader(const char *name) { - for (size_t i = 0; i < reader.len; ++i) { - if (!strcmp(reader.names[i], name)) return i; + for (size_t i = 0; i < read.len; ++i) { + if (!strcmp(read.names[i], name)) return i; } - if (reader.len == reader.cap) { - reader.cap = (reader.cap ? reader.cap * 2 : 8); - reader.names = realloc(reader.names, sizeof(*reader.names) * reader.cap); - if (!reader.names) err(EX_OSERR, "realloc"); - reader.reads = realloc(reader.reads, sizeof(*reader.reads) * reader.cap); - if (!reader.reads) err(EX_OSERR, "realloc"); + if (read.len == read.cap) { + read.cap = (read.cap ? read.cap * 2 : 8); + read.names = realloc(read.names, sizeof(*read.names) * read.cap); + if (!read.names) err(EX_OSERR, "realloc"); + read.ptrs = realloc(read.ptrs, sizeof(*read.ptrs) * read.cap); + if (!read.ptrs) err(EX_OSERR, "realloc"); } - reader.names[reader.len] = strdup(name); - if (!reader.names[reader.len]) err(EX_OSERR, "strdup"); - reader.reads[reader.len] = 0; - return reader.len++; + read.names[read.len] = strdup(name); + if (!read.names[read.len]) err(EX_OSERR, "strdup"); + read.ptrs[read.len] = 0; + return read.len++; +} + +size_t ringDiff(size_t reader) { + assert(reader < read.len); + return ring.write - read.ptrs[reader]; +} + +const char *ringRead(time_t *time, size_t reader) { + assert(reader < read.len); + if (!ringDiff(reader)) return NULL; + if (ringDiff(reader) > RingLen) { + read.ptrs[reader] = ring.write - RingLen; + } + size_t i = read.ptrs[reader]++ % RingLen; + if (time) *time = ring.times[i]; + return ring.lines[i]; } |