[Ecls-list] Multi thread problem
Stanislav Frolov
frolosofsky at gmail.com
Wed Oct 3 12:57:10 UTC 2012
On Thursday 27 September 2012 23:15:56 Juan Jose Garcia-Ripoll wrote:
>
> Thanks a lot for the careful debugging. It seems ECL ran into a vicious
> circle: to register itself it has to create an environment, but to allocate
> any object an existing environment was assumed. I have fixed this and
> another problem with GC_unregister_my_thread(), which can only be called
> once. Your example seems to work here now.
>
> Juanjo
Hi and thanks for the fix. Previous example works fine but my problems
continue. Now I try use ECL with third-party thread abstraction (where gc
macro cant replace thread calls). The following example illustrates the bug:
thread.c:
#include<pthread.h>
pthread_t my_create_thread(void*(*foo)(void*)){
pthread_t pt;
pthread_create(&pt,0,foo,0);
return pt;}
void my_thread_join(pthread_t p){
pthread_join(p,0);}
-------------------
main.c:
#include<pthread.h>
#include<stdio.h>
#include<ecl/ecl.h>
pthread_t my_create_thread(void*(*)(void*));
void my_thread_join(pthread_t);
void *foo(void *x){
ecl_import_current_thread(Cnil,Cnil); (1)
int i;
for(i=0;i<5;i++){
printf("%d\n",i);
sleep(1);}
ecl_release_current_thread(); (2)
return 0;}
int main(int argc,char **argv){
cl_boot(argc,argv);
pthread_t threads[10];
int i;
for(i=0;i<sizeof(threads)/sizeof(*threads);i++)
threads[i]=my_create_thread(foo);
for(i=0;i<sizeof(threads)/sizeof(*threads);i++)
my_thread_join(threads[i]);
cl_shutdown();
printf("Exit\n");
return 0;}
If the lines (1) and (2) are commented out, program works fine. Otherwise
program fails with sigsegv after ecl_import_current_thread. I don't know is
there ECL or Boehm problem.
While I debug program with gdb I saw many SIGPWR signals. There is the
backtrace after sigsegv occurs:
#0 0xb7b41c2f in GC_push_all_eager () from /usr/lib/libgc.so.1
#1 0xb7b41c83 in GC_push_all_stack () from /usr/lib/libgc.so.1
#2 0xb7b4a4bb in GC_push_all_stacks () from /usr/lib/libgc.so.1
#3 0xb7b44e74 in GC_default_push_other_roots () from /usr/lib/libgc.so.1
#4 0xb7f2da8c in stacks_scanner () at /home/staseg/devel/ecl-
src/src/c/alloc_2.d:1344
#5 0xb7b4334d in GC_push_roots () from /usr/lib/libgc.so.1
#6 0xb7b427fe in GC_mark_some () from /usr/lib/libgc.so.1
#7 0xb7b393f0 in GC_stopped_mark () from /usr/lib/libgc.so.1
#8 0xb7b39acc in GC_try_to_collect_inner () from /usr/lib/libgc.so.1
#9 0xb7b3a66c in GC_collect_or_expand () from /usr/lib/libgc.so.1
#10 0xb7b3f0e8 in GC_alloc_large () from /usr/lib/libgc.so.1
#11 0xb7b3fc66 in GC_generic_malloc_ignore_off_page () from
/usr/lib/libgc.so.1
#12 0xb7b3fda3 in GC_malloc_atomic_ignore_off_page () from /usr/lib/libgc.so.1
#13 0xb7f2e00b in ecl_alloc_atomic_unprotected (n=2245632)
at /home/staseg/devel/ecl-src/src/c/alloc_2.d:716
#14 0xb7f2e19f in ecl_alloc_atomic (n=2245632)
at /home/staseg/devel/ecl-src/src/c/alloc_2.d:736
#15 0xb7ed1d0d in ecl_stack_set_size (env=0xb7dc6000,
tentative_new_size=32768)
at /home/staseg/devel/ecl-src/src/c/interpreter.d:42
#16 0xb7e01bb7 in ecl_init_env (env=0xb7dc6000)
at /home/staseg/devel/ecl-src/src/c/main.d:145
#17 0xb7f2a49b in ecl_import_current_thread (name=0x1, bindings=0x1)
at /home/staseg/devel/ecl-src/src/c/threads/process.d:393
#18 0x08048826 in foo ()
#19 0xb7d96d7a in start_thread () from /lib/libpthread.so.0
#20 0xb7cb617e in clone () from /lib/libc.so.6
More information about the ecl-devel
mailing list