Hi Marc!
Rarely I get an error that Gambit just stops, while eating up all the CPU
core.
It's so rare that I don't consider it a problem, though I'd be happy to see
it gone of course.
I believe 50% of the time it happens within 5 seconds after Gambit started
and thread-start! was invoked 1-5 times.
I ran into this error now, saw it something like four times in 6mo.
This is on Gambit gsc 4.6.6 on AMD64, compiled from source with
--enable-single-host and some more.
The Gambit session is running a couple of Gambit threads, absolutely
nothing exotic going on.
Had it in a GDB session so could reliably "profile" the error, output from
that GDB session below.
Saved the core file for later reference too.
It's in _thread.scm , and from what I can see it's in
|##thread-effective-priority-downgrade!|'s definition.
What it looks like to me is that by some reason we've got a
self-referencing btq-deq-next chain element, that
keeps it reiterating forever.
I base this on that ___r1 and ___r3 and ___r4 remain constant; I'd guess
that ___r1 is thread, ___r3 is btq and ___r4 is leftmost.
Do you have any thought on what the issue might be, or any on how I can
track this further?
Many thanks,
Mikael
_thread.scm, the rows where the freeze appears to be
;; (##thread-effective-priority-downgrade! thread) is called to
;; recompute the effective priority of a thread. It is only called in
;; situations where the new effective priority is no more than the old
;; one.
(define-prim (##thread-effective-priority-downgrade! thread)
(##declare (not interrupts-enabled))
(let ((floats (macro-thread-floats thread)))
;; save old effective priority for later
(macro-temp-set!
(macro-thread-floats (macro-run-queue))
(macro-effective-priority floats))
;; compute the maximum of the boosted priority and the
;; effective priority of all the threads in blocked thread
;; queues (i.e. mutexes, condvars, etc) owned by the thread
(macro-effective-priority-set!
floats
(macro-boosted-priority floats))
(let loop ((btq (macro-btq-deq-next thread)))
(if (##not (##eq? btq thread))
<-- Looks sth like _thread.c:10452
(let ((leftmost (macro-btq-leftmost btq)))
<-- :10456
(if (##not (##eq? leftmost btq))
<-- :10457
(let ((leftmost-floats (macro-thread-floats leftmost)))
(if (##flonum.< (macro-effective-priority floats)
(macro-effective-priority leftmost-floats))
(macro-effective-priority-set!
floats
(macro-effective-priority leftmost-floats)))))
(loop (macro-btq-deq-next btq)))))
Gdb log from "profiling" the frozen gsc session, as we see it's stuck in a
loop in _thread.c between rows 10451 and 10458 :
Program received signal SIGINT, Interrupt.
0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
10457 ___IF(___EQP(___R4,___R3))
(gdb) bt
#0 0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
(gdb) cont
Continuing.
Program received signal SIGINT, Interrupt.
0x000000000075a8f2 in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10452
10452 ___IF(___EQP(___R3,___R1))
(gdb) bt
#0 0x000000000075a8f2 in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10452
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
(gdb) cont
Continuing.
Program received signal SIGINT, Interrupt.
0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
10457 ___IF(___EQP(___R4,___R3))
(gdb) bt
#0 0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
(gdb) ^CQuit
(gdb) cont
Continuing.
Program received signal SIGINT, Interrupt.
___H__20___thread (_(short *)=0x11c47e0) at _thread.c:10451
10451 ___SET_R3(___VECTORREF(___R3,___FIX(1L)))
(gdb) bt
#0 ___H__20___thread (_(short *)=0x11c47e0) at _thread.c:10451
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
Program received signal SIGINT, Interrupt.
___H__20___thread (_(short *)=0x11c47e0) at _thread.c:10456
10456 ___SET_R4(___VECTORREF(___R3,___FIX(6L)))
(gdb) bt
#0 ___H__20___thread (_(short *)=0x11c47e0) at _thread.c:10456
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
(gdb) cont
Continuing.
Program received signal SIGINT, Interrupt.
0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
10457 ___IF(___EQP(___R4,___R3))
(gdb) bt
#0 0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
(gdb) cont
Continuing.
Program received signal SIGINT, Interrupt.
0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
10457 ___IF(___EQP(___R4,___R3))
(gdb) bt
#0 0x000000000075a90a in ___H__20___thread (_(short *)=0x11c47e0) at
_thread.c:10457
#1 0x00000000005086fb in ___call (nargs=0, proc=13386241,
stack_marker=8829493553) at setup.c:1860
#2 0x000000000050a31d in ___setup (setup_params=0x7f7fffff0460) at
setup.c:3024
#3 0x000000000052d8ca in ___main (linker=0x505ddc
<____20___gsc__(___global_state_struct*)>) at main.c:711
#4 0x000000000051a9fc in ___main_char (argc=5, argv=0x7f7fffff06a8,
linker=0x505ddc <____20___gsc__(___global_state_struct*)>, script_line=0x0)
at os_base.c:413
#5 0x0000000000505e16 in main (argc=5, argv=0x7f7fffff06a8) at
_gsc_.c:13627
Well, since that was about a traversal over a structure, let's make some
profiling of what the ___r1/3/4 variable is, so we get a clue of how the
traversal goes!
(gdb) info locals
___r4 = 9052459177
___F64V1 = 9.9999999999999995e-07
___r1 = 9051204137
___F64V2 = 0
_(char *) = 14328769
___temp = 9052462209
___hp = 0x21b91bbc8
_(float, *) = 0x208306628
_(long double, ) = 14327969
___r2 = 9051204361
___F64V3 = 0.02
___start = 14314721
___r3 = 9052459177
___F64V4 = 0.02
next:
___r4 = 9052459177
___F64V1 = 9.9999999999999995e-07
___r1 = 9051204137
___F64V2 = 0
_(char *) = 14328769
___temp = 9052462209
___hp = 0x21b91bbc8
_(float, *) = 0x208306628
_(long double, ) = 14327969
___r2 = 9051204361
___F64V3 = 0.02
___start = 14314721
___r3 = 9052459177
___F64V4 = 0.02
next:
___r4 = 9052459177
___F64V1 = 9.9999999999999995e-07
___r1 = 9051204137
___F64V2 = 0
_(char *) = 14328769
___temp = 9052462209
___hp = 0x21b91bbc8
_(float, *) = 0x208306628
_(long double, ) = 14327969
___r2 = 9051204361
___F64V3 = 0.02
___start = 14314721
___r3 = 9052459177
___F64V4 = 0.02
next:
___r4 = 9052459177
___F64V1 = 9.9999999999999995e-07
___r1 = 9051204137
___F64V2 = 0
_(char *) = 14328769
___temp = 9052462209
___hp = 0x21b91bbc8
_(float, *) = 0x208306628
_(long double, ) = 14327969
___r2 = 9051204361
___F64V3 = 0.02
___start = 14314721
___r3 = 9052459177
___F64V4 = 0.02
next:
___r4 = 9052459177
___F64V1 = 9.9999999999999995e-07
___r1 = 9051204137
___F64V2 = 0
_(char *) = 14328769
___temp = 9052462209
___hp = 0x21b91bbc8
_(float, *) = 0x208306628
_(long double, ) = 14327969
___r2 = 9051204361
___F64V3 = 0.02
___start = 14314721
___r3 = 9052459177
___F64V4 = 0.02
The rows it's stuck at, in _thread.c .
(the following was copied from _thread.c of Gambit 4.6.2,
it looks like it's equivalent with 4.6.6 at least on these locations, so
should be fine)
#undef ___PH_PROC
#define ___PH_PROC
___H__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_
#undef ___PH_LBL0
#define ___PH_LBL0 414
#undef ___PD_ALL
#define ___PD_ALL ___D_FP ___D_R0 ___D_R1 ___D_R2 ___D_R3 ___D_R4
___D_F64(___F64V1) ___D_F64(___F64V2) \
#undef ___PR_ALL
#define ___PR_ALL ___R_FP ___R_R0 ___R_R1 ___R_R2 ___R_R3 ___R_R4
#undef ___PW_ALL
#define ___PW_ALL ___W_FP ___W_R0 ___W_R1 ___W_R2 ___W_R3 ___W_R4
___BEGIN_P_COD
___BEGIN_P_HLBL
___DEF_P_HLBL_INTRO
___DEF_P_HLBL(___L0__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___DEF_P_HLBL(___L1__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___END_P_HLBL
___BEGIN_P_SW
___DEF_SLBL(0,___L0__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___IF_NARGS_EQ(1,___NOTHING)
___WRONG_NARGS(0,1,0,0)
___DEF_GLBL(___L__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___SET_R2(___UNCHECKEDSTRUCTUREREF(___R1,___FIX(14L),___SUB(22),___FAL))
___SET_F64(___F64V1,___F64VECTORREF(___R2,___FIX(6L)))
___SET_R4(___RUNQUEUE)
___SET_R4(___UNCHECKEDSTRUCTUREREF(___R4,___FIX(14L),___SUB(22),___FAL))
___F64VECTORSET(___R4,___FIX(2L),___F64V1)
___SET_F64(___F64V2,___F64VECTORREF(___R2,___FIX(5L)))
___F64VECTORSET(___R2,___FIX(6L),___F64V2)
___SET_STK(1,___R0)
___SET_STK(2,___R1)
___SET_STK(3,___R2)
___SET_R3(___VECTORREF(___R1,___FIX(1L)))
___SET_R0(___LBL(1))
___ADJFP(8)
___IF(___EQP(___R3,___R1))
___GOTO(___L6__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___END_IF
___GOTO(___L4__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___DEF_GLBL(___L2__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___SET_R4(___UNCHECKEDSTRUCTUREREF(___R4,___FIX(14L),___SUB(22),___FAL))
___SET_F64(___F64V1,___F64VECTORREF(___R4,___FIX(6L)))
___SET_F64(___F64V2,___F64VECTORREF(___R2,___FIX(6L)))
___ADJFP(2)
___IF(___F64LT(___F64V2,___F64V1))
___GOTO(___L5__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___END_IF
___ADJFP(-2)
___DEF_GLBL(___L3__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
10451: ___SET_R3(___VECTORREF(___R3,___FIX(1L)))
10452: ___IF(___EQP(___R3,___R1))
___GOTO(___L6__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___END_IF
___DEF_GLBL(___L4__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
10456: ___SET_R4(___VECTORREF(___R3,___FIX(6L)))
10457: ___IF(___EQP(___R4,___R3))
10458:
___GOTO(___L3__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___END_IF
___GOTO(___L2__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___DEF_GLBL(___L5__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___SET_F64(___F64V1,___F64VECTORREF(___R4,___FIX(6L)))
___F64VECTORSET(___R2,___FIX(6L),___F64V1)
___ADJFP(-2)
___GOTO(___L3__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___DEF_GLBL(___L6__23__23_thread_2d_effective_2d_priority_2d_downgrade_21_)
___SET_R1(___VOID)
___JUMPPRM(___NOTHING,___R0)