summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>1996-09-04 15:24:59 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>1996-09-04 15:24:59 (GMT)
commitf6865f77d4536d5a318aad3115be017b70180620 (patch)
treed1836fcea76c40f6d711858bf9a0209350363aa6
parent2e049b2b05e0f47592378f6e281eb2dc75e0e4d9 (diff)
downloadcpython-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.h8
-rw-r--r--Mac/Python/macglue.c72
-rw-r--r--Mac/Python/macmain.c11
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