summaryrefslogtreecommitdiff
path: root/io_muxer.c
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2022-12-25 13:50:41 +0100
committerMikhail Burakov <mburakov@mailbox.org>2022-12-25 13:50:41 +0100
commitd58fcf64d9e7a3f309a706ce6a81eb9a41eb5348 (patch)
tree56ce15a6d0a006d8c8d5e01144216d8d2d46e5f0 /io_muxer.c
parent3f1e645ee1410d90b493b2e0034e25d68bd0d3eb (diff)
Cosmetic rework of toolbox
Diffstat (limited to 'io_muxer.c')
-rw-r--r--io_muxer.c70
1 files changed, 39 insertions, 31 deletions
diff --git a/io_muxer.c b/io_muxer.c
index 919ac43..17b32a9 100644
--- a/io_muxer.c
+++ b/io_muxer.c
@@ -18,27 +18,28 @@
#include "io_muxer.h"
#include <poll.h>
+#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
-struct IoMuxer_Closure {
- void (*callback)(void*);
+struct IoMuxerTask {
+ void (*fun)(void*);
void* user;
};
-static _Bool AppendRecord(struct IoMuxer* io_muxer) {
- if (io_muxer->size < io_muxer->alloc) return 1;
+static bool AppendRecord(struct IoMuxer* io_muxer) {
+ if (io_muxer->size < io_muxer->alloc) return true;
size_t alloc = io_muxer->alloc + 1;
struct pollfd* pfds = realloc(io_muxer->pfds, alloc * sizeof(struct pollfd));
- if (!pfds) return 0;
+ if (!pfds) return false;
io_muxer->pfds = pfds;
- struct IoMuxer_Closure* closures =
- realloc(io_muxer->closures, alloc * sizeof(struct IoMuxer_Closure));
- if (!closures) return 0;
- io_muxer->closures = closures;
+ struct IoMuxerTask* tasks =
+ realloc(io_muxer->tasks, alloc * sizeof(struct IoMuxerTask));
+ if (!tasks) return false;
+ io_muxer->tasks = tasks;
io_muxer->alloc = alloc;
- return 1;
+ return true;
}
static void CompressRecords(struct IoMuxer* io_muxer) {
@@ -53,51 +54,58 @@ static void CompressRecords(struct IoMuxer* io_muxer) {
struct pollfd pfd = io_muxer->pfds[forward];
io_muxer->pfds[forward] = io_muxer->pfds[reverse];
io_muxer->pfds[reverse] = pfd;
- struct IoMuxer_Closure closure = io_muxer->closures[forward];
- io_muxer->closures[forward] = io_muxer->closures[reverse];
- io_muxer->closures[reverse] = closure;
+ struct IoMuxerTask task = io_muxer->tasks[forward];
+ io_muxer->tasks[forward] = io_muxer->tasks[reverse];
+ io_muxer->tasks[reverse] = task;
}
}
-void IoMuxer_Create(struct IoMuxer* io_muxer) {
+void IoMuxerCreate(struct IoMuxer* io_muxer) {
memset(io_muxer, 0, sizeof(struct IoMuxer));
}
-int IoMuxer_OnRead(struct IoMuxer* io_muxer, int fd,
- void (*read_callback)(void*), void* user) {
- if (!AppendRecord(io_muxer)) return -1;
+bool IoMuxerOnRead(struct IoMuxer* io_muxer, int fd, void (*fun)(void*),
+ void* user) {
+ if (!AppendRecord(io_muxer)) return false;
struct pollfd pfd = {.fd = fd, .events = POLLIN};
- struct IoMuxer_Closure closure = {.callback = read_callback, .user = user};
+ struct IoMuxerTask task = {.fun = fun, .user = user};
io_muxer->pfds[io_muxer->size] = pfd;
- io_muxer->closures[io_muxer->size] = closure;
+ io_muxer->tasks[io_muxer->size] = task;
io_muxer->size++;
- return 0;
+ return true;
}
-int IoMuxer_OnWrite(struct IoMuxer* io_muxer, int fd,
- void (*write_callback)(void*), void* user) {
- if (!AppendRecord(io_muxer)) return -1;
+bool IoMuxerOnWrite(struct IoMuxer* io_muxer, int fd, void (*fun)(void*),
+ void* user) {
+ if (!AppendRecord(io_muxer)) return false;
struct pollfd pfd = {.fd = fd, .events = POLLOUT};
- struct IoMuxer_Closure closure = {.callback = write_callback, .user = user};
+ struct IoMuxerTask task = {.fun = fun, .user = user};
io_muxer->pfds[io_muxer->size] = pfd;
- io_muxer->closures[io_muxer->size] = closure;
+ io_muxer->tasks[io_muxer->size] = task;
io_muxer->size++;
- return 0;
+ return true;
}
-int IoMuxer_Iterate(struct IoMuxer* io_muxer, int timeout) {
+enum IoMuxerResult IoMuxerIterate(struct IoMuxer* io_muxer, int timeout) {
for (;;) {
CompressRecords(io_muxer);
int result = poll(io_muxer->pfds, io_muxer->size, timeout);
- if (result <= 0) return result;
+ switch (result) {
+ case -1:
+ return kIoMuxerResultError;
+ case 0:
+ return kIoMuxerResultTimeout;
+ default:
+ break;
+ }
for (size_t i = 0; i < io_muxer->size; i++) {
if (io_muxer->pfds[i].revents)
- io_muxer->closures[i].callback(io_muxer->closures[i].user);
+ io_muxer->tasks[i].fun(io_muxer->tasks[i].user);
}
}
}
-void IoMuxer_Destroy(struct IoMuxer* io_muxer) {
+void IoMuxerDestroy(struct IoMuxer* io_muxer) {
free(io_muxer->pfds);
- free(io_muxer->closures);
+ free(io_muxer->tasks);
}