unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob c33678eea3b294b834bb321c2d1069357130a7b6 1763 bytes (raw)
name: packages/patches/guile-fibers-libevent-timeout.patch 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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);

debug log:

solving c33678eea3b294b834bb321c2d1069357130a7b6 ...
found c33678eea3b294b834bb321c2d1069357130a7b6 in https://git.savannah.gnu.org/cgit/guix.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).