poll.c

Cross-platform polling library for C
git clone git://git.finwo.net/lib/poll.c
Log | Files | Refs | README

commit e88ca880aad4e6e8fd84d684d002157553c30383
parent e0d665c8f6b8652b5c621f7a3c4eadf80502d608
Author: Yersa Nordman <yersa@finwo.nl>
Date:   Sat, 30 Dec 2023 23:58:56 +0100

udata implementation

Diffstat:
Msrc/fpoll.c | 22+++++++++++-----------
Msrc/fpoll.h | 1+
2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/fpoll.c b/src/fpoll.c @@ -6,19 +6,14 @@ #include "fpoll.h" -/* struct fpoll { */ -/* struct pollfd *fds; */ -/* int size; */ -/* int limit; */ -/* }; */ - struct fpoll * fpoll_create() { struct fpoll *output = calloc(1, sizeof(struct fpoll)); return output; } FPOLL_STATUS fpoll_close(struct fpoll *descriptor) { - if (descriptor->fds) free(descriptor->fds); + if (descriptor->fds ) free(descriptor->fds); + if (descriptor->udata) free(descriptor->udata); free(descriptor); return FPOLL_STATUS_OK; } @@ -38,8 +33,9 @@ int fpoll_wait(struct fpoll *descriptor, struct fpoll_ev *evs, int max_evs, int if (!(descriptor->fds[i].revents)) continue; // Convert event to our standard - evs[c].fd = descriptor->fds[i].fd; - evs[c].ev = descriptor->fds[i].revents; + evs[c].fd = descriptor->fds[i].fd; + evs[c].ev = descriptor->fds[i].revents; + evs[c].udata = descriptor->udata[i]; // Reset the origin descriptor->fds[i].revents = 0; @@ -66,12 +62,14 @@ FPOLL_STATUS fpoll_add(struct fpoll *descriptor, FPOLL_EVENT events, FPOLL_FD fi if (!descriptor->fds) { descriptor->limit = 4; descriptor->fds = calloc(descriptor->limit, sizeof(struct pollfd)); + descriptor->udata = calloc(descriptor->limit, sizeof(void * )); } // Grow alloc if (descriptor->limit < (descriptor->size + 1)) { descriptor->limit = descriptor->limit * 2; - descriptor->fds = realloc(descriptor->fds, descriptor->limit); + descriptor->fds = realloc(descriptor->fds , descriptor->limit * sizeof(struct pollfd)); + descriptor->udata = realloc(descriptor->udata, descriptor->limit * sizeof(void * )); } // Find the filedescriptor in the list @@ -85,6 +83,7 @@ FPOLL_STATUS fpoll_add(struct fpoll *descriptor, FPOLL_EVENT events, FPOLL_FD fi // Assign a new pollfd if needed if (!pfd) { + descriptor->udata[descriptor->size] = udata; pfd = &(descriptor->fds[descriptor->size]); descriptor->size = descriptor->size + 1; pfd->fd = filedescriptor; @@ -122,7 +121,8 @@ FPOLL_STATUS fpoll_del(struct fpoll *descriptor, FPOLL_EVENT events, FPOLL_FD fi // Remove fd from list if it has no events if (!pfd->events) { if ((i + 1) < descriptor->size) { - memmove(&(descriptor->fds[i]), &(descriptor->fds[i+1]), (descriptor->size - i) * sizeof(struct pollfd)); + memmove(&(descriptor->fds[i] ), &(descriptor->fds[i+1] ), (descriptor->size - i) * sizeof(struct pollfd)); + memmove(&(descriptor->udata[i]), &(descriptor->udata[i+1]), (descriptor->size - i) * sizeof(void * )); } descriptor->size -= 1; } diff --git a/src/fpoll.h b/src/fpoll.h @@ -24,6 +24,7 @@ struct fpoll { struct pollfd *fds; + void **udata; int size; int limit; int remaining;