/*
 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * The contents of this file constitute Original Code as defined in and
 * are subject to the Apple Public Source License Version 1.1 (the
 * "License").  You may not use this file except in compliance with the
 * License.  Please obtain a copy of the License at
 * http://www.apple.com/publicsource and read it before using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/* 
 * Mach Operating System
 * Copyright (c) 1989 Carnegie-Mellon University
 * All rights reserved.  The CMU software License Agreement specifies
 * the terms and conditions for use and redistribution.
 */

/*
 * HISTORY
 * 08-Mar-90  Avadis Tevanian, Jr. (avie) at NeXT
 *	Added errno field to cproc structure.
 *
 */

/*
 * cthread_internals.h - by Eric Cooper
 *
 * Private definitions for the C Threads implementation.
 *
 * The cproc structure is used for different implementations
 * of the basic schedulable units that execute cthreads.
 *
 *	MTHREAD		MACH threads; single address space,
 *			kernel-mode preemptive scheduling
 */
#include <assert.h>
#include <mach/mach.h>
#include <mach/mach_error.h>

/*
 * Low-level thread implementation.
 * This structure must agree with struct ur_cthread in cthreads.h
 */
typedef struct cproc {
	struct cproc *next;	 /* for lock, condition, and ready queues */
	struct cproc *incarnation;	/* for cthread_self() */
	int state;
	mach_port_t reply_port;		/* for mig_get_reply_port() */

	mach_port_t wait_port;

	int id;
	struct cproc *link;		/* so all cprocs can be found
					   after a fork() */
	int flags;

	unsigned int stack_base;
	unsigned int stack_size;
	int	error;

} *cproc_t;

#define	NO_CPROC		((cproc_t) 0)
#define	cproc_self()		((cproc_t) ur_cthread_self())
extern void cthread_set_self(cproc_t p);

/*
 * Possible cproc states.
 */
#define	CPROC_RUNNING		0
#define	CPROC_SPINNING		1
#define	CPROC_BLOCKED		2

/*
 * The cproc flag bits.
 */
#define CPROC_INITIAL_STACK	0x1
#define	CPROC_NOCACHE_THREAD	/* Don't try to cache this cthread on exit */

/*
 * C Threads imports:
 */
#ifdef __STRICT_BSD__
extern char *malloc();
#endif /* __STRICT_BSD__ */

/*
 * Mach imports:
 */
extern void mach_error();

/*
 * C library imports:
 */
#ifdef __STRICT_BSD__
extern exit();
#else
#include <stdlib.h>
#endif /* __STRICT_BSD__ */

/*
 * Macro for MACH kernel calls.
 */
#ifndef MACH_CALL
#define	MACH_CALL(expr, ret) {						\
	if (((ret) = (expr)) != KERN_SUCCESS) {				\
		mach_error(#expr, (ret));				\
		assert(0);						\
	}								\
}
#endif

/*
 * Debugging support.
 */
#ifdef	CTHREADS_DEBUG

#define	private
#define	TRACE(x)	if (cthread_debug) x ; else
extern int cthread_debug;

/*
 * C library imports:
 */
#include <stdio.h>
#include <stdlib.h>
#else	/* CTHREADS_DEBUG */

#define	private static
#define	TRACE(x)

#endif	/* DEBUG */
