mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-05-31 18:00:06 +02:00
Make GSocketSourceFunc return the GSocket
This is very useful when you have multiple sockets with sources.
This commit is contained in:
parent
7ffdc91f51
commit
bd87df9e73
@ -81,6 +81,7 @@ typedef struct
|
|||||||
GPollFD pollfd;
|
GPollFD pollfd;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
gulong cancelled_tag;
|
gulong cancelled_tag;
|
||||||
|
GObject *object;
|
||||||
} FDSource;
|
} FDSource;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -93,7 +94,7 @@ fd_source_prepare (GSource *source,
|
|||||||
return g_cancellable_is_cancelled (fd_source->cancellable);
|
return g_cancellable_is_cancelled (fd_source->cancellable);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fd_source_check (GSource *source)
|
fd_source_check (GSource *source)
|
||||||
{
|
{
|
||||||
FDSource *fd_source = (FDSource *)source;
|
FDSource *fd_source = (FDSource *)source;
|
||||||
@ -110,14 +111,18 @@ fd_source_dispatch (GSource *source,
|
|||||||
|
|
||||||
{
|
{
|
||||||
GFDSourceFunc func = (GFDSourceFunc)callback;
|
GFDSourceFunc func = (GFDSourceFunc)callback;
|
||||||
|
GFDSourceObjectFunc func2 = (GFDSourceObjectFunc)callback;
|
||||||
FDSource *fd_source = (FDSource *)source;
|
FDSource *fd_source = (FDSource *)source;
|
||||||
|
|
||||||
g_warn_if_fail (func != NULL);
|
g_warn_if_fail (func != NULL);
|
||||||
|
|
||||||
return (*func) (user_data, fd_source->pollfd.revents, fd_source->pollfd.fd);
|
if (fd_source->object)
|
||||||
|
return (*func2) (fd_source->object, fd_source->pollfd.revents, user_data);
|
||||||
|
else
|
||||||
|
return (*func) (user_data, fd_source->pollfd.revents, fd_source->pollfd.fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fd_source_finalize (GSource *source)
|
fd_source_finalize (GSource *source)
|
||||||
{
|
{
|
||||||
FDSource *fd_source = (FDSource *)source;
|
FDSource *fd_source = (FDSource *)source;
|
||||||
@ -128,6 +133,9 @@ fd_source_finalize (GSource *source)
|
|||||||
|
|
||||||
if (fd_source->cancellable)
|
if (fd_source->cancellable)
|
||||||
g_object_unref (fd_source->cancellable);
|
g_object_unref (fd_source->cancellable);
|
||||||
|
|
||||||
|
if (fd_source->object)
|
||||||
|
g_object_unref (fd_source->object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GSourceFuncs fd_source_funcs = {
|
static GSourceFuncs fd_source_funcs = {
|
||||||
@ -147,9 +155,10 @@ fd_source_cancelled_cb (GCancellable *cancellable,
|
|||||||
}
|
}
|
||||||
|
|
||||||
GSource *
|
GSource *
|
||||||
_g_fd_source_new (int fd,
|
_g_fd_source_new_with_object (GObject *object,
|
||||||
gushort events,
|
int fd,
|
||||||
GCancellable *cancellable)
|
gushort events,
|
||||||
|
GCancellable *cancellable)
|
||||||
{
|
{
|
||||||
GSource *source;
|
GSource *source;
|
||||||
FDSource *fd_source;
|
FDSource *fd_source;
|
||||||
@ -159,16 +168,27 @@ _g_fd_source_new (int fd,
|
|||||||
|
|
||||||
if (cancellable)
|
if (cancellable)
|
||||||
fd_source->cancellable = g_object_ref (cancellable);
|
fd_source->cancellable = g_object_ref (cancellable);
|
||||||
|
|
||||||
|
if (object)
|
||||||
|
fd_source->object = g_object_ref (object);
|
||||||
|
|
||||||
fd_source->pollfd.fd = fd;
|
fd_source->pollfd.fd = fd;
|
||||||
fd_source->pollfd.events = events;
|
fd_source->pollfd.events = events;
|
||||||
g_source_add_poll (source, &fd_source->pollfd);
|
g_source_add_poll (source, &fd_source->pollfd);
|
||||||
|
|
||||||
if (cancellable)
|
if (cancellable)
|
||||||
fd_source->cancelled_tag =
|
fd_source->cancelled_tag =
|
||||||
g_cancellable_connect (cancellable,
|
g_cancellable_connect (cancellable,
|
||||||
(GCallback)fd_source_cancelled_cb,
|
(GCallback)fd_source_cancelled_cb,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSource *
|
||||||
|
_g_fd_source_new (int fd,
|
||||||
|
gushort events,
|
||||||
|
GCancellable *cancellable)
|
||||||
|
{
|
||||||
|
return _g_fd_source_new_with_object (NULL, fd, events, cancellable);
|
||||||
|
}
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#define __G_ASYNC_HELPER_H__
|
#define __G_ASYNC_HELPER_H__
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
@ -37,6 +38,9 @@ typedef struct
|
|||||||
typedef gboolean (*GFDSourceFunc) (gpointer user_data,
|
typedef gboolean (*GFDSourceFunc) (gpointer user_data,
|
||||||
GIOCondition condition,
|
GIOCondition condition,
|
||||||
int fd);
|
int fd);
|
||||||
|
typedef gboolean (*GFDSourceObjectFunc) (GObject *object,
|
||||||
|
GIOCondition condition,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
void _g_queue_async_result (GAsyncResultData *result,
|
void _g_queue_async_result (GAsyncResultData *result,
|
||||||
gpointer async_object,
|
gpointer async_object,
|
||||||
@ -44,9 +48,13 @@ void _g_queue_async_result (GAsyncResultData *result,
|
|||||||
gpointer user_data,
|
gpointer user_data,
|
||||||
GSourceFunc source_func);
|
GSourceFunc source_func);
|
||||||
|
|
||||||
GSource *_g_fd_source_new (int fd,
|
GSource *_g_fd_source_new_with_object (GObject *object,
|
||||||
gushort events,
|
int fd,
|
||||||
GCancellable *cancellable);
|
gushort events,
|
||||||
|
GCancellable *cancellable);
|
||||||
|
GSource *_g_fd_source_new (int fd,
|
||||||
|
gushort events,
|
||||||
|
GCancellable *cancellable);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -223,16 +223,18 @@ typedef void (*GSimpleAsyncThreadFunc) (GSimpleAsyncResult *res,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* GSocketSourceFunc:
|
* GSocketSourceFunc:
|
||||||
* @user_data: data passed in by the user.
|
* @socket: the #GSocket
|
||||||
* @condition: the current condition at the source fired.
|
* @condition: the current condition at the source fired.
|
||||||
|
* @user_data: data passed in by the user.
|
||||||
*
|
*
|
||||||
* This is the function type of the callback used for the #GSource
|
* This is the function type of the callback used for the #GSource
|
||||||
* returned by g_socket_create_source().
|
* returned by g_socket_create_source().
|
||||||
*
|
*
|
||||||
* Since: 2.22
|
* Since: 2.22
|
||||||
*/
|
*/
|
||||||
typedef gboolean (*GSocketSourceFunc) (gpointer user_data,
|
typedef gboolean (*GSocketSourceFunc) (GSocket *socket,
|
||||||
GIOCondition condition);
|
GIOCondition condition,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GInputVector:
|
* GInputVector:
|
||||||
|
@ -2089,8 +2089,9 @@ winsock_dispatch (GSource *source,
|
|||||||
GSocketSourceFunc func = (GSocketSourceFunc)callback;
|
GSocketSourceFunc func = (GSocketSourceFunc)callback;
|
||||||
GWinsockSource *winsock_source = (GWinsockSource *)source;
|
GWinsockSource *winsock_source = (GWinsockSource *)source;
|
||||||
|
|
||||||
return (*func) (user_data,
|
return (*func) (winsock_source->socket,
|
||||||
winsock_source->result_condition & winsock_source->condition);
|
winsock_source->result_condition & winsock_source->condition,
|
||||||
|
user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2190,7 +2191,8 @@ g_socket_create_source (GSocket *socket,
|
|||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
source = winsock_source_new (socket, condition, cancellable);
|
source = winsock_source_new (socket, condition, cancellable);
|
||||||
#else
|
#else
|
||||||
source =_g_fd_source_new (socket->priv->fd, condition, cancellable);
|
source =_g_fd_source_new_with_object (G_OBJECT (socket), socket->priv->fd,
|
||||||
|
condition, cancellable);
|
||||||
#endif
|
#endif
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user