mirror of https://github.com/python/cpython
- 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.
This commit is contained in:
parent
2e049b2b05
commit
f6865f77d4
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue