[gjs: 1/22] object: Pass the instance pointer to toggle notify
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs: 1/22] object: Pass the instance pointer to toggle notify
- Date: Fri, 23 Apr 2021 04:56:06 +0000 (UTC)
commit 9b0232c0c728d2b6a668a263004883556af43178
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date: Wed Mar 24 03:26:11 2021 +0100
object: Pass the instance pointer to toggle notify
There's no need to lookup the object pointer again during toggle notify
callback as we can just use the current instance, as in case the
underlying gobject is destroyed earlier we'd still remove the toggle
notification on dispose notify.
gi/object.cpp | 20 +++++++++-----------
gi/object.h | 2 ++
2 files changed, 11 insertions(+), 11 deletions(-)
---
diff --git a/gi/object.cpp b/gi/object.cpp
index 39ce7f5f..75b29be3 100644
--- a/gi/object.cpp
+++ b/gi/object.cpp
@@ -1084,17 +1084,14 @@ static void wrapped_gobj_dispose_notify(
where_the_object_was);
}
-static void wrapped_gobj_toggle_notify(void*, GObject* gobj,
- gboolean is_last_ref);
-
void
ObjectInstance::gobj_dispose_notify(void)
{
m_gobj_disposed = true;
if (m_uses_toggle_ref) {
- g_object_remove_toggle_ref(m_ptr, wrapped_gobj_toggle_notify, nullptr);
- wrapped_gobj_toggle_notify(nullptr, m_ptr, TRUE);
+ g_object_remove_toggle_ref(m_ptr, wrapped_gobj_toggle_notify, this);
+ wrapped_gobj_toggle_notify(this, m_ptr, TRUE);
}
}
@@ -1222,10 +1219,11 @@ toggle_handler(GObject *gobj,
}
}
-static void wrapped_gobj_toggle_notify(void*, GObject* gobj,
- gboolean is_last_ref) {
+void ObjectInstance::wrapped_gobj_toggle_notify(void* instance, GObject* gobj,
+ gboolean is_last_ref) {
bool is_main_thread;
bool toggle_up_queued, toggle_down_queued;
+ auto* self = static_cast<ObjectInstance*>(instance);
GjsContextPrivate* gjs = GjsContextPrivate::from_current_context();
if (gjs->destroying()) {
@@ -1281,7 +1279,7 @@ static void wrapped_gobj_toggle_notify(void*, GObject* gobj,
toggle_up_queued? "up" : "down");
}
- ObjectInstance::for_gobject(gobj)->toggle_down();
+ self->toggle_down();
} else {
toggle_queue.enqueue(gobj, ToggleQueue::DOWN, toggle_handler);
}
@@ -1296,7 +1294,7 @@ static void wrapped_gobj_toggle_notify(void*, GObject* gobj,
g_error("toggling up object %s that's already queued to toggle up\n",
G_OBJECT_TYPE_NAME(gobj));
}
- ObjectInstance::for_gobject(gobj)->toggle_up();
+ self->toggle_up();
} else {
toggle_queue.enqueue(gobj, ToggleQueue::UP, toggle_handler);
}
@@ -1311,7 +1309,7 @@ ObjectInstance::release_native_object(void)
m_ptr.release();
else if (m_uses_toggle_ref)
g_object_remove_toggle_ref(m_ptr.release(), wrapped_gobj_toggle_notify,
- nullptr);
+ this);
else
m_ptr = nullptr;
}
@@ -1459,7 +1457,7 @@ ObjectInstance::ensure_uses_toggle_ref(JSContext *cx)
*/
m_uses_toggle_ref = true;
switch_to_rooted(cx);
- g_object_add_toggle_ref(m_ptr, wrapped_gobj_toggle_notify, nullptr);
+ g_object_add_toggle_ref(m_ptr, wrapped_gobj_toggle_notify, this);
/* We now have both a ref and a toggle ref, we only want the toggle ref.
* This may immediately remove the GC root we just added, since refcount
diff --git a/gi/object.h b/gi/object.h
index 3d707971..bdc50de6 100644
--- a/gi/object.h
+++ b/gi/object.h
@@ -477,6 +477,8 @@ class ObjectInstance : public GIWrapperInstance<ObjectBase, ObjectPrototype,
void gobj_dispose_notify(void);
static void context_dispose_notify(void* data,
GObject* where_the_object_was);
+ static void wrapped_gobj_toggle_notify(void* instance, GObject* gobj,
+ gboolean is_last_ref);
};
GJS_JSAPI_RETURN_CONVENTION
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]