diff options
author | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2018-10-13 16:52:33 +0200 |
---|---|---|
committer | Philip Chimento <philip.chimento@gmail.com> | 2018-11-12 12:04:16 -0500 |
commit | 350be1936a671d3ce6ddba0c2a0b5a4bfe19ef90 (patch) | |
tree | bda150d87550eafe6e83f9fa3b579ec9e8148f9f | |
parent | 0f77ebd6ccb96ef209a8d4bdbeec6d362fb28254 (diff) | |
download | gjs-350be1936a671d3ce6ddba0c2a0b5a4bfe19ef90.tar.gz |
gtype: delete heap wrappers on gtype removal
-rw-r--r-- | gi/gtype.cpp | 15 | ||||
-rw-r--r-- | installed-tests/extra/gjs.supp | 29 | ||||
-rw-r--r-- | installed-tests/extra/lsan.supp | 3 |
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 |