summaryrefslogtreecommitdiff
path: root/src/ivytcl.c
diff options
context:
space:
mode:
authorbustico2008-03-21 09:03:34 +0000
committerbustico2008-03-21 09:03:34 +0000
commit6ca781b8a38474ab428d5fcb3b489dfe3e974334 (patch)
tree8c8725c88c3fd031d632a9f2b1f7376d1cb3c75b /src/ivytcl.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/ivytcl.c')
-rw-r--r--src/ivytcl.c38
1 files changed, 33 insertions, 5 deletions
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)