/***********************************************************
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 */
