unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
From: Anthonin Bonnefoy <anthonin.bonnefoy@securactive.net>
To: 19523@debbugs.gnu.org
Subject: bug#19523: Segfault when creating thread with scm_with_guile
Date: Tue, 6 Jan 2015 15:27:31 +0100	[thread overview]
Message-ID: <CAG+E5bVNb2qRXP4L6PTJqACBjcsFhdt_-mgWPbqB6VpDTUquzA@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 4551 bytes --]

Hi all,

I have segfaults occurring sometimes when threads are starting with
scm_with_guile while main thread is using malloc.

Example program:
```
#include <stdlib.h>
#include <pthread.h>
#include <libguile.h>

static void *a_libguile_thread(void *unused) {
}

static void *a_libguile_thread_(void *unused) {
    scm_with_guile(a_libguile_thread, NULL);
}

static void do_mallocs(void) {
    void *a[1000];
    for (int i = 0; i < 1000; ++i) {
        a[i] = malloc(356);
    }
    for (int i = 0; i < 1000; ++i) {
        free(a[i]);
    }
}

int main(int argc, char *argv[]) {
    scm_init_guile();

    pthread_t pth[10];
    for (int i = 0; i < 10; ++i) {
        GC_pthread_create(pth + i, NULL, a_libguile_thread_, NULL);
    }

    do_mallocs();

    for (int i = 0; i < 10; ++i) {
        GC_pthread_join(pth[i], NULL);
    }

    return 0;
}

```
To compile:
gcc corruption_guile.c -g -std=c99 `pkg-config --cflags --libs guile-2.0`
```
Some iterations are needed before having the segfaults:
while ./a.out; do echo -n "."; done;
```
Versions:
gcc (Debian 4.9.1-19) 4.9.1
guile (GNU Guile) 2.0.11.20-4338f (also tried from v2.0.11 tag)
libgc gc7_2d
```
Backtrace:

#0  GC_generic_malloc (lb=524288, k=<optimized out>) at malloc.c:185
#1  0x00007fcc535541ff in make_vm () at vm.c:704
#2  0x00007fcc535542d5 in scm_the_vm () at vm.c:781
#3  0x00007fcc534da600 in scm_call_4 (proc=0x1198c30, arg1=arg1@entry=0x404,
arg2=<optimized out>, arg3=<optimized out>, arg4=<optimized out>) at
eval.c:507
#4  0x00007fcc53550d89 in scm_catch_with_pre_unwind_handler
(key=key@entry=0x404,
thunk=<optimized out>, handler=<optimized out>,
pre_unwind_handler=<optimized out>) at throw.c:73
#5  0x00007fcc53550e8f in scm_c_catch (tag=tag@entry=0x404,
body=body@entry=0x7fcc534d0c00
<c_body>, body_data=body_data@entry=0x7fcc4d14cd50,
handler=handler@entry=0x7fcc534d0fe0
<c_handler>, handler_data=handler_data@entry=0x7fcc4d14cd50
, pre_unwind_handler=pre_unwind_handler@entry=0x7fcc534d0d90
<pre_unwind_handler>, pre_unwind_handler_data=0x127cff0) at throw.c:207
#6  0x00007fcc534d1381 in scm_i_with_continuation_barrier
(body=body@entry=0x7fcc534d0c00
<c_body>, body_data=body_data@entry=0x7fcc4d14cd50,
handler=handler@entry=0x7fcc534d0fe0
<c_handler>, handler_data=handler_data@entry=0x7fcc4d14cd50,
 pre_unwind_handler=pre_unwind_handler@entry=0x7fcc534d0d90
<pre_unwind_handler>, pre_unwind_handler_data=0x127cff0) at
continuations.c:455
#7  0x00007fcc534d1415 in scm_c_with_continuation_barrier (func=<optimized
out>, data=<optimized out>) at continuations.c:551
#8  0x00007fcc5354e6dc in with_guile_and_parent
(base=base@entry=0x7fcc4d14cdb0,
data=data@entry=0x7fcc4d14cde0) at threads.c:906
#9  0x00007fcc53222302 in GC_call_with_stack_base (fn=fn@entry=0x7fcc5354e690
<with_guile_and_parent>, arg=arg@entry=0x7fcc4d14cde0) at misc.c:1553
#10 0x00007fcc5354eac8 in scm_i_with_guile_and_parent (parent=<optimized
out>, data=<optimized out>, func=<optimized out>) at threads.c:949
#11 scm_with_guile (func=<optimized out>, data=<optimized out>) at
threads.c:955
#12 0x00000000004008bb in a_libguile_thread_ (unused=0x0) at
corruption_guile.c:11
#13 0x00007fcc53226f6e in GC_inner_start_routine (sb=<error reading
variable: value has been optimized out>, arg=<error reading variable: value
has been optimized out>) at pthread_start.c:56
#14 0x00007fcc53222302 in GC_call_with_stack_base (fn=<optimized out>,
arg=<optimized out>) at misc.c:1553
#15 0x00007fcc52ff40a4 in start_thread (arg=0x7fcc4d14d700) at
pthread_create.c:309
#16 0x00007fcc52d28ccd in clone () at
../sysdeps/unix/sysv/linux/x86_64/clone.S:111
```

I thought at first it was a problem with libgc but the given program run
without problems.
```
#include <stdlib.h>
#include <pthread.h>
#define GC_THREADS 1
#define GC_NO_THREAD_REDIRECTS 1
#include <gc/gc_mark.h>
#include <gc.h>

static void *a_lib_gc_thread(void *unused) {
    void *a;
    for (int i = 0; i < 100; ++i) {
        a = GC_generic_malloc(524288, 6);
    }
    GC_free(a);
}

static void do_mallocs(void) {
    void *a[100];
    for (int i = 0; i < 100; ++i) {
        a[i] = malloc(356);
    }
    for (int i = 0; i < 100; ++i) {
        free(a[i]);
    }
}

int main(int argc, char *argv[]) {
    pthread_t pth[10];
    for (int i = 0; i < 10; ++i) {
        GC_pthread_create(pth + i, NULL, a_lib_gc_thread, NULL);
    }
    do_mallocs();
    for (int i = 0; i < 10; ++i) {
        GC_pthread_join(pth[i], NULL);
    }
    return 0;
}
```
I also tried to replace malloc by scm_malloc with no luck.

Regards, Anthonin

[-- Attachment #2: Type: text/html, Size: 5503 bytes --]

             reply	other threads:[~2015-01-06 14:27 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-06 14:27 Anthonin Bonnefoy [this message]
2016-06-22 21:27 ` bug#19523: Segfault when creating thread with scm_with_guile Andy Wingo
2016-06-23  6:43   ` Anthonin Bonnefoy
2016-06-23  8:19     ` Anthonin Bonnefoy
2017-02-28 12:16 ` Andy Wingo
2017-02-28 12:18 ` Andy Wingo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAG+E5bVNb2qRXP4L6PTJqACBjcsFhdt_-mgWPbqB6VpDTUquzA@mail.gmail.com \
    --to=anthonin.bonnefoy@securactive.net \
    --cc=19523@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).