From 2d1306b7cf4a85290ffbd90a15fed6115a522310 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Fri, 7 Apr 2000 09:10:49 +0000 Subject: [PATCH] Started on GUSI2 and threading support. --- Mac/Include/macglue.h | 5 +- Mac/Python/getmtime.c | 4 + Mac/Python/gusiconfig.cpp | 101 ++++++++++++++++++ Mac/Python/macgetcompiler.c | 22 +++- Mac/Python/macgetpath.c | 4 +- Mac/Python/macglue.c | 17 +-- Mac/Python/macimport.c | 8 +- Mac/Python/macmain.c | 8 +- Mac/mwerks/errno_unix.h | 2 + Mac/mwerks/mwerks_nonshared_config.h | 3 +- Mac/mwerks/mwerks_plugin_config.h | 3 +- Mac/mwerks/mwerks_shared_config.h | 3 +- Mac/mwerks/mwerks_small_config.h | 5 +- Mac/mwerks/mwerks_threadsmall_config.h | 35 ++++++ Mac/mwerks/mwerks_tkplugin_config.h | 3 +- .../build.macfreeze/frozenbundle.rsrc | Bin 5340 -> 5556 bytes 16 files changed, 194 insertions(+), 29 deletions(-) create mode 100644 Mac/Python/gusiconfig.cpp create mode 100644 Mac/mwerks/mwerks_threadsmall_config.h diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h index bc1939fb1a..ec2dfbd93d 100644 --- a/Mac/Include/macglue.h +++ b/Mac/Include/macglue.h @@ -53,8 +53,9 @@ typedef struct { #pragma lib_export on #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 void PyMac_FixGUSIcd Py_PROTO((void)); /* Workaround for GUSI chdir() call */ +extern void PyMac_SetGUSISpin(void); /* Install our private GUSI spin routine */ #endif char *PyMac_StrError(int); /* strerror with mac errors */ @@ -62,7 +63,6 @@ unsigned char *Pstring(char *str); /* Convert c-string to pascal-string in stat #ifdef USE_GUSI extern int PyMac_ConsoleIsDead; /* True when exiting */ -extern void PyMac_SetGUSISpin(void); /* Install our private GUSI spin routine */ extern void PyMac_StopGUSISpin(void); /* Stop eventprocessing during exit() */ #endif @@ -81,6 +81,7 @@ void PyMac_GetSchedParams Py_PROTO((PyMacSchedParams *)); /* Get schedulers para void PyMac_SetSchedParams Py_PROTO((PyMacSchedParams *)); /* Set schedulers params */ PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ +int PyMac_DoYield Py_PROTO((int, int)); /* Yield cpu. First arg is maxtime, second ok to call python */ int PyMac_HandleEvent Py_PROTO((EventRecord *)); /* Handle one event, possibly in Python */ void PyMac_HandleEventIntern Py_PROTO((EventRecord *)); /* Handle one event internal only */ int PyMac_SetEventHandler Py_PROTO((PyObject *)); /* set python-coded event handler */ diff --git a/Mac/Python/getmtime.c b/Mac/Python/getmtime.c index 29721ee91b..a14ef71695 100644 --- a/Mac/Python/getmtime.c +++ b/Mac/Python/getmtime.c @@ -38,7 +38,11 @@ PERFORMANCE OF THIS SOFTWARE. #ifdef USE_GUSI #include #endif /* USE_GUSI */ +#ifdef USE_GUSI2 +#include +#else #include +#endif #include "rename2.h" long diff --git a/Mac/Python/gusiconfig.cpp b/Mac/Python/gusiconfig.cpp new file mode 100644 index 0000000000..c69498f00b --- /dev/null +++ b/Mac/Python/gusiconfig.cpp @@ -0,0 +1,101 @@ +/* + * Generated with the GUSIConfig application and then hand-modified by jack. + */ + +#define GUSI_SOURCE +#include +#include + +#include "Python.h" +#include "macglue.h" + +static void +PyMac_GUSISpin(bool wait) +{ + static Boolean inForeground = true; + int maxsleep = 6; /* 6 ticks is "normal" sleeptime */ + + if (PyMac_ConsoleIsDead) return; + + if ( !wait ) + maxsleep = 0; + + PyMac_DoYield(maxsleep, 0); /* XXXX or is it safe to call python here? */ +} + + +/* Declarations of Socket Factories */ + +__BEGIN_DECLS +void GUSIwithInetSockets(); +void GUSIwithLocalSockets(); +void GUSIwithMTInetSockets(); +void GUSIwithMTTcpSockets(); +void GUSIwithMTUdpSockets(); +void GUSIwithOTInetSockets(); +void GUSIwithOTTcpSockets(); +void GUSIwithOTUdpSockets(); +void GUSIwithPPCSockets(); +void GUSISetupFactories(); +__END_DECLS + +/* Configure Socket Factories */ + +void GUSISetupFactories() +{ +#ifdef GUSISetupFactories_BeginHook + GUSISetupFactories_BeginHook +#endif + GUSIwithInetSockets(); +#ifdef GUSISetupFactories_EndHook + GUSISetupFactories_EndHook +#endif +} + +/* Declarations of File Devices */ + +__BEGIN_DECLS +void GUSIwithDConSockets(); +void GUSIwithNullSockets(); +void GUSISetupDevices(); +__END_DECLS + +/* Configure File Devices */ + +void GUSISetupDevices() +{ +#ifdef GUSISetupDevices_BeginHook + GUSISetupDevices_BeginHook +#endif +#ifdef GUSISetupDevices_EndHook + GUSISetupDevices_EndHook +#endif +} + +#ifndef __cplusplus +#error GUSISetupConfig() needs to be written in C++ +#endif + +GUSIConfiguration::FileSuffix sSuffices[] = { + "", '????', '????' +}; + +extern "C" void GUSISetupConfig() +{ + GUSIConfiguration * config = + GUSIConfiguration::CreateInstance(GUSIConfiguration::kNoResource); + + config->ConfigureDefaultTypeCreator('TEXT', 'TEXT'); + config->ConfigureSuffices( + sizeof(sSuffices)/sizeof(GUSIConfiguration::FileSuffix)-1, sSuffices); + config->ConfigureAutoInitGraf(false); + config->ConfigureAutoSpin(false); + config->ConfigureHandleAppleEvents(false); + config->ConfigureSigInt(false); + config->ConfigureSigPipe(true); + + GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); + +} + +/**************** END GUSI CONFIGURATION *************************/ diff --git a/Mac/Python/macgetcompiler.c b/Mac/Python/macgetcompiler.c index 347b8d20b6..8836581386 100644 --- a/Mac/Python/macgetcompiler.c +++ b/Mac/Python/macgetcompiler.c @@ -38,23 +38,35 @@ PERFORMANCE OF THIS SOFTWARE. #endif #ifdef __MWERKS__ -#ifdef USE_GUSI -#define HASGUSI " w/GUSI" +#ifdef USE_GUSI1 +#define HASGUSI " w/GUSI1" +#else +#ifdef USE_GUSI2 +#define HASGUSI " w/GUSI2" #else #define HASGUSI "" #endif +#endif + #ifdef USE_MSL #define HASMSL " w/MSL" #else #define HASMSL "" #endif + +#ifdef WITH_THREAD +#define HASTHREAD " w/THREADS" +#else +#define HASTHREAD "" +#endif + #ifdef __powerc -#define COMPILER " [CW PPC" HASGUSI HASMSL "]" +#define COMPILER " [CW PPC" HASGUSI HASMSL HASTHREAD"]" #else #ifdef __CFM68K__ -#define COMPILER " [CW CFM68K" HASGUSI HASMSL "]" +#define COMPILER " [CW CFM68K" HASGUSI HASMSL HASTHREAD"]" #else -#define COMPILER " [CW 68K" HASGUSI HASMSL "]" +#define COMPILER " [CW 68K" HASGUSI HASMSL HASTHREAD"]" #endif #endif #endif diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c index 02f9b485e6..d1c60a07d8 100644 --- a/Mac/Python/macgetpath.c +++ b/Mac/Python/macgetpath.c @@ -54,7 +54,7 @@ PERFORMANCE OF THIS SOFTWARE. #include #include -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include #endif @@ -444,7 +444,7 @@ PyMac_PreferenceOptions(PyMac_PrefRecord *pr) UseResFile(oldrh); } -#ifdef USE_GUSI +#ifdef USE_GUSI1 void PyMac_SetGUSIOptions() { diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c index 46493d3c7e..fd0ddfbb1f 100644 --- a/Mac/Python/macglue.c +++ b/Mac/Python/macglue.c @@ -62,11 +62,11 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #ifdef __MWERKS__ #include #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include /* For Path2FSSpec */ -#include /* For SetSFCurDir, etc */ #include #endif +#include /* The ID of the Sioux apple menu */ #define SIOUX_APPLEID 32000 @@ -108,7 +108,6 @@ extern PyObject *newmfssobject Py_PROTO((FSSpec *)); static int interrupted; /* Set to true when cmd-. seen */ static RETSIGTYPE intcatcher Py_PROTO((int)); -static int PyMac_DoYield Py_PROTO((int, int)); static int PyMac_Yield Py_PROTO((void)); /* @@ -161,7 +160,7 @@ static PyObject *python_event_handler; */ int PyMac_AppearanceCompliant; -#ifdef USE_GUSI +#ifdef USE_GUSI1 /* ** GUSI (1.6.0 and earlier, at the least) do not set the MacOS idea of ** the working directory. Hence, we call this routine after each call @@ -183,7 +182,9 @@ PyMac_FixGUSIcd() if (PBHSetVolSync(&pb) != noErr) return; } +#endif +#ifdef USE_GUSI /* ** SpinCursor (needed by GUSI) drags in heaps of stuff, so we ** provide a dummy here. @@ -194,6 +195,7 @@ void RotateCursor(short x) { /* Dummy */ } /* ** Replacement GUSI Spin function */ +#ifdef USE_GUSI1 static int PyMac_GUSISpin(spin_msg msg, long arg) { @@ -222,6 +224,7 @@ void PyMac_SetGUSISpin() { GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin); } +#endif /* Called at exit() time thru atexit(), to stop event processing */ void @@ -531,7 +534,7 @@ PyMac_HandleEvent(evp) /* ** Yield the CPU to other tasks without processing events. */ -static int +int PyMac_DoYield(int maxsleep, int maycallpython) { EventRecord ev; @@ -563,7 +566,7 @@ PyMac_DoYield(int maxsleep, int maycallpython) } } else { latest_time_ready = LMGetTicks() + maxsleep; - while ( maxsleep >= 0 ) { + do { /* XXXX Hack by Jack. ** In time.sleep() you can click to another application ** once only. If you come back to Python you cannot get away @@ -578,7 +581,7 @@ PyMac_DoYield(int maxsleep, int maycallpython) return -1; } maxsleep = latest_time_ready - LMGetTicks(); - } + } while ( maxsleep > 0 ); } in_here--; return 0; diff --git a/Mac/Python/macimport.c b/Mac/Python/macimport.c index e079d2e5ee..2f5d622b69 100644 --- a/Mac/Python/macimport.c +++ b/Mac/Python/macimport.c @@ -48,7 +48,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #endif #include -#ifdef USE_GUSI +#ifdef USE_GUSI1 #include "TFileSpec.h" /* for Path2FSSpec() */ #endif @@ -104,7 +104,7 @@ findnamedresource( UseResFile(PyMac_AppRefNum); filerh = -1; } else { -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( Path2FSSpec(filename, &fss) != noErr || #else if ( FSMakeFSSpec(0, 0, Pstring(filename), &fss) != noErr || @@ -303,7 +303,7 @@ char *filename; UseResFile(PyMac_AppRefNum); filerh = -1; } else { -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( (err=Path2FSSpec(filename, &fss)) != noErr || FSpGetFInfo(&fss, &finfo) != noErr ) #else @@ -432,7 +432,7 @@ PyMac_FindModuleExtension(char *buf, int *lenp, char *module) #else strcpy(buf+*lenp, _PyImport_Filetab[0].suffix); #endif -#ifdef USE_GUSI +#ifdef USE_GUSI1 if ( Path2FSSpec(buf, &fss) == noErr && FSpGetFInfo(&fss, &finfo) == noErr) return _PyImport_Filetab; diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c index db39e18d1a..98298c8fcd 100644 --- a/Mac/Python/macmain.c +++ b/Mac/Python/macmain.c @@ -225,13 +225,15 @@ init_common(int *argcp, char ***argvp, int embedded) PyMac_AddLibResources(); #endif -#if defined(USE_GUSI) +#if defined(USE_GUSI1) /* Setup GUSI */ GUSIDefaultSetup(); PyMac_SetGUSISpin(); PyMac_SetGUSIOptions(); - atexit(PyMac_StopGUSISpin); #endif +#if defined(USE_GUSI) + atexit(PyMac_StopGUSISpin); +#endif #ifdef USE_SIOUX /* Set various SIOUX flags. Some are changed later based on options */ @@ -405,7 +407,7 @@ PyMac_InitApplication() *endp = '\0'; chdir(curwd); -#ifdef USE_GUSI +#ifdef USE_GUSI1 /* Change MacOS's idea of wd too */ PyMac_FixGUSIcd(); #endif diff --git a/Mac/mwerks/errno_unix.h b/Mac/mwerks/errno_unix.h index 7f63ef6dba..2e6f171240 100644 --- a/Mac/mwerks/errno_unix.h +++ b/Mac/mwerks/errno_unix.h @@ -29,6 +29,7 @@ PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ +#ifndef USE_GUSI2 #define ENOTDIR (-120) #ifndef __MSL__ #define EACCES (-54) @@ -40,6 +41,7 @@ PERFORMANCE OF THIS SOFTWARE. #define ENFILE (-42) #define EIO (-36) #define ENOSPC (-34) +#endif #define ESRCH 3 #define EINTR 4 diff --git a/Mac/mwerks/mwerks_nonshared_config.h b/Mac/mwerks/mwerks_nonshared_config.h index e4bb1c8930..e3d97ec0f8 100644 --- a/Mac/mwerks/mwerks_nonshared_config.h +++ b/Mac/mwerks/mwerks_nonshared_config.h @@ -5,7 +5,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI 2 */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_TOOLBOX /* Include toolbox modules in core Python */ #define USE_QT /* Include quicktime modules in core Python */ diff --git a/Mac/mwerks/mwerks_plugin_config.h b/Mac/mwerks/mwerks_plugin_config.h index 0052df80be..1bb465df24 100644 --- a/Mac/mwerks/mwerks_plugin_config.h +++ b/Mac/mwerks/mwerks_plugin_config.h @@ -2,7 +2,8 @@ ** Config file for dynamically-loaded ppc/cfm68k plugin modules. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_MSL /* Use MSL libraries */ #ifdef USE_MSL #define MSL_USE_PRECOMPILED_HEADERS 0 /* Don't use precomp headers: we include our own */ diff --git a/Mac/mwerks/mwerks_shared_config.h b/Mac/mwerks/mwerks_shared_config.h index 4662d9b236..66174b5840 100644 --- a/Mac/mwerks/mwerks_shared_config.h +++ b/Mac/mwerks/mwerks_shared_config.h @@ -6,7 +6,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +/* #define USE_GUSI1 /* Stdio implemented with GUSI */ +#define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_CORE_TOOLBOX /* Include core toolbox modules (Dlg,Ctl,Menu,Win,Res,Qd) */ /* #define USE_TOOLBOX /* Include all toolbox modules in core Python */ diff --git a/Mac/mwerks/mwerks_small_config.h b/Mac/mwerks/mwerks_small_config.h index 762ef8f1d4..771565b1d3 100644 --- a/Mac/mwerks/mwerks_small_config.h +++ b/Mac/mwerks/mwerks_small_config.h @@ -5,7 +5,8 @@ ** specific features, you may also need different sets of sources. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI2 /* Stdio implemented with GUSI 2 */ +/* # define USE_GUSI1 /* Stdio implemented with GUSI 1 */ #define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ #define USE_TOOLBOX /* Include toolbox modules in core Python */ #define USE_QT /* Include quicktime modules in core Python */ @@ -20,7 +21,7 @@ /* #define USE_MAC_SHARED_LIBRARY /* Enable code to add shared-library resources */ /* #define USE_MAC_APPLET_SUPPORT /* Enable code to run a PYC resource */ /* #define HAVE_DYNAMIC_LOADING /* Enable dynamically loaded modules */ -#define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ +/* #define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ /* #define USE_GDBM /* Include the gdbm module */ /* #define USE_ZLIB /* Include the zlib module */ #define USE_APPEARANCE /* Enable Appearance support */ diff --git a/Mac/mwerks/mwerks_threadsmall_config.h b/Mac/mwerks/mwerks_threadsmall_config.h new file mode 100644 index 0000000000..70a11a0ab5 --- /dev/null +++ b/Mac/mwerks/mwerks_threadsmall_config.h @@ -0,0 +1,35 @@ +/* +** Configuration file for small standalone 68k/ppc Python. +** +** Note: enabling the switches below is not enough to enable the +** specific features, you may also need different sets of sources. +*/ + +#define USE_GUSI2 /* Stdio implemented with GUSI 2 */ +/* # define USE_GUSI1 /* Stdio implemented with GUSI 1 */ +#define WITH_THREAD /* Use thread support (needs GUSI 2, not GUSI 1) */ +#define USE_MSL /* Use Mw Standard Library (as opposed to Plaugher C libraries) */ +#define USE_TOOLBOX /* Include toolbox modules in core Python */ +#define USE_QT /* Include quicktime modules in core Python */ +/* #define USE_WASTE /* Include waste module in core Python */ +#define USE_MACSPEECH /* Include macspeech module in core Python */ +/* #define USE_IMG /* Include img modules in core Python */ +#define USE_MACCTB /* Include ctb module in core Python */ +/* #define USE_STDWIN /* Include stdwin module in core Python */ +/* #define USE_MACTCP /* Include mactcp (*not* socket) modules in core */ +/* #define USE_TK /* Include _tkinter module in core Python */ +/* #define MAC_TCL /* This *must* be on if USE_TK is on */ +/* #define USE_MAC_SHARED_LIBRARY /* Enable code to add shared-library resources */ +/* #define USE_MAC_APPLET_SUPPORT /* Enable code to run a PYC resource */ +/* #define HAVE_DYNAMIC_LOADING /* Enable dynamically loaded modules */ +#define USE_MALLOC_DEBUG /* Enable range checking and other malloc debugging */ +/* #define USE_GDBM /* Include the gdbm module */ +/* #define USE_ZLIB /* Include the zlib module */ +#define USE_APPEARANCE /* Enable Appearance support */ +#ifdef __powerc +#define USE_CACHE_ALIGNED 8 /* Align on 32-byte boundaries for 604 */ +#endif +#ifdef USE_MSL +#define MSL_USE_PRECOMPILED_HEADERS 0 /* Don't use precomp headers: we include our own */ +#include +#endif diff --git a/Mac/mwerks/mwerks_tkplugin_config.h b/Mac/mwerks/mwerks_tkplugin_config.h index 4b9fdc8fc3..88b7552bf9 100644 --- a/Mac/mwerks/mwerks_tkplugin_config.h +++ b/Mac/mwerks/mwerks_tkplugin_config.h @@ -2,6 +2,7 @@ ** Special config-file for _tkinter plugin. */ -#define USE_GUSI /* Stdio implemented with GUSI */ +#define USE_GUSI1 /* Stdio implemented with GUSI */ +/* #define USE_GUSI2 /* Stdio implemented with GUSI */ #define USE_TK /* Include _tkinter module in core Python */ #define MAC_TCL /* This *must* be on if USE_TK is on */ diff --git a/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc b/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc index b219a42833ba87ab74aede4a2e98610bad4045c8..fa2c02ad2ebc39d47b001096488d364b57434a65 100644 GIT binary patch literal 5556 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 R7VBYpydCv=@v!*A`yYZ@9QObK -- 2.50.1