Make GSocketSourceFunc return the GSocket

This is very useful when you have multiple sockets with sources.
This commit is contained in:
Alexander Larsson 2009-05-14 16:58:47 +02:00
parent 7ffdc91f51
commit bd87df9e73
4 changed files with 50 additions and 18 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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:

View File

@ -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;
} }