I've finally found a way to manage references between foreign objects (which actually works for any kind of Scheme memory-allocated object) that avoids the problems of using wills. I keep a mapping from _serial numbers_ of dependent objects to references to the objects they depend upon. On garbage collection (using the ##add-gc-interrupt-job! hook), I walk this mapping (currently an assoc list) and remove any entries where the serial number can no longer be found in ##serial-number-to-object-table. So you call it a table with anemic (weaker than weak!) keys. See
https://github.com/euccastro/gambit-ffi-types/blob/master/ffi-types-lib.scmThis approach is beautifully simple and, unlike the one involving wills, seems robust to me.
Happy new year!