]> granicus.if.org Git - python/commitdiff
- Fixed PyMac_DoYield:
authorJack Jansen <jack.jansen@cwi.nl>
Wed, 4 Sep 1996 15:24:59 +0000 (15:24 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Wed, 4 Sep 1996 15:24:59 +0000 (15:24 +0000)
  - Update lastyield correctly
  - Do event handling if PyMac_YieldEnabled > 0 (previous cmd-. fix
    broke this)
- Use our own GUSISpin routine: fixes crash when exiting with sockets
  open and keeps windows, etc reacting consistently when waiting for
  accepts(), etc.

Mac/Include/macglue.h
Mac/Python/macglue.c
Mac/Python/macmain.c

index 02ee84cd251c08c5b1ff4eab3791eeea7c4726ac..929e9cabd04084c20ccd995a201da4d9dc36e42b 100644 (file)
@@ -46,19 +46,23 @@ void PyMac_FixGUSIcd Py_PROTO((void));      /* Workaround for GUSI chdir() call */
 char *PyMac_StrError(int);                     /* strerror with mac errors */
 
 extern int PyMac_DoYieldEnabled;               /* Don't do eventloop when false */
+#ifdef USE_GUSI
+extern int PyMac_ConsoleIsDead;                        /* True when exiting */
+extern void PyMac_SetGUSISpin(void);   /* Install our private GUSI spin routine */
+#endif
 
 extern PyObject *PyMac_OSErrException;         /* Exception for OSErr */
 PyObject *PyMac_GetOSErrException(void);       /* Initialize & return it */
 
+#ifdef USE_MACTCP
 int PyMac_Idle Py_PROTO((void));               /* Idle routine */
+#endif
 void PyMac_Yield Py_PROTO((void));             /* optional idle routine for mainloop */
 void PyMac_SetYield Py_PROTO((long, long, long, long)); /* Set timeouts */
 PyObject *PyErr_Mac(PyObject *, int);          /* Exception with a mac error */
 PyObject *PyMac_Error(OSErr);                  /* Uses PyMac_GetOSErrException */
 void PyMac_HandleEvent Py_PROTO((EventRecord *)); /* Handle one event, if possible */
 
-int PyMac_Idle(void);                          /* Idle routine */
-
 int PyMac_FindResourceModule(char *, char *); /* Test for 'PYC ' resource in a file */
 PyObject * PyMac_LoadResourceModule(char *, char *); /* Load 'PYC ' resource from file */
 
index 112604ee02850898565cc9b6ca6465085131e1f6..18243ec6875088783e5aa8773309437ca0676472 100644 (file)
@@ -65,6 +65,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #ifdef USE_GUSI
 #include <TFileSpec.h> /* For Path2FSSpec */
 #include <LowMem.h> /* For SetSFCurDir, etc */
+#include <GUSI.h>
 #endif
 
 #ifndef HAVE_UNIVERSAL_HEADERS
@@ -110,6 +111,8 @@ extern FSSpec *mfs_GetFSSpecFSSpec();
 static int interrupted;                        /* Set to true when cmd-. seen */
 static RETSIGTYPE intcatcher Py_PROTO((int));
 
+static void PyMac_DoYield Py_PROTO((int));
+
 /*
 ** We attempt to be a good citizen by giving up the CPU periodically.
 ** When in the foreground we do this less often and for shorter periods
@@ -134,6 +137,11 @@ static int in_foreground;
 */
 int PyMac_DoYieldEnabled = 1;
 
+/*
+** Workaround for sioux/gusi combo: set when we are exiting
+*/
+int PyMac_ConsoleIsDead;
+
 /*
 ** Some stuff for our GetDirectory and PromptGetFile routines
 */
@@ -171,6 +179,40 @@ PyMac_FixGUSIcd()
 void SpinCursor(short x) { /* Dummy */ }
 #endif /* __CFM68K */
 
+/*
+** Replacement GUSI Spin function
+*/
+static int
+PyMac_GUSISpin(spin_msg msg, long arg)
+{
+       static Boolean                  inForeground    =       true;
+       WindowPtr                               win;
+       EventRecord                             ev;
+       int                                             maysleep;
+
+       if (PyMac_ConsoleIsDead) return 0;
+#if 0
+       if (inForeground)
+               SpinCursor(msg == SP_AUTO_SPIN ? short(arg) : 1);
+#endif
+
+       if (interrupted) return -1;
+
+       if ( msg == SP_AUTO_SPIN || ((msg==SP_SLEEP||msg==SP_SELECT) && arg <= yield_fg))
+               maysleep = 0;
+       else
+               maysleep = 0;
+
+       PyMac_DoYield(maysleep);
+
+       return 0;
+}
+
+void
+PyMac_SetGUSISpin() {
+       GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin);
+}
+
 #endif
 
 
@@ -403,7 +445,7 @@ PyMac_HandleEvent(evp)
 ** Yield the CPU to other tasks.
 */
 static void
-PyMac_DoYield()
+PyMac_DoYield(int maysleep)
 {
        EventRecord ev;
        long yield;
@@ -415,19 +457,25 @@ PyMac_DoYield()
                                                        NGetTrapAddress(_Unimplemented, ToolTrap));
        }
 
-       if ( PyMac_DoYieldEnabled >= 0) {
+       lastyield = TickCount();
 #ifndef THINK_C
-               /* Under think this has been done before in intrcheck() or intrpeek() */
+       /* Under think this has been done before in intrcheck() or intrpeek() */
+       if (PyMac_DoYieldEnabled >= 0)
                scan_event_queue(0);
 #endif
+       if (PyMac_DoYieldEnabled == 0)
                return;
-       }
                
        in_foreground = PyMac_InForeground();
-       if ( in_foreground )
-               yield = yield_fg;
-       else
-               yield = yield_bg;
+       if ( maysleep ) {
+               if ( in_foreground )
+                       yield = yield_fg;
+               else
+                       yield = yield_bg;
+       } else {
+               yield = 0;
+       }
+               
        while ( 1 ) {
                if ( no_waitnextevent ) {
                        SystemTask();
@@ -440,7 +488,6 @@ PyMac_DoYield()
                        break;
                PyMac_HandleEvent(&ev);
        }
-       lastyield = TickCount();
 }
 
 /*
@@ -455,9 +502,10 @@ PyMac_Yield() {
        else
                iv = interval_bg;
        if ( TickCount() > lastyield + iv )
-               PyMac_DoYield();
+               PyMac_DoYield(1);
 }
 
+#ifdef USE_MACTCP
 /*
 ** Idle routine for busy-wait loops.
 ** Gives up CPU, handles events and returns true if an interrupt is pending
@@ -466,9 +514,11 @@ PyMac_Yield() {
 int
 PyMac_Idle()
 {
-       PyMac_DoYield();
+       PyMac_DoYield(1);
        return intrpeek();
 }
+#endif
+
 /*
 ** Returns true if the argument has a resource fork, and it contains
 ** a 'PYC ' resource of the correct name
index 7241539f1575464bc33642da606d9677b78bf37d..019e0bec0f9001903bf25585a1f7c180d571bf5e 100644 (file)
@@ -28,6 +28,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include "pythonresources.h"
 #include "import.h"
 #include "marshal.h"
+#include "macglue.h"
 
 #include <Memory.h>
 #include <Resources.h>
@@ -108,6 +109,7 @@ init_common()
 #if defined(USE_GUSI)
        /* Setup GUSI */
        GUSIDefaultSetup();
+       PyMac_SetGUSISpin();
 #endif
 
 #ifdef USE_SIOUX
@@ -396,7 +398,14 @@ PyMac_Exit(status)
        }
        else
                SIOUXSettings.autocloseonquit = 1;
-#endif
+#ifdef USE_GUSI
+       /*
+       ** Workaround for Sioux/GUSI combo: we should not call
+       ** SiouxHandleOneEvent after the window is closed
+       */
+       PyMac_ConsoleIsDead = 1;
+#endif /* USE_GUSI */
+#endif /* USE_SIOUX */
 #ifdef THINK_C
        console_options.pause_atexit = keep;
 #endif