From 6ca781b8a38474ab428d5fcb3b489dfe3e974334 Mon Sep 17 00:00:00 2001 From: bustico Date: Fri, 21 Mar 2008 09:03:34 +0000 Subject: - numerous fixes - socket in non blocking mode (resolve some deadlock, and agent are immune to another agent beeing blocked) --- src/ivytcl.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'src/ivytcl.c') diff --git a/src/ivytcl.c b/src/ivytcl.c index 5f70a5a..19a6b6b 100644 --- a/src/ivytcl.c +++ b/src/ivytcl.c @@ -45,6 +45,7 @@ struct _channel { Tcl_Channel tcl_channel; ChannelHandleDelete handle_delete; ChannelHandleRead handle_read; + ChannelHandleWrite handle_write; }; @@ -84,8 +85,9 @@ IvyHandleFd(ClientData cd, /*printf("handle event %d\n", mask);*/ if (mask == TCL_READABLE) { (*channel->handle_read)(channel,channel->fd,channel->data); - } - else if (mask == TCL_EXCEPTION) { + } else if (mask == TCL_WRITABLE) { + (*channel->handle_write)(channel,channel->fd,channel->data); + } else if (mask == TCL_EXCEPTION) { (*channel->handle_delete)(channel->data); } } @@ -102,7 +104,8 @@ void IvyChannelRemove( Channel channel ) Channel IvyChannelAdd(HANDLE fd, void *data, ChannelHandleDelete handle_delete, - ChannelHandleRead handle_read + ChannelHandleRead handle_read, + ChannelHandleWrite handle_write ) { Channel channel; @@ -116,15 +119,40 @@ Channel IvyChannelAdd(HANDLE fd, void *data, channel->handle_delete = handle_delete; channel->handle_read = handle_read; + channel->handle_write = handle_write; channel->data = data; channel->fd = fd; /*printf("Create handle fd %d\n", fd);*/ - channel->tcl_channel = Tcl_MakeTcpClientChannel((void*)fd); - Tcl_CreateChannelHandler(channel->tcl_channel, TCL_READABLE|TCL_EXCEPTION, IvyHandleFd, (ClientData) channel); + channel->tcl_channel = Tcl_MakeTcpClientChannel((void*) fd); + Tcl_CreateChannelHandler(channel->tcl_channel, TCL_READABLE|TCL_EXCEPTION, + IvyHandleFd, (ClientData) channel); return channel; } + + +void IvyChannelAddWritableEvent(Channel channel) +{ + // On change juste le masque + Tcl_CreateChannelHandler(channel->tcl_channel, TCL_READABLE|TCL_WRITABLE|TCL_EXCEPTION, + IvyHandleFd, (ClientData) channel); +} + +void IvyChannelClearWritableEvent(Channel channel) +{ + // On change juste le masque + Tcl_CreateChannelHandler(channel->tcl_channel, TCL_READABLE|TCL_EXCEPTION, + IvyHandleFd, (ClientData) channel); +} + + + + + + + + #else /* On utilisa la procedure Idle et la boucle Standard Ivy */ void IvyIdleProc(ClientData clientData) -- cgit v1.1