summaryrefslogtreecommitdiff
path: root/src/ivyglibloop.c
diff options
context:
space:
mode:
authorbustico2008-03-21 09:03:34 +0000
committerbustico2008-03-21 09:03:34 +0000
commit6ca781b8a38474ab428d5fcb3b489dfe3e974334 (patch)
tree8c8725c88c3fd031d632a9f2b1f7376d1cb3c75b /src/ivyglibloop.c
parent50236114f04a0050625bedee7c4c02b36b1213ae (diff)
downloadivy-c-6ca781b8a38474ab428d5fcb3b489dfe3e974334.zip
ivy-c-6ca781b8a38474ab428d5fcb3b489dfe3e974334.tar.gz
ivy-c-6ca781b8a38474ab428d5fcb3b489dfe3e974334.tar.bz2
ivy-c-6ca781b8a38474ab428d5fcb3b489dfe3e974334.tar.xz
- numerous fixes
- socket in non blocking mode (resolve some deadlock, and agent are immune to another agent beeing blocked)
Diffstat (limited to 'src/ivyglibloop.c')
-rw-r--r--src/ivyglibloop.c35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/ivyglibloop.c b/src/ivyglibloop.c
index c4976b1..eba2606 100644
--- a/src/ivyglibloop.c
+++ b/src/ivyglibloop.c
@@ -32,10 +32,13 @@
struct _channel {
guint id_read;
+ guint id_write;
guint id_delete;
gpointer data;
ChannelHandleDelete handle_delete;
ChannelHandleRead handle_read;
+ ChannelHandleWrite handle_write;
+ GIOChannel* io_channel;
};
static int channel_initialized = 0;
@@ -49,6 +52,9 @@ static gboolean IvyGlibHandleChannelDelete(GIOChannel *source,
GIOCondition condition,
gpointer data);
+static gboolean IvyGlibHandleChannelWrite(GIOChannel *source,
+ GIOCondition condition,
+ gpointer data);
void IvyChannelInit(void) {
if ( channel_initialized ) return;
@@ -62,19 +68,21 @@ void IvyChannelInit(void) {
Channel IvyChannelAdd(HANDLE fd, void *data,
- ChannelHandleDelete handle_delete,
- ChannelHandleRead handle_read
- ) {
+ ChannelHandleDelete handle_delete,
+ ChannelHandleRead handle_read,
+ ChannelHandleWrite handle_write
+ ) {
Channel channel;
channel = (Channel)g_new(struct _channel, 1);
channel->handle_delete = handle_delete;
channel->handle_read = handle_read;
+ channel->handle_write = handle_write;
channel->data = data;
{
GIOChannel* io_channel = g_io_channel_unix_new(fd);
-
+ channel->io_channel = io_channel;
channel->id_read = g_io_add_watch( io_channel, G_IO_IN,
IvyGlibHandleChannelRead, channel);
channel->id_delete = g_io_add_watch( io_channel, G_IO_ERR | G_IO_HUP,
@@ -83,6 +91,16 @@ Channel IvyChannelAdd(HANDLE fd, void *data,
return channel;
}
+void IvyChannelAddWritableEvent(Channel channel)
+{
+ channel->id_write = g_io_add_watch( channel->io_channel, G_IO_OUT,
+ IvyGlibHandleChannelWrite, channel);
+}
+
+void IvyChannelClearWritableEvent(Channel channel)
+{
+ g_source_remove( channel->id_write );
+}
@@ -103,6 +121,15 @@ static gboolean IvyGlibHandleChannelRead(GIOChannel *source,
return TRUE;
}
+static gboolean IvyGlibHandleChannelWrite(GIOChannel *source,
+ GIOCondition condition,
+ gpointer data) {
+ Channel channel = (Channel)data;
+ TRACE("Handle Channel read %d\n",source );
+ (*channel->handle_write)(channel, g_io_channel_unix_get_fd(source), channel->data);
+ return TRUE;
+}
+
static gboolean IvyGlibHandleChannelDelete(GIOChannel *source,
GIOCondition condition,
gpointer data) {