diff options
| author | Leslie Zhai <zhaixiang@loongson.cn> | 2025-07-25 16:07:05 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-25 10:07:05 +0200 |
| commit | ec2edd5b3ad67b78587b5cdfadc7d3197ecfb3d1 (patch) | |
| tree | 14ced827b6da7fcf3364e324dc66e1b9fc89c82c /tests | |
| parent | 4a625db27ab46e7b49e388d716591c92ea57e596 (diff) | |
| download | box64-ec2edd5b3ad67b78587b5cdfadc7d3197ecfb3d1.tar.gz box64-ec2edd5b3ad67b78587b5cdfadc7d3197ecfb3d1.zip | |
[WRAPPER] Wrapper wrappedgobject2 g_closure_ref and g_closure_sink (#2848) (#2849)
* [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
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/misc/gclosure | bin | 0 -> 13312 bytes | |||
| -rw-r--r-- | tests/misc/gclosure.c | 69 | ||||
| -rw-r--r-- | tests/misc/gclosure.txt | 4 |
3 files changed, 73 insertions, 0 deletions
diff --git a/tests/misc/gclosure b/tests/misc/gclosure new file mode 100755 index 00000000..139c1209 --- /dev/null +++ b/tests/misc/gclosure Binary files differdiff --git a/tests/misc/gclosure.c b/tests/misc/gclosure.c new file mode 100644 index 00000000..bdbc3304 --- /dev/null +++ b/tests/misc/gclosure.c @@ -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; +} diff --git a/tests/misc/gclosure.txt b/tests/misc/gclosure.txt new file mode 100644 index 00000000..eebbacb0 --- /dev/null +++ b/tests/misc/gclosure.txt @@ -0,0 +1,4 @@ +Initial refcount: 1 +Callback called with: 42, 'Hello GClosure' (user_data: 0x3a5000) +After ref, refcount: 2 +After sinking, refcount: 1 |