mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-10-29 05:40:16 -04:00
event-loop: Use timespec utils instead of hand-rolling our own
Signed-off-by: Sebastian Wick <sebastian.wick@redhat.com>
This commit is contained in:
parent
893e4fc46d
commit
ff8b885523
1 changed files with 7 additions and 54 deletions
|
|
@ -38,6 +38,7 @@
|
|||
#include <sys/signalfd.h>
|
||||
#include <sys/timerfd.h>
|
||||
#include <unistd.h>
|
||||
#include "timespec-util.h"
|
||||
#include "wayland-util.h"
|
||||
#include "wayland-private.h"
|
||||
#include "wayland-server-core.h"
|
||||
|
|
@ -973,57 +974,6 @@ wl_event_loop_dispatch_idle(struct wl_event_loop *loop)
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
timespec_to_ms(struct timespec value)
|
||||
{
|
||||
return (value.tv_sec * 1000) + (value.tv_nsec / 1000000);
|
||||
}
|
||||
|
||||
static struct timespec
|
||||
ms_to_timespec(int ms)
|
||||
{
|
||||
struct timespec val;
|
||||
val.tv_sec = ms / 1000;
|
||||
val.tv_nsec = (ms % 1000) * 1000000;
|
||||
return val;
|
||||
}
|
||||
|
||||
static struct timespec
|
||||
timespec_normalize(struct timespec value)
|
||||
{
|
||||
struct timespec result = value;
|
||||
|
||||
while (result.tv_nsec >= 1000000000) {
|
||||
result.tv_nsec -= 1000000000;
|
||||
result.tv_sec++;
|
||||
}
|
||||
|
||||
while (result.tv_nsec < 0) {
|
||||
result.tv_nsec += 1000000000;
|
||||
result.tv_sec--;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct timespec
|
||||
timespec_add(struct timespec a, struct timespec b)
|
||||
{
|
||||
struct timespec result;
|
||||
result.tv_sec = a.tv_sec + b.tv_sec;
|
||||
result.tv_nsec = a.tv_nsec + b.tv_nsec;
|
||||
return timespec_normalize(result);
|
||||
}
|
||||
|
||||
static struct timespec
|
||||
timespec_sub(struct timespec a, struct timespec b)
|
||||
{
|
||||
struct timespec result;
|
||||
result.tv_sec = a.tv_sec - b.tv_sec;
|
||||
result.tv_nsec = a.tv_nsec - b.tv_nsec;
|
||||
return timespec_normalize(result);
|
||||
}
|
||||
|
||||
/** Wait for events and dispatch them
|
||||
*
|
||||
* \param loop The event loop whose sources to wait for.
|
||||
|
|
@ -1052,13 +1002,15 @@ wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout)
|
|||
int i, count;
|
||||
bool has_timers = false;
|
||||
bool use_timeout = timeout > 0;
|
||||
struct timespec now, end;
|
||||
struct timespec now;
|
||||
struct timespec deadline = {0};
|
||||
struct timespec result;
|
||||
|
||||
wl_event_loop_dispatch_idle(loop);
|
||||
|
||||
if (use_timeout) {
|
||||
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||
end = timespec_add(now, ms_to_timespec(timeout));
|
||||
timespec_add_msec(&deadline, &now, timeout);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
|
|
@ -1070,7 +1022,8 @@ wl_event_loop_dispatch(struct wl_event_loop *loop, int timeout)
|
|||
|
||||
if (use_timeout) {
|
||||
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||
timeout = timespec_to_ms(timespec_sub(end, now));
|
||||
timespec_sub(&result, &deadline, &now);
|
||||
timeout = timespec_to_msec(&result);
|
||||
if (timeout <= 0) {
|
||||
/* too late */
|
||||
count = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue