[gambit-list] refcounts and threads

Christian christian at pflanze.mine.nu
Fri Aug 19 13:54:00 EDT 2005


Hello

I've noticed that my perl interface leaked memory until I added a
___still_obj_refcount_dec call after allocation of a scheme
object. This is in code which converts a perl datastructure to a
scheme one; the resulting object is not used by C or perl code, only
by scheme. So since a newly allocated still object starts with a
refcount of 1, I have to decrement it again. I now do this immediately
after allocation, e.g.:

___SCMOBJ /* for ___err */
gperl__SV_to_string_SCMOBJ (SV *sv,
			    ___SCMOBJ* obj)
{
...
	result = ___alloc_scmobj (___sSTRING, n<<___LCS, ___STILL);
	___still_obj_refcount_dec(result);
        // now copy over perl string, then:
        *obj = result;
        return ___FIX(___NO_ERR);
}

I use the above from scheme like:

(c-define-type SV* (pointer "SV" SV* "gperl_release_sv"))
(c-define-type SV*->string "SV*" "SV_to_string_SCMOBJ" "NOTIMPLEMENTED" #f)
(define sv->string
  (c-lambda (SV*)
	    SV*->string
	    "___result=___arg1;"))

My question: is the above thread safe? Do I have to add (declare (not
interrupts-enabled)), like:

(define (sv->string sv)
  (declare (not interrupts-enabled))
  ((c-lambda (SV*)
	     SV*->string
	     "___result=___arg1;") sv))

Thanks
Christian.



More information about the Gambit-list mailing list