Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On GNU/Hurd, 'time_units_per_microsec' is zero #86

Closed
civodul opened this issue Jun 6, 2023 · 1 comment · Fixed by #87
Closed

On GNU/Hurd, 'time_units_per_microsec' is zero #86

civodul opened this issue Jun 6, 2023 · 1 comment · Fixed by #87

Comments

@civodul
Copy link
Collaborator

civodul commented Jun 6, 2023

Hello,

On GNU/Hurd, time_units_per_microsec is zero, leading to SIGFPE early on when running a Fibers 1.3.1 program:

Core was generated by `/gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/bin/guile --no-auto-comp'.
Program terminated with signal SIGFPE, Arithmetic exception.

warning: Unexpected size of section `.reg2/130' in core file.
#0  0x025f7b9d in __udivmoddi4 (rp=0x0, d=0, n=0) at ../../../gcc-11.3.0/libgcc/libgcc2.c:1026
1026    ../../../gcc-11.3.0/libgcc/libgcc2.c: No such file or directory.
[Current thread is 1 (process 130)]
(gdb) bt
#0  0x025f7b9d in __udivmoddi4 (rp=0x0, d=0, n=0) at ../../../gcc-11.3.0/libgcc/libgcc2.c:1026
#1  __udivdi3 (n=0, d=0) at ../../../gcc-11.3.0/libgcc/libgcc2.c:1300
#2  0x025f73e6 in run_event_loop (p=0x103e724) at extensions/libevent.c:218
#3  0x025f7523 in scm_primitive_event_loop (lst=0x37e2768, wakefd=0x42, wokefd=0x3e, timeout=0x2) at extensions/libevent.c:270
#4  0x0108e451 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#5  0x010f9785 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#6  0x01108536 in scm_call_n () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#7  0x01079e0b in scm_primitive_eval () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#8  0x010a5064 in scm_primitive_load () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#9  0x0108e410 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#10 0x010f9785 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#11 0x01108536 in scm_call_n () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#12 0x01079e0b in scm_primitive_eval () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#13 0x0107fcc3 in scm_eval () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#14 0x010d7a33 in scm_shell () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#15 0x0109108d in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#16 0x0107804e in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#17 0x0108e410 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#18 0x010f9785 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#19 0x01108536 in scm_call_n () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#20 0x01079a60 in scm_call_2 () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#21 0x010f4d4b in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#22 0x011270c3 in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#23 0x010efa9b in scm_c_catch () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#24 0x0107a7cd in scm_c_with_continuation_barrier () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#25 0x010f4a1b in ?? () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#26 0x011b4fb4 in GC_call_with_stack_base () from /gnu/store/qqgp6fd8xq55dc4gknvgk6d8wjvxxgn3-libgc-8.2.2/lib/libgc.so.1
#27 0x010ef94a in scm_with_guile () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#28 0x01098840 in scm_boot_guile () from /gnu/store/mljlxj4gc8rii7891sza3vda7y06fyf8-guile-3.0.9/lib/libguile-3.0.so.1
#29 0x0804911a in ?? ()
#30 0x0156e290 in __libc_start_call_main (argv=0x103ede4, argc=8, main=0x80490c0) at ../sysdeps/generic/libc_start_call_main.h:23
#31 __libc_start_main_impl (main=0x80490c0, argc=8, argv=0x103ede4, init=0x0, fini=0x0, rtld_fini=0x6d90 <_dl_fini>, stack_end=0x103eddc)
    at ../csu/libc-start.c:392
#32 0x080491a8 in ?? ()
(gdb) frame 2
#2  0x025f73e6 in run_event_loop (p=0x103e724) at extensions/libevent.c:218
218     extensions/libevent.c: No such file or directory.
(gdb) p time_units_per_microsec 
$1 = 0
(gdb) p scm_c_time_units_per_second 
$2 = 1000

So I guess we should change:

microsec = data->timeout / time_units_per_microsec;

to:

microsec = (time_units_per_microsec == 0) ? 0 : (data->timeout / time_units_per_microsec);

Thoughts?

@civodul
Copy link
Collaborator Author

civodul commented Jun 6, 2023

Looking at libguile/stime.c, this problem can happen on any 32-bit platform (well, any non-Linux platform; on Linux, it'll use epoll):

#if SCM_SIZEOF_LONG >= 8 && defined HAVE_CLOCK_GETTIME
/* Nanoseconds on 64-bit systems with POSIX timers.  */
#define TIME_UNITS_PER_SECOND 1000000000
#else
/* Milliseconds for everyone else.  */
#define TIME_UNITS_PER_SECOND 1000
#endif

civodul added a commit to civodul/fibers that referenced this issue Jun 6, 2023
Fixes wingo#86.

* extensions/libevent.c (run_event_loop): Check whether
TIME_UNITS_PER_MICROSEC is zero before dividing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant