]> granicus.if.org Git - python/commitdiff
Mac hack to make select() work again...
authorGuido van Rossum <guido@python.org>
Mon, 2 Jun 1997 22:16:43 +0000 (22:16 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 2 Jun 1997 22:16:43 +0000 (22:16 +0000)
Modules/_tkinter.c

index fccfb30dda5597dee0361d551eba9a37f97b412b..d6506b4173247d13931fb602e3382a4105a9f1a0 100644 (file)
@@ -49,6 +49,7 @@ PERFORMANCE OF THIS SOFTWARE.
 
 #ifdef macintosh
 #define MAC_TCL
+#include "myselect.h"
 #endif
 
 #include <tcl.h>
@@ -1590,6 +1591,66 @@ PyMacConvertEvent(eventPtr)
        return TkMacConvertEvent(eventPtr);
 }
 
+#ifdef USE_GUSI
+/*
+ * For Python we have to override this routine (from TclMacNotify),
+ * since we use GUSI for our sockets, not Tcl streams. Hence, we have
+ * to use GUSI select to see whether our socket is ready. Note that
+ * createfilehandler (above) sets the type to TCL_UNIX_FD for our
+ * files and sockets.
+ *
+ * NOTE: this code was lifted from Tcl 7.6, it may need to be modified
+ * for other versions.  */
+
+int
+Tcl_FileReady(file, mask)
+    Tcl_File file;             /* File handle for a stream. */
+    int mask;                  /* OR'ed combination of TCL_READABLE,
+                                * TCL_WRITABLE, and TCL_EXCEPTION:
+                                * indicates conditions caller cares about. */
+{
+    int type;
+    int fd;
+
+    fd = (int) Tcl_GetFileInfo(file, &type);
+
+    if (type == TCL_MAC_SOCKET) {
+       return TclMacSocketReady(file, mask);
+    } else if (type == TCL_MAC_FILE) {
+       /*
+        * Under the Macintosh, files are always ready, so we just 
+        * return the mask that was passed in.
+        */
+
+       return mask;
+    } else if (type == TCL_UNIX_FD) {
+       fd_set readset, writeset, excset;
+       struct timeval tv;
+       
+       FD_ZERO(&readset);
+       FD_ZERO(&writeset);
+       FD_ZERO(&excset);
+       
+       if ( mask & TCL_READABLE ) FD_SET(fd, &readset);
+       if ( mask & TCL_WRITABLE ) FD_SET(fd, &writeset);
+       if ( mask & TCL_EXCEPTION ) FD_SET(fd, &excset);
+       
+       tv.tv_sec = tv.tv_usec = 0;
+       if ( select(fd+1, &readset, &writeset, &excset, &tv) <= 0 )
+               return 0;
+       
+       mask = 0;
+       if ( FD_ISSET(fd, &readset) ) mask |= TCL_READABLE;
+       if ( FD_ISSET(fd, &writeset) ) mask |= TCL_WRITABLE;
+       if ( FD_ISSET(fd, &excset) ) mask |= TCL_EXCEPTION;
+
+       return mask;
+    }
+    
+    return 0;
+}
+#endif /* USE_GUSI */
+
 #if GENERATINGCFM
 
 /*