| /*********************************************************** |
| Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The |
| Netherlands. |
| |
| All Rights Reserved |
| |
| Permission to use, copy, modify, and distribute this software and its |
| documentation for any purpose and without fee is hereby granted, |
| provided that the above copyright notice appear in all copies and that |
| both that copyright notice and this permission notice appear in |
| supporting documentation, and that the names of Stichting Mathematisch |
| Centrum or CWI not be used in advertising or publicity pertaining to |
| distribution of the software without specific, written prior permission. |
| |
| STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO |
| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE |
| FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT |
| OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| |
| ******************************************************************/ |
| |
| /* Interface to random parts in ceval.c */ |
| |
| object *call_object PROTO((object *, object *)); |
| |
| object *getglobals PROTO((void)); |
| 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 object *save_thread PROTO((void)); |
| extern void restore_thread PROTO((object *)); |
| |
| #ifdef USE_THREAD |
| |
| #define BGN_SAVE { \ |
| object *_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 */ |