From 0fb14810382b5a7aad010c7a1ac779f839977744 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 5 Jul 2019 09:34:51 +0530 Subject: [PATCH] Move event loop wakeup code into backend_utils --- glfw/backend_utils.c | 41 +++++++++++++++++++++++++++-------------- glfw/backend_utils.h | 5 +++-- glfw/wl_init.c | 14 +++++--------- glfw/wl_window.c | 2 +- glfw/x11_init.c | 14 +++++--------- glfw/x11_window.c | 2 +- 6 files changed, 42 insertions(+), 36 deletions(-) diff --git a/glfw/backend_utils.c b/glfw/backend_utils.c index afae54c38..f681cb469 100644 --- a/glfw/backend_utils.c +++ b/glfw/backend_utils.c @@ -11,6 +11,8 @@ #include #include +#include +#include #include #include #include @@ -225,12 +227,34 @@ drain_wakeup_fd(int fd, int events UNUSED, void* data UNUSED) { while(read(fd, drain_buf, sizeof(drain_buf)) < 0 && errno == EINTR); } -void -initPollData(EventLoopData *eld, int wakeup_fd, int display_fd) { +bool +initPollData(EventLoopData *eld, int display_fd) { + if (pipe2(eld->wakeupFds, O_CLOEXEC | O_NONBLOCK) != 0) return false; addWatch(eld, "display", display_fd, POLLIN, 1, NULL, NULL); - addWatch(eld, "wakeup", wakeup_fd, POLLIN, 1, drain_wakeup_fd, NULL); + addWatch(eld, "wakeup", eld->wakeupFds[0], POLLIN, 1, drain_wakeup_fd, NULL); + return true; } +void +wakeupEventLoop(EventLoopData *eld) { + while (write(eld->wakeupFds[1], "w", 1) < 0 && errno == EINTR); +} + +static void +closeFds(int *fds, size_t count) { + while(count--) { + if (*fds > 0) { + close(*fds); + *fds = -1; + } + fds++; + } +} + +void +finalizePollData(EventLoopData *eld) { + closeFds(eld->wakeupFds, arraysz(eld->wakeupFds)); +} int pollForEvents(EventLoopData *eld, double timeout) { @@ -270,17 +294,6 @@ pollForEvents(EventLoopData *eld, double timeout) { return read_ok; } -void -closeFds(int *fds, size_t count) { - while(count--) { - if (*fds > 0) { - close(*fds); - *fds = -1; - } - fds++; - } -} - // Splits and translates a text/uri-list into separate file paths // NOTE: This function destroys the provided string // diff --git a/glfw/backend_utils.h b/glfw/backend_utils.h index dc3e0e6ee..66e0434bd 100644 --- a/glfw/backend_utils.h +++ b/glfw/backend_utils.h @@ -75,6 +75,7 @@ double prepareForPoll(EventLoopData *eld, double timeout); int pollWithTimeout(struct pollfd *fds, nfds_t nfds, double timeout); int pollForEvents(EventLoopData *eld, double timeout); unsigned dispatchTimers(EventLoopData *eld); -void closeFds(int *fds, size_t count); -void initPollData(EventLoopData *eld, int wakeup_fd, int display_fd); +void finalizePollData(EventLoopData *eld); +bool initPollData(EventLoopData *eld, int display_fd); char** parseUriList(char* text, int* count); +void wakeupEventLoop(EventLoopData *eld); diff --git a/glfw/wl_init.c b/glfw/wl_init.c index f4c0b93ad..767ade657 100644 --- a/glfw/wl_init.c +++ b/glfw/wl_init.c @@ -685,13 +685,6 @@ glfwWaylandCheckForServerSideDecorations(void) { int _glfwPlatformInit(void) { - if (pipe2(_glfw.wl.eventLoopData.wakeupFds, O_CLOEXEC | O_NONBLOCK) != 0) - { - _glfwInputError(GLFW_PLATFORM_ERROR, - "Wayland: failed to create self pipe"); - return false; - } - _glfw.wl.cursor.handle = _glfw_dlopen("libwayland-cursor.so.0"); if (!_glfw.wl.cursor.handle) { @@ -724,7 +717,10 @@ int _glfwPlatformInit(void) "Wayland: Failed to connect to display"); return false; } - initPollData(&_glfw.wl.eventLoopData, _glfw.wl.eventLoopData.wakeupFds[0], wl_display_get_fd(_glfw.wl.display)); + if (!initPollData(&_glfw.wl.eventLoopData, wl_display_get_fd(_glfw.wl.display))) { + _glfwInputError(GLFW_PLATFORM_ERROR, + "Wayland: Failed to initialize event loop data"); + } glfw_dbus_init(&_glfw.wl.dbus, &_glfw.wl.eventLoopData); _glfw.wl.keyRepeatInfo.keyRepeatTimer = addTimer(&_glfw.wl.eventLoopData, "wayland-key-repeat", 0.5, 0, true, dispatchPendingKeyRepeats, NULL, NULL); _glfw.wl.cursorAnimationTimer = addTimer(&_glfw.wl.eventLoopData, "wayland-cursor-animation", 0.5, 0, true, animateCursorImage, NULL, NULL); @@ -852,7 +848,7 @@ void _glfwPlatformTerminate(void) wl_display_flush(_glfw.wl.display); wl_display_disconnect(_glfw.wl.display); } - closeFds(_glfw.wl.eventLoopData.wakeupFds, sizeof(_glfw.wl.eventLoopData.wakeupFds)/sizeof(_glfw.wl.eventLoopData.wakeupFds[0])); + finalizePollData(&_glfw.wl.eventLoopData); free(_glfw.wl.clipboardString); _glfw.wl.clipboardString = NULL; free(_glfw.wl.primarySelectionString); _glfw.wl.primarySelectionString = NULL; free(_glfw.wl.pasteString); _glfw.wl.pasteString = NULL; diff --git a/glfw/wl_window.c b/glfw/wl_window.c index f997f409c..ad268ad1e 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -1229,7 +1229,7 @@ void _glfwPlatformWaitEventsTimeout(double timeout) void _glfwPlatformPostEmptyEvent(void) { - while (write(_glfw.wl.eventLoopData.wakeupFds[1], "w", 1) < 0 && errno == EINTR); + wakeupEventLoop(&_glfw.wl.eventLoopData); } void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos) diff --git a/glfw/x11_init.c b/glfw/x11_init.c index bbb5c8b76..924a7ce13 100644 --- a/glfw/x11_init.c +++ b/glfw/x11_init.c @@ -588,13 +588,6 @@ int _glfwPlatformInit(void) XInitThreads(); XrmInitialize(); - if (pipe2(_glfw.x11.eventLoopData.wakeupFds, O_CLOEXEC | O_NONBLOCK) != 0) - { - _glfwInputError(GLFW_PLATFORM_ERROR, - "X11: failed to create self pipe"); - return false; - } - _glfw.x11.display = XOpenDisplay(NULL); if (!_glfw.x11.display) { @@ -613,7 +606,10 @@ int _glfwPlatformInit(void) return false; } - initPollData(&_glfw.x11.eventLoopData, _glfw.x11.eventLoopData.wakeupFds[0], ConnectionNumber(_glfw.x11.display)); + if (!initPollData(&_glfw.x11.eventLoopData, ConnectionNumber(_glfw.x11.display))) { + _glfwInputError(GLFW_PLATFORM_ERROR, + "X11: Failed to initialize event loop data"); + } glfw_dbus_init(&_glfw.x11.dbus, &_glfw.x11.eventLoopData); _glfw.x11.screen = DefaultScreen(_glfw.x11.display); @@ -722,7 +718,7 @@ void _glfwPlatformTerminate(void) #if defined(__linux__) _glfwTerminateJoysticksLinux(); #endif - closeFds(_glfw.x11.eventLoopData.wakeupFds, sizeof(_glfw.x11.eventLoopData.wakeupFds)/sizeof(_glfw.x11.eventLoopData.wakeupFds[0])); + finalizePollData(&_glfw.x11.eventLoopData); } const char* _glfwPlatformGetVersionString(void) diff --git a/glfw/x11_window.c b/glfw/x11_window.c index 6415141fa..935f6f55a 100644 --- a/glfw/x11_window.c +++ b/glfw/x11_window.c @@ -2537,7 +2537,7 @@ void _glfwPlatformWaitEventsTimeout(double timeout) void _glfwPlatformPostEmptyEvent(void) { - while (write(_glfw.x11.eventLoopData.wakeupFds[1], "w", 1) < 0 && errno == EINTR); + wakeupEventLoop(&_glfw.x11.eventLoopData); } void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)