scheme-api: Store a TOPLEVEL pointer in OBJECT smobs.
commit78c8ee905dad0dbfde548debb2be5790d4b2fb71
authorPeter TB Brett <peter@peter-b.co.uk>
Wed, 28 Dec 2011 13:55:18 +0000 (28 13:55 +0000)
committerPeter TB Brett <peter@peter-b.co.uk>
Wed, 28 Dec 2011 13:55:18 +0000 (28 13:55 +0000)
treed4a80eb1a6eb3b2eb0803b7fc26cfd15cbf60f75
parentec9259f77f9af88f0bf3dbaa1c09a92b87b2c36b
scheme-api: Store a TOPLEVEL pointer in OBJECT smobs.

When an OBJECT smob is created in Scheme code, and then goes out of
scope without being added to a component or to a page, we need to be
able to delete the object from the Guile garbage collector.  This
deletion occurs in a smob free function.

To delete an OBJECT, we need to call s_object_delete(), which requires
an additional TOPLEVEL argument.  Previously, we have obtained a
TOPLEVEL by using edascm_c_current_toplevel().  Unfortunately, this
(indirectly) calls scm_fluid_ref(), which is not permitted to be
called from a smob free function; if called in that context, it may
cause a deadlock.

This patch alters OBJECT smobs to be double-length smobs, with the
current TOPLEVEL at the time the smob was created baked into the
second data word.  This avoids the need to use
edascm_c_current_toplevel() when garbarge-collecting an OBJECT, but
it's also somewhat hacky. :-(

Closes-bug: lp-909358
libgeda/src/scheme_smob.c