/*
Copyright (c) 1993 Xerox Corporation.  All rights reserved.
*/
/*
$Id$

$Date$
 *
 * Basic public type definitions for PCR threads
 *
 */


#ifndef	←←PCR←ThTypes←h
#define ←←PCR←ThTypes←h 1

#include <config/PCR←Arch.h>
#include <config/PCR←StdTypes.h>
#include <sig/PCR←SigTypes.h>


/*
 * Threads are heap objects and completely opaque.
 */

#define PCR←Th←T struct PCR←Th←TRep
typedef PCR←Th←T * PCR←Th←TPtr;

/*
 * Monitor Locks
 *
 * MLs are opaque but clients may allocate and initialize them.
 */

#   if PCR←Arch←STD←SIZES
        struct PCR←Th←MLRep {
            long mlrep←opaque[2];
        };
#   else
#       error define ML for this architecture
#   endif

typedef volatile struct PCR←Th←MLRep PCR←Th←ML;

#define PCR←Th←ML←null { 0 }


/*
 * Condition variables
 *
 * CVs are opaque but clients may allocate and initialize them.
 */

#   if PCR←Arch←STD←SIZES
        struct PCR←Th←CVRep {
            long cvrep←opaque[2];
        };
#   else
#       error define ML for this architecture
#   endif


typedef volatile struct PCR←Th←CVRep PCR←Th←CV;

#define PCR←Th←CV←null { 0 }

/*
 * Priority
 *
 * Client priorities must lie between userBackground and userForeground.
 */

typedef unsigned PCR←Th←Pri;

#define PCR←Th←Pri←←stopped	((PCR←Th←Pri)(0))
#define PCR←Th←Pri←stopped	PCR←Th←Pri←←stopped

#define PCR←Th←Pri←←idle	((PCR←Th←Pri)(1))
#define PCR←Th←Pri←idle		PCR←Th←Pri←←idle

#endif /* ! ←←PCR←Th←h */

/*
$Log$
*/