* Makefile: cosmetics
* socketmodule.c: get rid of makepair(); fix makesocketaddr to fix
  broken recvfrom()
* socketmodule: get rid of getStrarg()
* ceval.h: move eval_code() to new file eval.h, so compile.h is no
  longer needed.
* ceval.c: move thread comments to ceval.h; always make save/restore
  thread functions available (for dynloaded modules)
* cdmodule.c, listobject.c: don't include compile.h
* flmodule.c: include ceval.h
* import.c: include eval.h instead of ceval.h
* cgen.py: add forground(); noport(); winopen(""); to initgl().
* bltinmodule.c, socketmodule.c, fileobject.c, posixmodule.c,
  selectmodule.c:
  adapt to threads (add BGN/END SAVE macros)
* stdwinmodule.c: adapt to threads and use a special stdwin lock.
* pythonmain.c: don't include getpythonpath().
* pythonrun.c: use BGN/END SAVE instead of direct calls; also more
  BGN/END SAVE calls etc.
* thread.c: bigger stack size for sun; change exit() to _exit()
* threadmodule.c: use BGN/END SAVE macros where possible
* timemodule.c: adapt better to threads; use BGN/END SAVE; add
  longsleep internal function if BSD_TIME; cosmetics
diff --git a/Include/ceval.h b/Include/ceval.h
index 2ddb7d0..d9708a2 100644
--- a/Include/ceval.h
+++ b/Include/ceval.h
@@ -22,10 +22,7 @@
 
 ******************************************************************/
 
-/* Interface to execute compiled code */
-/* This header depends on "compile.h" */
-
-object *eval_code PROTO((codeobject *, object *, object *, object *));
+/* Interface to random parts in ceval.c */
 
 object *call_object PROTO((object *, object *));
 
@@ -34,3 +31,70 @@
 
 void printtraceback PROTO((FILE *));
 void flushline PROTO((void));
+
+
+/* Interface for threads.
+
+   A module that plans to do a blocking system call (or something else
+   that lasts a long time and doesn't touch Python data) can allow other
+   threads to run as follows:
+
+	...preparations here...
+	BGN_SAVE
+	...blocking system call here...
+	END_SAVE
+	...interpretr result here...
+
+   The BGN_SAVE/END_SAVE pair expands to a {}-surrounded block.
+   To leave the block in the middle (e.g., with return), you must insert
+   a line containing RET_SAVE before the return, e.g.
+
+	if (...premature_exit...) {
+		RET_SAVE
+		err_errno(IOError);
+		return NULL;
+	}
+
+   An alternative is:
+
+	RET_SAVE
+	if (...premature_exit...) {
+		err_errno(IOError);
+		return NULL;
+	}
+	RES_SAVE
+
+   For convenience, that the value of 'errno' is restored across
+   END_SAVE and RET_SAVE.
+
+   WARNING: NEVER NEST CALLS TO BGN_SAVE AND END_SAVE!!!
+
+   The function init_save_thread() should be called only from
+   initthread() in "threadmodule.c".
+
+   Note that not yet all candidates have been converted to use this
+   mechanism!
+*/
+
+extern void init_save_thread PROTO((void));
+extern void *save_thread PROTO((void));
+extern void restore_thread PROTO((void *));
+
+#ifdef USE_THREAD
+
+#define BGN_SAVE { \
+			void *_save; \
+			_save = save_thread();
+#define RET_SAVE	restore_thread(_save);
+#define RES_SAVE	_save = save_thread();
+#define END_SAVE	restore_thread(_save); \
+		 }
+
+#else /* !USE_THREAD */
+
+#define BGN_SAVE {
+#define RET_SAVE
+#define RES_SAVE
+#define END_SAVE }
+
+#endif /* !USE_THREAD */