#define NOOP (void)0
+#define WITH_THR(s) do { dTHR; s; } while (0)
#ifdef USE_THREADS
#ifdef FAKE_THREADS
#include "fakethr.h"
#include <pthread.h>
typedef pthread_mutex_t perl_mutex;
typedef pthread_cond_t perl_cond;
+typedef pthread_key_t perl_key;
#endif /* FAKE_THREADS */
#endif /* USE_THREADS */
#endif
-/* Digital UNIX defines CONTEXT when pthreads is in use */
-#ifdef CONTEXT
-# undef CONTEXT
+/* Digital UNIX defines a typedef CONTEXT when pthreads is in use */
+#if defined(__osf__)
+# define CONTEXT PERL_CONTEXT
#endif
typedef MEM_SIZE STRLEN;
# endif
# endif
# define PAD_SV(po) pad_sv(po)
+# define RUNOPS_DEFAULT runops_debug
#else
# define PAD_SV(po) curpad[po]
+# define RUNOPS_DEFAULT runops_standard
#endif
/****************/
/* global state */
EXT PerlInterpreter * curinterp; /* currently running interpreter */
#ifdef USE_THREADS
-EXT pthread_key_t thr_key; /* For per-thread struct thread ptr */
+EXT perl_key thr_key; /* For per-thread struct thread ptr */
EXT perl_mutex sv_mutex; /* Mutex for allocating SVs in sv.c */
EXT perl_mutex malloc_mutex; /* Mutex for malloc */
EXT perl_mutex eval_mutex; /* Mutex for doeval */
EXT int nthreads; /* Number of threads currently */
EXT perl_mutex nthreads_mutex; /* Mutex for nthreads */
EXT perl_cond nthreads_cond; /* Condition variable for nthreads */
+#ifdef FAKE_THREADS
+EXT struct thread * thr; /* Currently executing (fake) thread */
+#endif
#endif /* USE_THREADS */
/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
#else
EXT OP * op; /* current op--when not in a global register */
#endif
+EXT int (*runops) _((void)) INIT(RUNOPS_DEFAULT);
EXT I32 * scopestack; /* blocks we've entered */
EXT I32 scopestack_ix;
EXT I32 scopestack_max;
IEXT SV * Icurstname; /* name of current package */
IEXT AV * Ibeginav; /* names of BEGIN subroutines */
IEXT AV * Iendav; /* names of END subroutines */
-IEXT AV * Irestartav; /* names of RESTART subroutines */
+IEXT AV * Iinitav; /* names of INIT subroutines */
IEXT HV * Istrtab; /* shared string table */
/* memory management */
/* stack stuff */
IEXT AV * Icurstack; /* THE STACK */
IEXT AV * Imainstack; /* the stack when nothing funny is happening */
+#if 0
IEXT SV ** Imystack_base; /* stack->array_ary */
IEXT SV ** Imystack_sp; /* stack pointer now */
IEXT SV ** Imystack_max; /* stack->array_ary + stack->array_max */
+#endif
/* format accumulators */
IEXT SV * Iformtarget;