mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-24 14:36:13 +01:00
Implement closure-related methods for gio GSource types
Also, fix up the argument ordering on GFDSourceFunc https://bugzilla.gnome.org/show_bug.cgi?id=634239
This commit is contained in:
parent
ece936e84d
commit
73d823ac1e
@ -78,7 +78,7 @@ fd_source_dispatch (GSource *source,
|
||||
|
||||
g_warn_if_fail (func != NULL);
|
||||
|
||||
return (*func) (user_data, fd_source->pollfd.revents, fd_source->pollfd.fd);
|
||||
return (*func) (fd_source->pollfd.fd, fd_source->pollfd.revents, user_data);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -98,11 +98,66 @@ fd_source_finalize (GSource *source)
|
||||
g_object_unref (fd_source->cancellable);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
fd_source_closure_callback (int fd,
|
||||
GIOCondition condition,
|
||||
gpointer data)
|
||||
{
|
||||
GClosure *closure = data;
|
||||
|
||||
GValue params[2] = { { 0, }, { 0, } };
|
||||
GValue result_value = { 0, };
|
||||
gboolean result;
|
||||
|
||||
g_value_init (&result_value, G_TYPE_BOOLEAN);
|
||||
|
||||
g_value_init (¶ms[0], G_TYPE_INT);
|
||||
g_value_set_int (¶ms[0], fd);
|
||||
|
||||
g_value_init (¶ms[1], G_TYPE_IO_CONDITION);
|
||||
g_value_set_flags (¶ms[1], condition);
|
||||
|
||||
g_closure_invoke (closure, &result_value, 2, params, NULL);
|
||||
|
||||
result = g_value_get_boolean (&result_value);
|
||||
g_value_unset (&result_value);
|
||||
g_value_unset (¶ms[0]);
|
||||
g_value_unset (¶ms[1]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
fd_source_closure_marshal (GClosure *closure,
|
||||
GValue *return_value,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer invocation_hint,
|
||||
gpointer marshal_data)
|
||||
{
|
||||
GFDSourceFunc callback;
|
||||
GCClosure *cc = (GCClosure*) closure;
|
||||
gboolean v_return;
|
||||
|
||||
g_return_if_fail (return_value != NULL);
|
||||
g_return_if_fail (n_param_values == 0);
|
||||
|
||||
callback = (GFDSourceFunc) (marshal_data ? marshal_data : cc->callback);
|
||||
|
||||
v_return = callback (g_value_get_int (param_values),
|
||||
g_value_get_flags (param_values + 1),
|
||||
closure->data);
|
||||
|
||||
g_value_set_boolean (return_value, v_return);
|
||||
}
|
||||
|
||||
static GSourceFuncs fd_source_funcs = {
|
||||
fd_source_prepare,
|
||||
fd_source_check,
|
||||
fd_source_dispatch,
|
||||
fd_source_finalize
|
||||
fd_source_finalize,
|
||||
(GSourceFunc)fd_source_closure_callback,
|
||||
(GSourceDummyMarshal)fd_source_closure_marshal,
|
||||
};
|
||||
|
||||
/* Might be called on another thread */
|
||||
|
@ -27,9 +27,9 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef gboolean (*GFDSourceFunc) (gpointer user_data,
|
||||
typedef gboolean (*GFDSourceFunc) (int fd,
|
||||
GIOCondition condition,
|
||||
int fd);
|
||||
gpointer user_data);
|
||||
|
||||
GSource *_g_fd_source_new (int fd,
|
||||
gushort events,
|
||||
|
@ -25,3 +25,5 @@ VOID:POINTER,INT,STRING
|
||||
BOOLEAN:OBJECT
|
||||
INT:OBJECT
|
||||
VOID:INT64
|
||||
VOID:UINT64
|
||||
BOOLEAN:FLAGS
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include "gioerror.h"
|
||||
#include "gioenums.h"
|
||||
#include "gioerror.h"
|
||||
#include "gio-marshal.h"
|
||||
#include "gnetworkingprivate.h"
|
||||
#include "gsocketaddress.h"
|
||||
#include "gsocketcontrolmessage.h"
|
||||
@ -2493,12 +2494,42 @@ socket_source_finalize (GSource *source)
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
socket_source_closure_callback (GSocket *socket,
|
||||
GIOCondition condition,
|
||||
gpointer data)
|
||||
{
|
||||
GClosure *closure = data;
|
||||
|
||||
GValue params[2] = { { 0, }, { 0, } };
|
||||
GValue result_value = { 0, };
|
||||
gboolean result;
|
||||
|
||||
g_value_init (&result_value, G_TYPE_BOOLEAN);
|
||||
|
||||
g_value_init (¶ms[0], G_TYPE_SOCKET);
|
||||
g_value_set_object (¶ms[0], socket);
|
||||
g_value_init (¶ms[1], G_TYPE_IO_CONDITION);
|
||||
g_value_set_flags (¶ms[1], condition);
|
||||
|
||||
g_closure_invoke (closure, &result_value, 2, params, NULL);
|
||||
|
||||
result = g_value_get_boolean (&result_value);
|
||||
g_value_unset (&result_value);
|
||||
g_value_unset (¶ms[0]);
|
||||
g_value_unset (¶ms[1]);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GSourceFuncs socket_source_funcs =
|
||||
{
|
||||
socket_source_prepare,
|
||||
socket_source_check,
|
||||
socket_source_dispatch,
|
||||
socket_source_finalize
|
||||
socket_source_finalize,
|
||||
(GSourceFunc)socket_source_closure_callback,
|
||||
(GSourceDummyMarshal)_gio_marshal_BOOLEAN__FLAGS,
|
||||
};
|
||||
|
||||
static GSource *
|
||||
|
@ -422,9 +422,9 @@ typedef struct {
|
||||
} ReadAsyncData;
|
||||
|
||||
static gboolean
|
||||
read_async_cb (ReadAsyncData *data,
|
||||
read_async_cb (int fd,
|
||||
GIOCondition condition,
|
||||
int fd)
|
||||
ReadAsyncData *data)
|
||||
{
|
||||
GSimpleAsyncResult *simple;
|
||||
GError *error = NULL;
|
||||
|
@ -409,9 +409,9 @@ typedef struct {
|
||||
} WriteAsyncData;
|
||||
|
||||
static gboolean
|
||||
write_async_cb (WriteAsyncData *data,
|
||||
write_async_cb (int fd,
|
||||
GIOCondition condition,
|
||||
int fd)
|
||||
WriteAsyncData *data)
|
||||
{
|
||||
GSimpleAsyncResult *simple;
|
||||
GError *error = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user