<div dir="ltr">I'm interested in understanding what caused that sigsegv too.</div><div class="gmail_extra"><br><div class="gmail_quote">2015-12-14 17:55 GMT+08:00 Paolo Carlesi <span dir="ltr"><<a href="mailto:pcarlesi@gmail.com" target="_blank">pcarlesi@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I'm experiencing regular segfaults on OSX 10.9.5, with the sample code shown below.<br>
Tested with Gambit 4.8.1 + GCC 4.9  and with packaged Gambit 4.7.3 + LLVM.<br>
No issue at all on Linux, GCC 4.8, with both Gambit 4.2.8 and Gambit 4.8.2.<br>
Of course I may be doing something silly.<br>
<br>
A simple struct, "My" is generated inside a c procedure, then passed multiple times to another c-lambda procedure (*->My).<br>
It's a simplified model of the code produced by a FFI SDL2 Library I'm using.<br>
The doc says that the foreign object (xoxo in the example) should not be released while the scheme code is still referencing it.<br>
I am seeing the refcount going wildly in the negative, one for each call to *->My<br>
The only way -- clumsy -- I have found to avoid this is to increment the reference count with ___addref_rc ( not shown here ).<br>
<br>
What's wrong here?<br>
Thanks!<br>
<br>
<br>
LLDB output:<br>
<br>
Process 48149 launched: '/Users/paolo/scheme/spazz/fromlin' (x86_64)<br>
Process 48149 stopped<br>
* thread #1: tid = 0x40e3c9, 0x000000010000770c fromlin`___release_rc + 28, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)<br>
    frame #0: 0x000000010000770c fromlin`___release_rc + 28<br>
fromlin`___release_rc + 28:<br>
-> 0x10000770c:  movq   %rax, (%rdx)<br>
   0x10000770f:  movq   %rdx, 0x8(%rax)<br>
   0x100007713:  jmp    0x100010240               ; ___free_mem<br>
   0x100007718:  nopl   (%rax,%rax)<br>
<br>
stack trace:<br>
<br>
(lldb) bt<br>
* thread #1: tid = 0x40e3c9, 0x000000010000770c fromlin`___release_rc + 28, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)<br>
  * frame #0: 0x000000010000770c fromlin`___release_rc + 28<br>
    frame #1: 0x0000000100002579 fromlin`___release_fn0 + 9<br>
    frame #2: 0x0000000100009009 fromlin`___garbage_collect + 3497<br>
    frame #3: 0x00000001000091bf fromlin`___alloc_scmobj + 255<br>
    frame #4: 0x000000010000d4eb fromlin`___POINTER_to_SCMOBJ + 43<br>
    frame #5: 0x000000010000d5e4 fromlin`___STRUCT_to_SCMOBJ + 20<br>
    frame #6: 0x0000000100002112 fromlin`___H__20_fromlin + 3378<br>
    frame #7: 0x0000000100004aa4 fromlin`___call + 372<br>
    frame #8: 0x0000000100004bc6 fromlin`___setup_pstate + 262<br>
    frame #9: 0x00000001000063be fromlin`___setup + 3950<br>
(lldb)<br>
<br>
<br>
;; SAMPLE CODE<br>
<br>
(c-declare #<<c-declare-end<br>
<br>
typedef struct My {<br>
  int r;<br>
} My;<br>
<br>
c-declare-end<br>
)<br>
<br>
(begin<br>
  (c-define-type My (struct "My"))<br>
  (c-define-type My* (pointer My (My*)))<br>
  (c-define-type My*/nonnull (nonnull-pointer My (My*)))<br>
  (c-define-type My*/release-rc (nonnull-pointer My (My*) "___release_My")))<br>
<br>
<br>
(begin<br>
    (c-declare #<<c-declare-end<br>
static ___SCMOBJ ___release_My( void* ptr ) {<br>
    ___EXT(___release_rc)( ptr );<br>
    return ___FIX(___NO_ERR);<br>
}<br>
c-declare-end<br>
    )<br>
<br>
    (define alloc-My (c-lambda () My*/release-rc "___result_voidstar = ___EXT(___alloc_rc)( sizeof( struct My ));"))<br>
    (define *->My (c-lambda (My*/nonnull) My "___result_voidstar = (My*)___arg1;"))<br>
    (define My-r (c-lambda (My*/nonnull) unsigned-int8 "___result = ___arg1->r;"))<br>
    (define My-r-set! (c-lambda (My*/nonnull unsigned-int8) void "___arg1->r = ___arg2;")))<br>
<br>
(define (evil)<br>
   (let ((xoxo (alloc-My)))<br>
      (My-r-set! xoxo #xff)<br>
      (let loop ((c 1))<br>
          (begin<br>
              (if (= 0 (remainder c 10000))<br>
                  (begin (display c) (newline)))<br>
              (*->My xoxo)<br>
              (loop (+ 1 c))))))<br>
<br>
(evil)<br>
<br>
;;END CODE<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
Gambit-list mailing list<br>
<a href="mailto:Gambit-list@iro.umontreal.ca">Gambit-list@iro.umontreal.ca</a><br>
<a href="https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list" rel="noreferrer" target="_blank">https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list</a><br>
</blockquote></div><br></div>