sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
#ifndef JOB_TAB_ENTRY
#define JOB_TAB_ENTRY(name) JOB_##name,

#if 0
extern int job_mask, isr_job_mask;
extern void (*job_tab[])(void);
#endif

#define JOB(job) (1 << JOB_##job)
#define SET_JOB(job) (job_tab.mask |= JOB(job))
#define ISR_SET_JOBS(JOBS) { \
	int mask[2], i, new, jobs = JOBS; \
	\
	mask[1] = job_tab.isr_mask[1]; \
	mask[0] = job_tab.isr_mask[0]; \
	for (i = 0; ~(mask[0] & mask[1]) & jobs; ) { \
	    mask[i] |= jobs; \
	    job_tab.isr_mask[i] = mask[i]; \
	    i ^= 1; \
	    new = job_tab.isr_mask[i]; \
	    if (new != mask[i]) { \
		jobs |= new & ~mask[i]; \
		mask[i] = new; \
		i ^= 1; \
	    } \
	} \
}
#define TRANSFER_ISR_JOBS { \
	int mask[2], i, new; \
	\
	mask[1] = job_tab.isr_mask[1]; \
	job_tab.mask |= job_tab.isr_mask[0]; \
	for (i = 0; mask[0] || mask[1];) { \
	    job_tab.isr_mask[i] = 0; \
	    mask[i] = 0; \
	    i ^= 1; \
	    new = job_tab.isr_mask[i]; \
	    if (new != mask[i]) { \
		mask[i] = new; \
		job_tab.mask |= new; \
		i ^= 1; \
	    } \
	} \
}
#define CLEAR_JOB(job) (job_tab.mask &= ~JOB(job))
#define EXTRA_JOBS() ((*job_tab.f[ffs(job_tab.mask)])())
#define REMAINING_JOBS(current) \
	((*job_tab.f[ffs(job_tab.mask &	\
		FIRST_PENDING_JOB - 1 - 2 * JOB(current))])())

enum job_number {

#elif !defined(JOB_EXTERNAL_DECL)
#define JOB_EXTERNAL_DECL

extern struct s_job_tab {
    int mask;
    volatile isr_mask[2];
    void (*f[JOB_TAB_SIZE])(void);
} job_tab;

#undef JOB_TAB_ENTRY
#define JOB_TAB_ENTRY(name) extern void name(void);

#else
#define HAVE_JOBTAB
#undef JOB_TAB_ENTRY
#define JOB_TAB_ENTRY(name) name,

#if 0
int job_mask, isr_job_mask;
void (*job_tab[])(void) = { no_extra_job,
#endif

static void no_extra_job(void) { }

struct s_job_tab job_tab = { 0, {0, 0}, { no_extra_job,

#endif /* JOB_TAB_ENTRY */

JOB_TAB_ENTRY(shutdown_simulation)
JOB_TAB_ENTRY(remove_destructed_objects)
JOB_TAB_ENTRY(call_out)
JOB_TAB_ENTRY(remove_deactivated_interactives)
JOB_TAB_ENTRY(garbage_collection)
JOB_TAB_ENTRY(check_call_out)
/* Entries below can leave the job pending */
#define FIRST_PENDING_JOB JOB(urgent_data)
JOB_TAB_ENTRY(urgent_data)
JOB_TAB_ENTRY(flush_all_output)
JOB_TAB_ENTRY(do_compact_mappings)

#ifndef JOB_EXTERNAL_DECL
#define JOB_TAB_SIZE (JOB_do_compact_mappings + 2)
};
#elif defined(HAVE_JOBTAB)
}}; 
#endif

#if !defined(JOB_EXTERNAL_DECL) || defined(NEED_JOBTAB) > defined(HAVE_JOBTAB)
#include "schedule.h"
#endif