diff options
author | Guido van Rossum <guido@python.org> | 1992-08-05 19:58:53 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-08-05 19:58:53 (GMT) |
commit | ff4949eeee7f86117d4a69599777ff5564315e39 (patch) | |
tree | 551b1b2d53d665fb81d10dd1d51e433be0512604 /Include/ceval.h | |
parent | 25bec8c8dc0de55694cc573ef6d213ee5babd306 (diff) | |
download | cpython-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.h | 72 |
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 */ |