Hello
I am sometimes getting segfaults with this code:
(c-declare " typedef int MPI_Comm; static MPI_Comm globalcomm=123; ")
(c-define-type MPI_Comm "MPI_Comm")
(define get-comm (c-lambda () MPI_Comm "___result_voidstar=&globalcomm;"))
See below for a sequence of commands with which I can consistently get a segfault. Strangely, a test function looping over about the same sequence doesn't trigger it.
Am I doing things right? I don't want to just (c-define-type MPI_Comm int), because that would breach encapsulation (I only found out that MPI_Comm (I'm binding PETSc) was an int by looking at the gcc -E output!).
Do I understand right that I am supposed to give a pointer to the data? e.g. "___result_voidstar=&globalcomm;", not "___result_voidstar=globalcomm;"? That should probably be made clear in the documentation. I've also tried (c-define-type MPI_Comm (type "MPI_Comm")) at first.
But probably I'm better of just doing this?: (c-define-type MPI_Comm (pointer "MPI_Comm"))
Also: are (c-define-type MPI_Comm "MPI_Comm") and (c-define-type MPI_Comm (type "MPI_Comm")) really equivalent?
I'm confused:
- from reading the documentation, I thought that (type "MPI_Comm") will create a copy of the "MPI_Comm" object (how?, by applying memcpy to sizeof(MPI_Comm)?) and deallocate that again transparently upon destruction of the foreign object.
- when seeing the ___release_rc calls under gdb (where the segfault happens), I thought that this is the release function. But looking at mem.c that rather looks like some management function for the scheme heap?
- but seeing those #<foreign #2 0xB7FD630C> #<foreign #3 0xB7FD630C> I notice that they always carry the same address, so that would contradict the expectation of a new malloc'ed copy every time.
BTW note that I'm still running the gambit beta 17.
Thanks Christian.
The test loop which does *not* segfault:
; (define (test n) ; (let lp ((i 0) ; (c #f)) ; (if (< i n) ; (lp (+ i 1) ; (get-comm)))))
; (time (test 1000000)) ; 496 ms real time ; 488 ms cpu time (488 user, 0 system) ; 28 collections accounting for 324 ms real time (316 user, 0 system) ; 36000000 bytes allocated ; no minor faults ; no major faults ;??
An example of a segfault (using chjmodule): (note: those 1's and 3's are just there to flush the old values from my repl value cache patched into gambit)
(use bug-MPI_Comm)
loading "~/schemedevelopment/gambit/Loader/gambit-interpreter-env-bindings.o1" into namespace ""...done. import from "" to "gambit-interpreter-env#": 777 newly copied, 0 previously done. loading "~/schemedevelopment/gambit/Loader/gambit-interpreter-env.o1" into namespace "gambit-interpreter-env#"...done. import from "gambit-interpreter-env#" to "cj-env#": 785 newly copied, 0 previously done. import from "gambit-interpreter-env#" to "oleg-env#": 785 newly copied, 0 previously done. loading "~/schemedevelopment/gambit/mod/oleg-env.o1" into namespace "oleg-env#"...done. import from "oleg-env#" to "cj-env#": 3 newly copied, 0 previously done. loading "~/schemedevelopment/gambit/mod/cj-env.o13" into namespace "cj-env#"...done. import from "cj-env#" to "": 45 newly copied, 0 previously done. loading "./bug-MPI_Comm.o2" into namespace ""...done. import from "" to "": 0 newly copied, 0 previously done.
(get-comm)
#<foreign #2 0xB7FD630C>
1
1
1
1
1
1
1
1
(##gc) (##gc) (##gc) (##gc) (get-comm)
#<foreign #3 0xB7FD630C>
3
3
3
3
3
3
3
3
(##gc) (##gc) (##gc) (get-comm)
#<foreign #4 0xB7FD630C>
(get-comm)
#<foreign #5 0xB7FD630C>
3
3
3
3
3
3
3
3
(##gc) (##gc) (##gc) (##gc) (##gc) (get-comm)
#<foreign #6 0xB7FD630C>
(get-comm)
#<foreign #7 0xB7FD630C>
(get-comm)
#<foreign #8 0xB7FD630C>
3
3
3
3
3
3
3
3
(##gc)
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1214533504 (LWP 22116)] ___release_rc (ptr=0x0) at mem.c:630 630 next->prev = prev;
and a backtrace from another one:
(##gc)
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1214578560 (LWP 23687)] ___release_rc (ptr=0x0) at mem.c:630 630 next->prev = prev; (gdb) bt #0 ___release_rc (ptr=0x0) at mem.c:630 #1 0xb7fca829 in ___release_fn0 () from /home/chris/schemedevelopment/gambit/work/./bug-MPI_Comm.o2 #2 0xb7fcb30c in _ () from /home/chris/schemedevelopment/gambit/work/./bug-MPI_Comm.o2 #3 0xb7ed5e91 in ___lbl_tbl () from /usr/local/Gambit-C/lib/libgambc.so #4 0xb7fbc0e0 in __JCR_LIST__ () from /usr/local/Gambit-C/lib/libgambc.so #5 0xb7d3cb1b in ___release_foreign (obj=59) at c_intf.c:1173 #6 0xb7d3a6e5 in free_unmarked_still_objs () at mem.c:2332 #7 0xb7d3b667 in ___garbage_collect (nonmovable_words_needed=0) at mem.c:3652 #8 0xb7d5434a in ___H__20___kernel (___ps=0xb7fc0320) at _kernel.c:7542 #9 0xb7d3830d in ___call (nargs=0, proc=-1209180911, stack_marker=136566237) at setup.c:1784 #10 0xb7d3927e in ___setup (setup_params=0x0) at setup.c:2909 #11 0xb7d369c8 in ___main (linker=0) at main.c:557 #12 0xb7d414a9 in ___main_char (argc=6, argv=0x0, linker=0, script_line=0x0) at os_base.c:240 #13 0x0816207f in main ()
Afficher les réponses par date