/*
* pThreadsDynamicEnvironment.h -- RS/6000 psuedo-threads work
*/
#ifndef ←P←THREADS←DYNAMIC←ENVIRONMENT←H
#define ←P←THREADS←DYNAMIC←ENVIRONMENT←H
#include "BasicTypes.h"
#include "Threads.h"
typedef struct XR←DynFrameRep {
struct XR←DynFrameRep *df←link;
XR←Pointer df←key;
XR←Pointer df←data[1];
} *XR←DynFrame;
extern XR←DynFrame
XR←GetDynamicEnvironment();
/*
Returns the current dynamic environment of the current thread.
*/
extern XR←DynFrame
XR←LookupInDynamicEnvironment(/* XR←Pointer key, XR←DynFrame de */);
/*
Returns the first frame in de with the given key, or NIL if there
is none.
*/
extern void
XR←SetDynamicEnvironment(/* XR←DynFrame df */);
/*
Sets the dynamic environment of the current thread to df.
*/
extern XR←Pointer XR←UnwindFrameKey;
typedef struct XR←UnwindFrameRep {
XR←DynFrame uf←link;
XR←Pointer uf←key;
XR←MesaProc uf←unwinder;
XR←MesaProc uf←rewinder;
} *XR←UnwindFrame;
extern int
XR←UnwindTo(/* XR←DynFrame target */);
/*
Target must be a tail of the current dynamic environment.
This call has the same effect as XR←SetDynamicEnvironment except
that all unwinders in the difference between the current dynamic
environment and target are called, each with the current
dynamic environment set to what was in effect when they were
pushed.
Returns -1 if target is not a tail of the current dynamic
environment, and 0 otherwise.
NOTE that this call will not return at all if any of the unwinders
that it calls does not do so.
*/
#endif ←P←THREADS←DYNAMIC←ENVIRONMENT←H