aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorN-R-K <nrk@disroot.org>2022-04-28 03:12:15 +0000
committerGitHub <noreply@github.com>2022-04-28 03:12:15 +0000
commit6922d5d01b03b0f584a411803d2da45b07f5af01 (patch)
treea4977ced8afe9c376030d09f1cb7eba2e70bb241
parent5bb1df4af3a221ad65a95cf5f86b554dab2917b1 (diff)
replace select() with poll() (#270)
usage of select (3) in modern programs is typically discouraged. this simply replaces the select call with poll (3) instead. and since poll conveniently ignores negative fds, this also reduces needs for some special casing. this also handles error if they occur, while old implementation didn't. other than the error handling, no change in functionality should occur.
-rw-r--r--main.c31
-rw-r--r--nsxiv.h1
2 files changed, 14 insertions, 18 deletions
diff --git a/main.c b/main.c
index e3ee016..686fc60 100644
--- a/main.c
+++ b/main.c
@@ -29,7 +29,7 @@
#include <errno.h>
#include <locale.h>
#include <signal.h>
-#include <sys/select.h>
+#include <poll.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <time.h>
@@ -701,9 +701,9 @@ static void on_buttonpress(const XButtonEvent *bev)
static void run(void)
{
- int xfd;
- fd_set fds;
- struct timeval timeout;
+ enum { FD_X, FD_INFO, FD_ARL, FD_CNT };
+ struct pollfd pfd[FD_CNT];
+ struct timeval timeout = {0};
const struct timespec ten_ms = {0, 10000000};
bool discard, init_thumb, load_thumb, to_set;
XEvent ev, nextev;
@@ -730,21 +730,16 @@ static void run(void)
if (!tns_load(&tns, tns.initnext, false, true))
remove_file(tns.initnext, false);
} else {
- xfd = ConnectionNumber(win.env.dpy);
- FD_ZERO(&fds);
- FD_SET(xfd, &fds);
- if (info.fd != -1) {
- FD_SET(info.fd, &fds);
- xfd = MAX(xfd, info.fd);
- }
- if (arl.fd != -1) {
- FD_SET(arl.fd, &fds);
- xfd = MAX(xfd, arl.fd);
- }
- select(xfd + 1, &fds, 0, 0, to_set ? &timeout : NULL);
- if (info.fd != -1 && FD_ISSET(info.fd, &fds))
+ pfd[FD_X].fd = ConnectionNumber(win.env.dpy);
+ pfd[FD_INFO].fd = info.fd;
+ pfd[FD_ARL].fd = arl.fd;
+ pfd[FD_X].events = pfd[FD_INFO].events = pfd[FD_ARL].events = POLLIN;
+
+ if (poll(pfd, ARRLEN(pfd), to_set ? TV_TO_MS(&timeout) : -1) < 0)
+ continue;
+ if (pfd[FD_INFO].revents & POLLIN)
read_info();
- if (arl.fd != -1 && FD_ISSET(arl.fd, &fds)) {
+ if (pfd[FD_ARL].revents & POLLIN) {
if (arl_handle(&arl)) {
/* when too fast, imlib2 can't load the image */
nanosleep(&ten_ms, NULL);
diff --git a/nsxiv.h b/nsxiv.h
index 4350864..67c2185 100644
--- a/nsxiv.h
+++ b/nsxiv.h
@@ -44,6 +44,7 @@
#define TV_DIFF(t1,t2) (((t1)->tv_sec - (t2)->tv_sec ) * 1000 + \
((t1)->tv_usec - (t2)->tv_usec) / 1000)
+#define TV_TO_MS(tv) (((tv)->tv_sec * 1000) + ((tv)->tv_usec / 1000))
#define TV_SET_MSEC(tv,t) { \
(tv)->tv_sec = (t) / 1000; \