1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
void
DESTROY (SV *sv)
CODE:
GObject *object = gperl_get_object (sv);
if (!object) /* Happens on object destruction. */
return;
#ifdef NOISY
warn ("DESTROY< (%p)[%d] => %s (%p)[%d]\n",
object, object->ref_count,
gperl_object_package_from_type (G_OBJECT_TYPE (object)),
sv, SvREFCNT (SvRV(sv)));
#endif
/* gobject object still exists, so take back the refcount we lend it. */
/* this operation does NOT change the refcount of the combined object. */
if (PL_in_clean_objs) {
/* be careful during global destruction. basically,
* don't bother, since refcounting is no longer meaningful. */
sv_unmagic (SvRV (sv), PERL_MAGIC_ext);
g_object_steal_qdata (object, wrapper_quark);
} else {
SvREFCNT_inc (SvRV (sv));
if (object->ref_count > 1) {
/* become undead */
SV *obj = SvRV(sv);
update_wrapper (object, MAKE_UNDEAD(obj));
/* printf("zombies! [%p] (%p)\n", object, obj);*/
}
}
g_object_unref (object);
#ifdef NOISY
warn ("DESTROY> (%p) done\n", object);
#endif
|