diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1996-09-04 15:24:59 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1996-09-04 15:24:59 (GMT) |
commit | f6865f77d4536d5a318aad3115be017b70180620 (patch) | |
tree | d1836fcea76c40f6d711858bf9a0209350363aa6 | |
parent | 2e049b2b05e0f47592378f6e281eb2dc75e0e4d9 (diff) | |
download | cpython-f6865f77d4536d5a318aad3115be017b70180620.zip cpython-f6865f77d4536d5a318aad3115be017b70180620.tar.gz cpython-f6865f77d4536d5a318aad3115be017b70180620.tar.bz2 |
- Fixed PyMac_DoYield:
- 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.
-rw-r--r-- | Mac/Include/macglue.h | 8 | ||||
-rw-r--r-- | Mac/Python/macglue.c | 72 | ||||
-rw-r--r-- | Mac/Python/macmain.c | 11 |
3 files changed, 77 insertions, 14 deletions
diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index 02ee84c..929e9ca 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -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 */ diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c index 112604e..18243ec 100644 --- a/Mac/Python/macglue.c +++ b/Mac/Python/macglue.c @@ -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 @@ -135,6 +138,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 */ struct hook_args { @@ -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 diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index 7241539..019e0be 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -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 |