<div dir="ltr"><div><div>Valgrind reports Gambit is leaking a "sfun stack marker" if I call, from a foreign release function, another function defined with `c-define`.  The code below is
 about the most innocent looking thing I could come up with.<br><br>Doesn't Gambit like c-define functions called within release 
functions, or is Valgrind giving me a false positive here (as it is wont to do quite often.)<br>
<br>; ~/gambit-dbg/bin/gsc -exe -cc-options -g test-c-define.scm && valgrind --leak-check=full ./test-c-define<br><br>(c-declare #<<c-declare-end<br><br>typedef struct { int x; int y; } point;<br><br>void scm_release_point(unsigned long);<br>
<br>___SCMOBJ c_release_point(void *ptr) {<br>    scm_release_point((unsigned long)ptr);<br>    ___EXT(___release_rc)(ptr);<br>    return ___FIX(___NO_ERR);<br>}<br><br>c-declare-end<br>)<br><br>(c-define (release-point ptr) (unsigned-long) void "scm_release_point" ""<br>
  (println "release-point called"))<br><br>(c-define-type point (pointer "point" (point*) "c_release_point"))<br><br>(define p ((c-lambda () point<br>                 "___result_voidstar = ___EXT(___alloc_rc)(sizeof(point));")))<br>
<br>(println "p is " p)<br>(set! p #f)<br><br>(##gc)<br></div><div>; for good measure...<br></div>(##gc)<br></div>(##gc)<br><div><div><br>(println "Bye.")<br><br><br>valgrind --leak-check=full ./test-c-define<br>
==16301== Memcheck, a memory error detector<br>==16301== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.<br>==16301== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info<br>==16301== Command: ./test-c-define<br>
==16301== <br>p is #<point* #2 0x5c04640><br>release-point called<br>Bye.<br>==16301== <br>==16301== HEAP SUMMARY:<br>==16301==     in use at exit: 71 bytes in 1 blocks<br>==16301==   total heap usage: 153 allocs, 152 frees, 4,247,198 bytes allocated<br>
==16301== <br>==16301== 71 bytes in 1 blocks are definitely lost in loss record 1 of 1<br>==16301==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)<br>==16301==    by 0x4C922E: ___alloc_mem (os_base.c:185)<br>
==16301==    by 0x4B7DB5: alloc_mem_aligned (mem.c:452)<br>==16301==    by 0x4B8C57: alloc_scmobj_still (mem.c:1245)<br>==16301==    by 0x4B8D61: ___alloc_scmobj (mem.c:1285)<br>==16301==    by 0x4B8E44: ___make_vector (mem.c:1362)<br>
==16301==    by 0x4C677B: ___make_sfun_stack_marker (c_intf.c:6452)<br>==16301==    by 0x4B359E: scm_release_point (test-c-define.c:139)<br>==16301==    by 0x4B354B: c_release_point (test-c-define.c:130)<br>==16301==    by 0x4C24D7: ___release_foreign (c_intf.c:1713)<br>
==16301==    by 0x4BC354: free_unmarked_still_objs (mem.c:3271)<br>==16301==    by 0x4BE922: ___garbage_collect (mem.c:4698)<br>==16301== <br>==16301== LEAK SUMMARY:<br>==16301==    definitely lost: 71 bytes in 1 blocks<br>
==16301==    indirectly lost: 0 bytes in 0 blocks<br>==16301==      possibly lost: 0 bytes in 0 blocks<br>==16301==    still reachable: 0 bytes in 0 blocks<br>==16301==         suppressed: 0 bytes in 0 blocks<br>==16301== <br>
==16301== For counts of detected and suppressed errors, rerun with: -v<br>==16301== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)<br></div></div></div>