bug-guile
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#25387: guile-2.2 multi-thread segfault in SCM_VALIDATE_WEAK_TABLE


From: Linas Vepstas
Subject: bug#25387: guile-2.2 multi-thread segfault in SCM_VALIDATE_WEAK_TABLE
Date: Sat, 7 Jan 2017 18:18:20 -0600

Following program crashes immediately (fraction of a second)
in guile-2.2, current git version (as of 29 Dec 2016
a0656ad4cf976b3845e9b9663a90b46b4cf9fc5a )

It runs fine in guile-2.0. Its doing something slightly squonky:
referencing the variable 'cnt' in a thread.  Note definition of
use before definition of variable

Its deterministic - always crashes in the same place.

(define junk 0)
(define halt #f)

(define (wtf-thr)
   (define start (- (current-time) 0.1))

   ; Create thread that does junk and exits.  Yes, the increment
   ; of `junk` is not protected, and its racey, but so what.
   (define (mkthr v) (call-with-new-thread (lambda ()
      (if (eq? 0 (modulo cnt 30)) (gc))   ;;;; <<<<  crashes here!!!
(set! junk (+ junk 1)))))

   ; thread arguments
   (define thrarg (make-list 10 0))

   (define cnt 0)
   (define (mke)
      ; Create a limited number of threads
      (define thr-list (map mkthr thrarg))
      ; (display (length (all-threads)))
      (map join-thread thr-list)

      ; Some handy debug printing.
      (set! cnt (+ cnt 1))
      (if (eq? 0 (modulo cnt 500))
         (begin
            (display "rate=")
            (display (/ cnt (- (current-time) start))) (newline)
(display "cnt=") (display cnt) (newline)
(display (gc-stats)) (newline) (newline)
         )))

   ; tail recursive infinite loop.
   (define (aloop) (mke) (if (not halt) (aloop)))

   ; while forever.
   (aloop)
)

; Run elsewhere, so that we have a shell prompt
; (not required for the bug)
(call-with-new-thread wtf-thr)

; halt if desired.
; (set! halt #t)


Thread 621 "guile" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffedbe1700 (LWP 10504)]
0x00007ffff7b78af1 in scm_c_weak_table_ref (table=0x0,
    raw_hash=2738445758486295669, pred=0x7ffff7b77bb0 <assq_predicate>,
    closure=0x5555558fff00, dflt=0x904) at ../../libguile/weak-table.c:862
warning: Source file is more recent than executable.
862  SCM_VALIDATE_WEAK_TABLE (1, table);
(gdb) bt
#0  0x00007ffff7b78af1 in scm_c_weak_table_ref (table=0x0,
    raw_hash=2738445758486295669, pred=0x7ffff7b77bb0 <assq_predicate>,
    closure=0x5555558fff00, dflt=0x904) at ../../libguile/weak-table.c:862
#1  0x00007ffff7b02fa4 in fluid_ref (dynamic_state=0x555555f8ce60,
    fluid=0x5555558fff00) at ../../libguile/fluids.c:287
#2  0x00007ffff7b0325f in scm_fluid_ref (fluid=0x5555558fff00)
    at ../../libguile/fluids.c:308
#3  0x00007ffff7b34424 in scm_i_default_port_conversion_strategy ()
    at ../../libguile/ports.c:1015
#4  0x00007ffff7b5e4df in scm_i_default_string_failed_conversion_handler ()
    at ../../libguile/strings.c:1619
#5  scm_from_locale_stringn (
    str=0x7ffff7b88d50 "Wrong type argument in position ~A: ~S",
    address@hidden) at ../../libguile/strings.c:1626
#6  0x00007ffff7b5e51c in scm_from_locale_string (str=<optimized out>)
    at ../../libguile/strings.c:1613
#7  0x00007ffff7af76c6 in scm_error (key=0x5555558fa960,
    address@hidden <s_scm_set_current_dynamic_state>
"set-current-dynamic-state", message=<optimized out>,
args=0x555555c6ce30,
    address@hidden) at ../../libguile/error.c:59
#8  0x00007ffff7af7968 in scm_wrong_type_arg (
    address@hidden <s_scm_set_current_dynamic_state>
"set-current-dynamic-state", address@hidden,
address@hidden)
---Type <return> to continue, or q <return> to quit---
    at ../../libguile/error.c:251
#9  0x00007ffff7b03096 in scm_set_current_dynamic_state (
    address@hidden) at ../../libguile/fluids.c:496
#10 0x00007ffff7b6351a in guilify_self_2 (
    address@hidden)
    at ../../libguile/threads.c:466
#11 0x00007ffff7b63e0c in scm_i_init_thread_for_guile (base=0x7fffedbe0ec0,
    dynamic_state=0x555555c6c3b0) at ../../libguile/threads.c:595
#12 0x00007ffff7b63e59 in with_guile (address@hidden,
    address@hidden) at ../../libguile/threads.c:638
#13 0x00007ffff6c71812 in GC_call_with_stack_base (
    address@hidden <with_guile>, address@hidden)
    at misc.c:1925
#14 0x00007ffff7b635cc in scm_i_with_guile (dynamic_state=<optimized out>,
    data=0x555555c6c410, func=0x7ffff7b635e0 <really_launch>)
    at ../../libguile/threads.c:688
#15 launch_thread (d=0x555555c6c410) at ../../libguile/threads.c:750
#16 0x00007ffff735f464 in start_thread (arg=0x7fffedbe1700)
    at pthread_create.c:333
#17 0x00007ffff70a29df in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:105





reply via email to

[Prev in Thread] Current Thread [Next in Thread]