Started on GUSI2 and threading support.
diff --git a/Mac/Include/macglue.h b/Mac/Include/macglue.h
index bc1939f..ec2dfbd 100644
--- a/Mac/Include/macglue.h
+++ b/Mac/Include/macglue.h
@@ -53,8 +53,9 @@
 #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 @@
 
 #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_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 29721ee..a14ef71 100644
--- a/Mac/Python/getmtime.c
+++ b/Mac/Python/getmtime.c
@@ -38,7 +38,11 @@
 #ifdef USE_GUSI
 #include <sys/types.h>
 #endif /* USE_GUSI */
+#ifdef USE_GUSI2
+#include <sys/stat.h>
+#else
 #include <stat.h>
+#endif
 #include "rename2.h"
 
 long
diff --git a/Mac/Python/gusiconfig.cpp b/Mac/Python/gusiconfig.cpp
new file mode 100644
index 0000000..c69498f
--- /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 <GUSIConfig.h>
+#include <sys/cdefs.h>
+
+#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 347b8d2..8836581 100644
--- a/Mac/Python/macgetcompiler.c
+++ b/Mac/Python/macgetcompiler.c
@@ -38,23 +38,35 @@
 #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 02f9b48..d1c60a0 100644
--- a/Mac/Python/macgetpath.c
+++ b/Mac/Python/macgetpath.c
@@ -54,7 +54,7 @@
 #include <TextUtils.h>
 #include <Dialogs.h>
 
-#ifdef USE_GUSI
+#ifdef USE_GUSI1
 #include <GUSI.h>
 #endif
 
@@ -444,7 +444,7 @@
 	UseResFile(oldrh);
 }
 
-#ifdef USE_GUSI
+#ifdef USE_GUSI1
 void
 PyMac_SetGUSIOptions()
 {
diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c
index 46493d3..fd0ddfb 100644
--- a/Mac/Python/macglue.c
+++ b/Mac/Python/macglue.c
@@ -62,11 +62,11 @@
 #ifdef __MWERKS__
 #include <SIOUX.h>
 #endif
-#ifdef USE_GUSI
+#ifdef USE_GUSI1
 #include <TFileSpec.h> /* For Path2FSSpec */
-#include <LowMem.h> /* For SetSFCurDir, etc */
 #include <GUSI.h>
 #endif
+#include <LowMem.h>
 
 /* The ID of the Sioux apple menu */
 #define SIOUX_APPLEID	32000
@@ -108,7 +108,6 @@
 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 @@
 */
 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 @@
 	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 @@
 /*
 ** Replacement GUSI Spin function
 */
+#ifdef USE_GUSI1
 static int
 PyMac_GUSISpin(spin_msg msg, long arg)
 {
@@ -222,6 +224,7 @@
 PyMac_SetGUSISpin() {
 	GUSISetHook(GUSI_SpinHook, (GUSIHook)PyMac_GUSISpin);
 }
+#endif
 
 /* Called at exit() time thru atexit(), to stop event processing */
 void
@@ -531,7 +534,7 @@
 /*
 ** Yield the CPU to other tasks without processing events.
 */
-static int
+int
 PyMac_DoYield(int maxsleep, int maycallpython)
 {
 	EventRecord ev;
@@ -563,7 +566,7 @@
 		}
 	} 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 @@
 				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 e079d2e..2f5d622 100644
--- a/Mac/Python/macimport.c
+++ b/Mac/Python/macimport.c
@@ -48,7 +48,7 @@
 #endif
 #include <CodeFragments.h>
 
-#ifdef USE_GUSI
+#ifdef USE_GUSI1
 #include "TFileSpec.h"	/* for Path2FSSpec() */
 #endif
 
@@ -104,7 +104,7 @@
 		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 @@
 		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 @@
 #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 db39e18..98298c8 100644
--- a/Mac/Python/macmain.c
+++ b/Mac/Python/macmain.c
@@ -225,13 +225,15 @@
 	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 @@
 			*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 7f63ef6..2e6f171 100644
--- a/Mac/mwerks/errno_unix.h
+++ b/Mac/mwerks/errno_unix.h
@@ -29,6 +29,7 @@
 
 ******************************************************************/
 
+#ifndef USE_GUSI2
 #define ENOTDIR		(-120)
 #ifndef __MSL__
 #define EACCES		(-54)
@@ -40,6 +41,7 @@
 #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 e4bb1c8..e3d97ec 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 0052df8..1bb465d 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 4662d9b..66174b5 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 762ef8f..771565b 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 0000000..70a11a0
--- /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 <ansi_prefix.mac.h>
+#endif
diff --git a/Mac/mwerks/mwerks_tkplugin_config.h b/Mac/mwerks/mwerks_tkplugin_config.h
index 4b9fdc8..88b7552 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 b219a42..fa2c02a 100644
--- a/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc
+++ b/Mac/mwerks/projects/build.macfreeze/frozenbundle.rsrc
Binary files differ