summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfcolin2004-03-24 10:10:15 +0000
committerfcolin2004-03-24 10:10:15 +0000
commit2d30718caf0f081f72fa1b9f89bb8d53a06c7116 (patch)
treeff7ec69a1accc054df83d975d8277a77f0088177 /src
parentc4882d9a22570672b064fe62cb81e48c651259f5 (diff)
downloadivy-c-2d30718caf0f081f72fa1b9f89bb8d53a06c7116.zip
ivy-c-2d30718caf0f081f72fa1b9f89bb8d53a06c7116.tar.gz
ivy-c-2d30718caf0f081f72fa1b9f89bb8d53a06c7116.tar.bz2
ivy-c-2d30718caf0f081f72fa1b9f89bb8d53a06c7116.tar.xz
Pb de mainloop TCL sous windows
Diffstat (limited to 'src')
-rwxr-xr-xsrc/Makefile.mingw45
-rw-r--r--src/ivyloop.c25
-rw-r--r--src/ivysocket.c9
-rwxr-xr-xsrc/ivytcl.c33
4 files changed, 82 insertions, 30 deletions
diff --git a/src/Makefile.mingw b/src/Makefile.mingw
index dea04ca..8ed6cee 100755
--- a/src/Makefile.mingw
+++ b/src/Makefile.mingw
@@ -18,9 +18,10 @@
MAJOR=3
MINOR=5
-
-XTINC = -I/usr/X11R6/include
-XTLIB = -L/usr/X11R6/lib
+RM=del
+#RM=rm -f
+XTINC =
+XTLIB =
GTKINC = `gtk-config --cflags`
#GTKINC = -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include
GTKLIB = `gtk-config --libs`
@@ -31,26 +32,28 @@ TCLINCL = -I/usr/include/tcl8.4
TCLLIB = -ltcl84
CC=gcc
-CFLAGS = -g
+CFLAGS = -g
+# IVY full debug
+#CFLAGS = -g -DDEBUG
OBJ = ivyloop.o timer.o ivysocket.o ivy.o
GOBJ = ivyloop.o timer.o ivysocket.o givy.o
XTOBJ = ivyxtloop.o ivysocket.o ivy.o
GTKOBJ = ivygtkloop.o ivysocket.o ivy.o
GLUTOBJ = ivyglutloop.o ivysocket.o ivy.o
-TCLOBJ = ivytcl.o ivysocket.o givy.o
-TARGETS = ivyprobe ivygtkprobe ivyxtprobe
-# not yiet need Modified Glut ivyglutprobe
+TCLOBJ = ivytcl.o ivyloop.o timer.o ivysocket.o givy.o
+TARGETS = ivyprobe
+# not yiet ivygtkprobe ivyxtprobe need Modified Glut ivyglutprobe
.c.o:
$(CC) $(CFLAGS) -c $*.c
all: static-libs commands shared-libs
-static-libs: libivy.a libgivy.a libtclivy.a libxtivy.a libgtkivy.a
-# not yiet need Modified Glut libglutivy.a
+static-libs: libivy.a libgivy.a libtclivy.a
+# not yiet libxtivy.a libgtkivy.a need Modified Glut libglutivy.a
-shared-libs: libivy.so.$(MAJOR).$(MINOR) libgivy.so.$(MAJOR).$(MINOR) libxtivy.so.$(MAJOR).$(MINOR) libgtkivy.so.$(MAJOR).$(MINOR) libtclivy.so.$(MAJOR).$(MINOR)
-# not yiet need Modified Glut libglutivy.so.$(MAJOR).$(MINOR)
+shared-libs: libivy.so.$(MAJOR).$(MINOR) libgivy.so.$(MAJOR).$(MINOR) libtclivy.so.$(MAJOR).$(MINOR)
+# not yiet libxtivy.so.$(MAJOR).$(MINOR) libgtkivy.so.$(MAJOR).$(MINOR) need Modified Glut libglutivy.so.$(MAJOR).$(MINOR)
commands: $(TARGETS)
@@ -68,8 +71,8 @@ ivygtkloop.o: ivygtkloop.c ivygtkloop.h
ivyprobe: ivyprobe.o libivy.a
$(CC) $(CFLAGS) -o ivyprobe ivyprobe.o -L. -livy -lwsock32 -lregex
- # SOLARIS: use this line
- # $(CC) $(CFLAGS) -o ivyprobe ivyprobe.o -L. -livy -lsocket -lnsl
+# SOLARIS: use this line
+# $(CC) $(CFLAGS) -o ivyprobe ivyprobe.o -L. -livy -lsocket -lnsl
ivyxtprobe.o : ivyprobe.c
$(CC) $(CFLAGS) -c ivyprobe.c -o ivyxtprobe.o $(XTINC) -DXTMAINLOOP
@@ -90,34 +93,34 @@ ivyglutprobe: ivyglutprobe.o libglutivy.a
$(CC) -o ivyglutprobe ivyglutprobe.o -L. $(GLUTLIB) -lglutivy -lglut -lGLU -lGL -lX11 -lXmu
libivy.a: $(OBJ)
- rm -f $@
+ $(RM) $@
ar q $@ $(OBJ)
libgivy.a: $(GOBJ)
- rm -f $@
+ $(RM) $@
ar q $@ $(GOBJ)
libxtivy.a: $(XTOBJ)
- rm -f $@
+ $(RM) $@
ar cq $@ $(XTOBJ)
libgtkivy.a: $(GTKOBJ)
- rm -f $@
+ $(RM) $@
ar cq $@ $(GTKOBJ)
libglutivy.a: $(GLUTOBJ)
- rm -f $@
+ $(RM) $@
ar cq $@ $(GLUTOBJ)
libtclivy.a: $(TCLOBJ)
- rm -f $@
+ $(RM) $@
ar cq $@ $(TCLOBJ)
libivy.so.$(MAJOR).$(MINOR): $(OBJ)
$(CC) -shared -Wl,-soname,libivy.so.$(MAJOR) -o $@ $(OBJ) -lwsock32 -lregex
libgivy.so.$(MAJOR).$(MINOR): $(GOBJ)
- $(CC) -shared -Wl,-soname,libgivy.so.$(MAJOR) -o $@ $(GOBJ)
+ $(CC) -shared -Wl,-soname,libgivy.so.$(MAJOR) -o $@ $(GOBJ) -lwsock32 -lregex
libxtivy.so.$(MAJOR).$(MINOR): $(XTOBJ)
$(CC) -shared -Wl,-soname,libxtivy.so.$(MAJOR) -o $@ \
@@ -136,7 +139,7 @@ libtclivy.so.$(MAJOR).$(MINOR): $(TCLOBJ)
$(TCLOBJ) $(TCLLIB) -lwsock32 -lregex
clean:
- -rm -f $(TARGETS) *.o *.a *.so *.so.* *~
+ -$(RM) $(TARGETS) *.o *.a *.so *.so.* *~
installlibs: static-libs shared-libs
test -d $(PREFIX)/usr/lib || mkdirhier $(PREFIX)/usr/lib
diff --git a/src/ivyloop.c b/src/ivyloop.c
index c3022ab..9ccd427 100644
--- a/src/ivyloop.c
+++ b/src/ivyloop.c
@@ -192,3 +192,28 @@ void IvyMainLoop(void(*hook)(void))
}
}
+void IvyIdle()
+{
+
+ fd_set rdset;
+ fd_set exset;
+ int ready;
+ struct timeval timeout = {0,0};
+
+
+ ChannelDefferedDelete();
+ rdset = open_fds;
+ exset = open_fds;
+ ready = select(64, &rdset, 0, &exset, &timeout);
+ if (ready < 0 && (errno != EINTR)) {
+ fprintf (stderr, "select error %d\n",errno);
+ perror("select");
+ return;
+ }
+ if (ready > 0) {
+ IvyChannelHandleExcpt(&exset);
+ IvyChannelHandleRead(&rdset);
+ }
+
+}
+
diff --git a/src/ivysocket.c b/src/ivysocket.c
index 234f4c9..c3bdb77 100644
--- a/src/ivysocket.c
+++ b/src/ivysocket.c
@@ -166,13 +166,18 @@ static void HandleServer(Channel channel, HANDLE fd, void *data)
HANDLE ns;
socklen_t addrlen;
struct sockaddr_in remote2;
-
+#ifdef DEBUG
+ printf( "Accepting Connection...\n");
+#endif //DEBUG
addrlen = sizeof (remote2 );
if ((ns = accept (fd, (struct sockaddr *)&remote2, &addrlen)) <0)
{
perror ("*** accept ***");
return;
};
+#ifdef DEBUG
+ printf( "Accepting Connection ret\n");
+#endif //DEBUG
IVY_LIST_ADD (clients_list, client );
if (!client )
{
@@ -214,9 +219,7 @@ Server SocketServer(unsigned short port,
if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char*)&one,sizeof(one)) < 0)
{
-#ifdef WIN32
fprintf(stderr," setsockopt %d\n",WSAGetLastError());
-#endif
perror ("*** set socket option SO_REUSEADDR ***");
exit(0);
}
diff --git a/src/ivytcl.c b/src/ivytcl.c
index 81bab2c..f14a864 100755
--- a/src/ivytcl.c
+++ b/src/ivytcl.c
@@ -28,6 +28,16 @@
#include "ivy.h"
#include "timer.h"
+//#define TCL_CHANNEL_INTEGRATION
+#ifdef TCL_CHANNEL_INTEGRATION
+// On utilisa la boucle Standard TCL
+// mais il y a des problemes sur les socket server
+// Il n'y a pas de Tcl_MakeTCPserver
+
+ChannelInit channel_init = IvyTclChannelInit;
+ChannelSetUp channel_setup = IvyTclChannelSetUp;
+ChannelClose channel_close = IvyTclChannelClose;
+
struct _channel {
HANDLE fd;
void *data;
@@ -40,15 +50,11 @@ struct _channel {
static int channel_initialized = 0;
-ChannelInit channel_init = IvyTclChannelInit;
-ChannelSetUp channel_setup = IvyTclChannelSetUp;
-ChannelClose channel_close = IvyTclChannelClose;
#ifdef WIN32
WSADATA WsaData;
#endif
-
void IvyTclChannelInit(void)
{
#ifdef WIN32
@@ -98,6 +104,7 @@ Channel IvyTclChannelSetUp(HANDLE fd, void *data,
ChannelHandleRead handle_read
)
{
+ char channelName[16 + TCL_INTEGER_SPACE];
Channel channel;
channel = (Channel)ckalloc( sizeof (struct _channel) );
@@ -114,15 +121,26 @@ Channel IvyTclChannelSetUp(HANDLE fd, void *data,
/*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);
+ Tcl_CreateChannelHandler(channel->tcl_channel, TCL_READABLE|TCL_EXCEPTION, IvyHandleFd, (ClientData) channel);
return channel;
}
+#else
+// On utilisa la procedure Idle et la boucle Standard Ivy
+void IvyIdleProc(ClientData clientData)
+{
+ IvyIdle();
+ Tcl_DoWhenIdle(IvyIdleProc,0);
+}
+#endif
void
-IvyStop ()
+TclIvyStop ()
{
/* To be implemented */
+#ifndef TCL_CHANNEL_INTEGRATION
+ Tcl_CancelIdleCall(IvyIdleProc,0);
+#endif
}
/* Code from PLC */
@@ -607,6 +625,9 @@ Tclivy_Init(Tcl_Interp *interp)
Tcl_CreateCommand(interp, "Ivy::applist", IvyApplicationListCmd, NULL, NULL);
Tcl_CreateCommand(interp, "Ivy::apphost", IvyApplicationHostCmd, NULL, NULL);
Tcl_CreateCommand(interp, "Ivy::appmsgs", IvyApplicationMsgsCmd, NULL, NULL);
+#ifndef TCL_CHANNEL_INTEGRATION
+ Tcl_DoWhenIdle(IvyIdleProc,0);
+#endif
return TCL_OK;
}