From 967e6ef5b3a68de9e40acfb2814d9598edd63c6b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 19 Nov 2017 13:51:48 +0100 Subject: [PATCH] use poll() instead of select() --- src/hal/ethernet/bsd/ethernet_bsd.c | 41 +++++++++++++------------ src/hal/ethernet/linux/ethernet_linux.c | 32 +++++++++---------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/hal/ethernet/bsd/ethernet_bsd.c b/src/hal/ethernet/bsd/ethernet_bsd.c index fdb395d0..51ac3901 100644 --- a/src/hal/ethernet/bsd/ethernet_bsd.c +++ b/src/hal/ethernet/bsd/ethernet_bsd.c @@ -22,7 +22,7 @@ */ #include #include -#include +#include #include #include #include @@ -48,8 +48,8 @@ struct sEthernetSocket { }; struct sEthernetHandleSet { - fd_set handles; - int maxHandle; + struct pollfd *handles; + int nhandles; }; EthernetHandleSet @@ -58,20 +58,22 @@ EthernetHandleSet_new(void) EthernetHandleSet result = (EthernetHandleSet) GLOBAL_MALLOC(sizeof(struct sEthernetHandleSet)); if (result != NULL) { - FD_ZERO(&result->handles); - result->maxHandle = -1; + result->handles = NULL; + result->nhandles = 0; } + return result; } void EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock) { - if (self != NULL && sock != NULL && sock->bpf != -1) { - FD_SET(sock->bpf, &self->handles); - if (sock->bpf > self->maxHandle) { - self->maxHandle = sock->bpf; - } + if (self != NULL && sock != NULL) { + int i = self->nhandles++; + self->handles = realloc(self->handles, self->nhandles * sizeof(struct pollfd)); + + self->handles[i].fd = sock->bpf; + self->handles[i].events = POLLIN; } } @@ -80,25 +82,24 @@ EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) { int result; - if ((self != NULL) && (self->maxHandle >= 0)) { - struct timeval timeout; - - timeout.tv_sec = timeoutMs / 1000; - timeout.tv_usec = (timeoutMs % 1000) * 1000; - result = select(self->maxHandle + 1, &self->handles, NULL, NULL, &timeout); - } else { - result = -1; + if ((self != NULL) && (self->nhandles >= 0)) { + result = poll(self->handles, self->nhandles, timeoutMs); + } + else { + result = -1; } - + return result; } void EthernetHandleSet_destroy(EthernetHandleSet self) { + if (self->nhandles) + free(self->handles); + GLOBAL_FREEMEM(self); } - int activateBpdFilter(EthernetSocket self) { diff --git a/src/hal/ethernet/linux/ethernet_linux.c b/src/hal/ethernet/linux/ethernet_linux.c index a2e3e8c9..5de14d34 100644 --- a/src/hal/ethernet/linux/ethernet_linux.c +++ b/src/hal/ethernet/linux/ethernet_linux.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include @@ -42,8 +42,8 @@ struct sEthernetSocket { }; struct sEthernetHandleSet { - fd_set handles; - int maxHandle; + struct pollfd *handles; + int nhandles; }; EthernetHandleSet @@ -52,8 +52,8 @@ EthernetHandleSet_new(void) EthernetHandleSet result = (EthernetHandleSet) GLOBAL_MALLOC(sizeof(struct sEthernetHandleSet)); if (result != NULL) { - FD_ZERO(&result->handles); - result->maxHandle = -1; + result->handles = NULL; + result->nhandles = 0; } return result; @@ -62,11 +62,12 @@ EthernetHandleSet_new(void) void EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock) { - if (self != NULL && sock != NULL && sock->rawSocket != -1) { - FD_SET(sock->rawSocket, &self->handles); - if (sock->rawSocket > self->maxHandle) { - self->maxHandle = sock->rawSocket; - } + if (self != NULL && sock != NULL) { + int i = self->nhandles++; + self->handles = realloc(self->handles, self->nhandles * sizeof(struct pollfd)); + + self->handles[i].fd = sock->rawSocket; + self->handles[i].events = POLLIN; } } @@ -75,12 +76,8 @@ EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) { int result; - if ((self != NULL) && (self->maxHandle >= 0)) { - struct timeval timeout; - - timeout.tv_sec = timeoutMs / 1000; - timeout.tv_usec = (timeoutMs % 1000) * 1000; - result = select(self->maxHandle + 1, &self->handles, NULL, NULL, &timeout); + if ((self != NULL) && (self->nhandles >= 0)) { + result = poll(self->handles, self->nhandles, timeoutMs); } else { result = -1; @@ -92,6 +89,9 @@ EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) void EthernetHandleSet_destroy(EthernetHandleSet self) { + if (self->nhandles) + free(self->handles); + GLOBAL_FREEMEM(self); }