Garbage collection is not disabled during an FFI call. In fact, it's difficult or impossible to disable GC at all.
Finalizers registered with `register-finalizer', however, run in a separate Racket thread. So there's no particular guarantee that finalizers will run before a `collect-garbage' call returns. You might find that inserting a `sleep' call right after `collect-garbage' causes some of your finalizers to run. That doesn't seem like a great solution, though, and it may create other trouble if multiple Racket threads try to use BDD functions or kill off a thread using a BDD function. Another possibility is to use the lower-level functions provided in the C API, such as scheme_add_finalizer(). (If you register a Racket-implemented function that way, be sure to make it atomic, so that Racket-level threads do no swap during the call to the finalizer.) At Sun, 20 Jun 2010 09:41:38 -0400, Nick wrote: > Hi, > > I'm using MzScheme v4.2.4, and I'm trying to use the CUDD Binary > Decision Diagram (BDD) library, which is implemented in C. CUDD > manages all the BDDs with reference counting and its own garbage > collector. In my scheme code I would like to have all the reference > counting automated. What I did is have the functions create new BDDs > to automatically increment the reference counts, and then use > register-finalizer to decrement the reference count. I understand how > to do all this, and it works. > > The problem is that I need to sync up the CUDD garbage collector and > the Scheme garbage collector. I want the Scheme garbage collector to > be called right before the CUDD garbage collector is called, so that > when BDD nodes are unreachable by Scheme, their reference counts go to > 0, and CUDD can collect them. CUDD provides a hook to have a function > called right before garbage collection occurs, so I thought this > should be simple. The problem is that the collect-garbage calls in the > hook appear to do nothing. None of the finalizers are called when I > rely on the hook, but if I explicitly call collect-garbage, then the > finalizers are called. > > I know the finalizers are called because I print a message in them, > and I know the hook function is being called, because I print out a > message in the hook function. I cannot just call collect-garbage > myself, because the CUDD garbage collection is called by the package > itself at unknown times. Operations internal to the package can cause > a garbage collection at any time. I have tried to call > scheme_collect_garbage from C, in a hook function implemented in C. > And, I have implemented the hook in scheme, and had passed the > function to the C procedure that registers the hook. For both methods, > the hook is called, and collect-garbage doesn't work. > > Is garbage collection disabled or something during a FFI call? Is > there another solution? > > Thanks, > Nick > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/users _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users