summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2018-10-13 16:52:33 +0200
committerPhilip Chimento <philip.chimento@gmail.com>2018-11-12 12:04:16 -0500
commit350be1936a671d3ce6ddba0c2a0b5a4bfe19ef90 (patch)
treebda150d87550eafe6e83f9fa3b579ec9e8148f9f
parent0f77ebd6ccb96ef209a8d4bdbeec6d362fb28254 (diff)
downloadgjs-350be1936a671d3ce6ddba0c2a0b5a4bfe19ef90.tar.gz
gtype: delete heap wrappers on gtype removal
-rw-r--r--gi/gtype.cpp15
-rw-r--r--installed-tests/extra/gjs.supp29
-rw-r--r--installed-tests/extra/lsan.supp3
3 files changed, 12 insertions, 35 deletions
diff --git a/gi/gtype.cpp b/gi/gtype.cpp
index 64bd8a81..d1217e66 100644
--- a/gi/gtype.cpp
+++ b/gi/gtype.cpp
@@ -63,13 +63,18 @@ update_gtype_weak_pointers(JSContext *cx,
void *data)
{
for (auto iter = weak_pointer_list.begin(); iter != weak_pointer_list.end(); ) {
- auto heap_wrapper = static_cast<JS::Heap<JSObject *> *>(g_type_get_qdata(*iter, gjs_get_gtype_wrapper_quark()));
+ GType gtype = *iter;
+ auto heap_wrapper = static_cast<JS::Heap<JSObject *> *>(
+ g_type_get_qdata(gtype, gjs_get_gtype_wrapper_quark()));
JS_UpdateWeakPointerAfterGC(heap_wrapper);
/* No read barriers are needed if the only thing we are doing with the
* pointer is comparing it to nullptr. */
- if (heap_wrapper->unbarrieredGet() == nullptr)
+ if (heap_wrapper->unbarrieredGet() == nullptr) {
+ g_type_set_qdata(gtype, gjs_get_gtype_wrapper_quark(), nullptr);
iter = weak_pointer_list.erase(iter);
+ delete heap_wrapper;
+ }
else
iter++;
}
@@ -95,8 +100,12 @@ gjs_gtype_finalize(JSFreeOp *fop,
if (G_UNLIKELY(gtype == 0))
return;
- weak_pointer_list.erase(gtype);
+ auto heap_wrapper = static_cast<JS::Heap<JSObject*>*>(
+ g_type_get_qdata(gtype, gjs_get_gtype_wrapper_quark()));
+
g_type_set_qdata(gtype, gjs_get_gtype_wrapper_quark(), NULL);
+ weak_pointer_list.erase(gtype);
+ delete heap_wrapper;
}
static bool
diff --git a/installed-tests/extra/gjs.supp b/installed-tests/extra/gjs.supp
index c1865cd3..5a9ad035 100644
--- a/installed-tests/extra/gjs.supp
+++ b/installed-tests/extra/gjs.supp
@@ -1,35 +1,6 @@
# Valgrind suppressions file for GJS
# This is intended to be used in addition to GLib's glib.supp file.
-# We leak a small wrapper in GJS for each registered GType.
-
-{
- gtype-wrapper-new
- Memcheck:Leak
- match-leak-kinds: definite
- fun:_Znwm
- fun:gjs_gtype_create_gtype_wrapper
-}
-
-{
- gtype-wrapper-qdata
- Memcheck:Leak
- match-leak-kinds: possible
- ...
- fun:type_set_qdata_W
- fun:g_type_set_qdata
- fun:gjs_gtype_create_gtype_wrapper
-}
-
-{
- g_type_register_fundamental never freed
- Memcheck:Leak
- fun:calloc
- ...
- fun:g_type_register_fundamental
- ...
-}
-
# SpiderMonkey leaks
{
diff --git a/installed-tests/extra/lsan.supp b/installed-tests/extra/lsan.supp
index 0197c492..9b0105c6 100644
--- a/installed-tests/extra/lsan.supp
+++ b/installed-tests/extra/lsan.supp
@@ -1,9 +1,6 @@
# SpiderMonkey leaks a mutex for each GC helper thread.
leak:js::HelperThread::threadLoop
-# We leak a small wrapper in GJS for each registered GType.
-leak:gjs_gtype_create_gtype_wrapper
-
# https://bugs.freedesktop.org/show_bug.cgi?id=105466
leak:libfontconfig.so.1