diff options
author | Ludovic Courtès <ludo@gnu.org> | 2024-01-08 23:12:30 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2024-01-08 23:13:53 +0100 |
commit | 766ac72dba36657ce217d055d7672cbf01bd32ce (patch) | |
tree | bb6b0925e1b564ec14643a6557b0d7ca3867388c /gnu/packages/patches | |
parent | 519e1e3eb88ec532fc83ebb742d9919269b57c87 (diff) | |
download | guix-766ac72dba36657ce217d055d7672cbf01bd32ce.tar.gz guix-766ac72dba36657ce217d055d7672cbf01bd32ce.zip |
gnu: guile-fibers: Apply upstream patch fixing libevent timers.
* gnu/packages/patches/guile-fibers-libevent-timeout.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/guile-xyz.scm (guile-fibers)[source]: Use it.
Change-Id: I872ffe5b193087234d29eed399d6db518c5af4d5
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r-- | gnu/packages/patches/guile-fibers-libevent-timeout.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/gnu/packages/patches/guile-fibers-libevent-timeout.patch b/gnu/packages/patches/guile-fibers-libevent-timeout.patch new file mode 100644 index 0000000000..c33678eea3 --- /dev/null +++ b/gnu/packages/patches/guile-fibers-libevent-timeout.patch @@ -0,0 +1,61 @@ +commit 2ca397bfcca94c106380368b5b0ce920b0a62a95 +Author: Ludovic Courtès <ludo@gnu.org> +Date: Sat Jan 6 16:22:45 2024 +0100 + + libevent: Fix computation of the timeout value. + +diff --git a/extensions/libevent.c b/extensions/libevent.c +index 134460a..62e50a3 100644 +--- a/extensions/libevent.c ++++ b/extensions/libevent.c +@@ -192,30 +192,27 @@ scm_primitive_resize (SCM lst, SCM eventsv) + } + #undef FUNC_NAME + +-static uint64_t time_units_per_microsec; ++static uint64_t time_units_per_microsec, microsec_per_time_units; + + static void* + run_event_loop (void *p) + #define FUNC_NAME "primitive-event-loop" + { +- int ret = 0; +- int microsec = 0; +- struct timeval tv; +- ++ int ret; + struct loop_data *data = p; + +- if (data->timeout < 0) +- microsec = -1; +- else if (data->timeout >= 0) ++ if (data->timeout >= 0) + { +- microsec = (time_units_per_microsec == 0) +- ? 0 : data->timeout / time_units_per_microsec; +- tv.tv_sec = 0; +- tv.tv_usec = microsec; +- } ++ struct timeval tv; ++ ++ tv.tv_sec = data->timeout / scm_c_time_units_per_second; ++ tv.tv_usec = ++ time_units_per_microsec > 0 ++ ? ((data->timeout % scm_c_time_units_per_second) ++ / time_units_per_microsec) ++ : ((data->timeout % scm_c_time_units_per_second) ++ * microsec_per_time_units); + +- if (microsec >= 0) +- { + ret = event_base_loopexit (data->base, &tv); + if (ret == -1) + SCM_MISC_ERROR ("event loop exit failed", SCM_EOL); +@@ -307,6 +304,7 @@ void + init_fibers_libevt (void) + { + time_units_per_microsec = scm_c_time_units_per_second / 1000000; ++ microsec_per_time_units = 1000000 / scm_c_time_units_per_second; + + scm_c_define_gsubr ("primitive-event-wake", 1, 0, 0, + scm_primitive_event_wake); |