/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * * PCR Threads Critical Section support. * */ #ifndef ←←PCR←ThCrSec←h #define ←←PCR←ThCrSec←h 1 #include <config/PCR←StdTypes.h> #define PCR←ThCrSec←DEBUG 1 #if PCR←ThCrSec←DEBUG extern void PCR←ThCrSec←Oops(); #endif /* * Lib critical sections (for calling async-unsafe procedures): * * Sig handlers are not invoked. * No preemption occurs. * Voluntary thread switching is allowed. * Multiple processors may be in lib critical sections * concurrently. * * * Sys critical sections (system implementation use only): * * Sig handlers are not invoked. * No preemption occurs. * Voluntary thread switching is allowed. * Mutual exclusion between processors. * */ /* * CrSec procs */ extern void PCR←ThCrSec←EnterSys(void); /* Enter a critical section. */ extern void PCR←ThCrSec←ExitSys(void); /* Leave a sys critical section, and if not nested do any deferred actions. */ extern PCR←Bool PCR←ThCrSec←InSysCrSec(void); /* Test whether currently in a critical section. */ extern PCR←Bool PCR←ThCrSec←InSysCrSecs(void); /* Test whether in a nested critical section. */ /* * Lib CrSec procs -- analogous to sys CrSec procs */ extern void PCR←ThCrSec←EnterLib(void); extern void PCR←ThCrSec←ExitLib(void); extern PCR←Bool PCR←ThCrSec←InLibCrSec(void); extern PCR←Bool PCR←ThCrSec←InLibCrSecs(void); /* * Common stuff to record arrival of signals * in critical sections where preemption is disabled ... */ extern void PCR←ThCrSec←MustCheckSigs(void); /* Arrange to check for arrival of signals the next time we leave a sys or lib critical section. */ extern void PCR←ThCrSec←MustYield(void); /* Arrange for a reschedule (preemption) the next time we leave a sys critical section. */ /* * Inline all this stuff ... */ #if !defined(←←PCR←ThCrSecInlines←h) && !defined(PCR←ThCrSec←NINLINES) # include <th/PCR←ThCrSecInlines.h> #endif #endif /* ! ←←PCR←ThCrSec←h */ /* $Log$ */