* 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
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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);
 |