From 2d30718caf0f081f72fa1b9f89bb8d53a06c7116 Mon Sep 17 00:00:00 2001 From: fcolin Date: Wed, 24 Mar 2004 10:10:15 +0000 Subject: Pb de mainloop TCL sous windows --- src/Makefile.mingw | 45 ++++++++++++++++++++++++--------------------- src/ivyloop.c | 25 +++++++++++++++++++++++++ src/ivysocket.c | 9 ++++++--- src/ivytcl.c | 33 +++++++++++++++++++++++++++------ 4 files changed, 82 insertions(+), 30 deletions(-) (limited to 'src') 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; } -- cgit v1.1