summaryrefslogtreecommitdiffstats
path: root/Include/ceval.h
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-08-05 19:58:53 (GMT)
committerGuido van Rossum <guido@python.org>1992-08-05 19:58:53 (GMT)
commitff4949eeee7f86117d4a69599777ff5564315e39 (patch)
tree551b1b2d53d665fb81d10dd1d51e433be0512604 /Include/ceval.h
parent25bec8c8dc0de55694cc573ef6d213ee5babd306 (diff)
downloadcpython-ff4949eeee7f86117d4a69599777ff5564315e39.zip
cpython-ff4949eeee7f86117d4a69599777ff5564315e39.tar.gz
cpython-ff4949eeee7f86117d4a69599777ff5564315e39.tar.bz2
* 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
Diffstat (limited to 'Include/ceval.h')
-rw-r--r--Include/ceval.h72
1 files changed, 68 insertions, 4 deletions
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 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/
-/* 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 @@ object *getlocals PROTO((void));
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 */