mirror of
https://github.com/ptitSeb/box64.git
synced 2025-10-14 02:38:54 +08:00
* [WRAPPER] Wrapper wrappedgobject2 g_closure_ref and g_closure_sink (#2848) * [WRAPPER] Add testcase for g_closure_ref and g_closure_sink * [WRAPPER] Just use GO for g_closure_ref|sink|invoke
This commit is contained in:
@@ -77,15 +77,15 @@ GOM(g_closure_add_finalize_notifier, vFEppp)
|
||||
//GOM(g_closure_add_marshal_guards, vFppppp)
|
||||
GO(g_closure_get_type, LFv)
|
||||
//GOM(g_closure_invalidate, vFp)
|
||||
//GOM(g_closure_invoke, vFppupp)
|
||||
GO(g_closure_invoke, vFppupp)
|
||||
//GOM(g_closure_new_object, pFup)
|
||||
GO(g_closure_new_simple, pFup)
|
||||
//GOM(g_closure_ref, pFp)
|
||||
GO(g_closure_ref, pFp)
|
||||
GOM(g_closure_remove_finalize_notifier, vFEppp)
|
||||
//GOM(g_closure_remove_invalidate_notifier, vFppp)
|
||||
GOM(g_closure_set_marshal, vFEpp)
|
||||
//GOM(g_closure_set_meta_marshal, vFppp)
|
||||
//GOM(g_closure_sink, vFp)
|
||||
GO(g_closure_sink, vFp)
|
||||
GO(g_closure_unref, vFp)
|
||||
GO(g_date_get_type, LFv)
|
||||
GO(g_date_time_get_type, LFv)
|
||||
|
BIN
tests/misc/gclosure
Executable file
BIN
tests/misc/gclosure
Executable file
Binary file not shown.
69
tests/misc/gclosure.c
Normal file
69
tests/misc/gclosure.c
Normal file
@@ -0,0 +1,69 @@
|
||||
// gcc gclosure.c -o gclosure `pkg-config --cflags --libs gobject-2.0`
|
||||
#include <glib-object.h>
|
||||
|
||||
typedef void (*MyCallback)(gint arg1, const gchar* arg2, gpointer user_data);
|
||||
|
||||
void my_marshal(GClosure* closure,
|
||||
GValue* return_value,
|
||||
guint n_param_values,
|
||||
const GValue* param_values,
|
||||
gpointer invocation_hint,
|
||||
gpointer marshal_data)
|
||||
{
|
||||
g_return_if_fail(n_param_values == 3);
|
||||
|
||||
MyCallback callback;
|
||||
callback = (MyCallback)g_value_get_pointer(¶m_values[0]);
|
||||
|
||||
if (!callback)
|
||||
return;
|
||||
|
||||
gint arg1 = g_value_get_int(¶m_values[1]);
|
||||
const gchar* arg2 = g_value_get_string(¶m_values[2]);
|
||||
|
||||
callback(arg1, arg2, closure->data);
|
||||
}
|
||||
|
||||
void example_callback(gint num, gchar* str, gpointer user_data)
|
||||
{
|
||||
g_print("Callback called with: %d, '%s' (user_data: %p)\n",
|
||||
num, str, user_data);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
GClosure* closure = g_closure_new_simple(sizeof(GClosure), NULL);
|
||||
g_print("Initial refcount: %d\n", closure->ref_count);
|
||||
|
||||
g_closure_set_marshal(closure, my_marshal);
|
||||
|
||||
gpointer user_data = (gpointer)0x3a5000;
|
||||
closure->data = user_data;
|
||||
|
||||
GValue params[3] = { G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT };
|
||||
|
||||
g_value_init(¶ms[0], G_TYPE_POINTER);
|
||||
g_value_set_pointer(¶ms[0], example_callback);
|
||||
|
||||
g_value_init(¶ms[1], G_TYPE_INT);
|
||||
g_value_set_int(¶ms[1], 42);
|
||||
|
||||
g_value_init(¶ms[2], G_TYPE_STRING);
|
||||
g_value_set_string(¶ms[2], "Hello GClosure");
|
||||
|
||||
GValue return_value = G_VALUE_INIT;
|
||||
g_closure_invoke(closure, &return_value, 3, params, NULL);
|
||||
|
||||
g_closure_ref(closure);
|
||||
g_print("After ref, refcount: %d\n", closure->ref_count);
|
||||
|
||||
g_closure_sink(closure);
|
||||
g_print("After sinking, refcount: %d\n", closure->ref_count);
|
||||
|
||||
g_closure_unref(closure);
|
||||
g_value_unset(¶ms[0]);
|
||||
g_value_unset(¶ms[1]);
|
||||
g_value_unset(¶ms[2]);
|
||||
|
||||
return 0;
|
||||
}
|
4
tests/misc/gclosure.txt
Normal file
4
tests/misc/gclosure.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Initial refcount: 1
|
||||
Callback called with: 42, 'Hello GClosure' (user_data: 0x3a5000)
|
||||
After ref, refcount: 2
|
||||
After sinking, refcount: 1
|
Reference in New Issue
Block a user