/* * 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 */