ftp.nice.ch/pub/next/developer/languages/c/gcc.2.7.2.2.N.b.tar.gz#/lib/gcc-lib/m68k-next-nextstep3/2.7.2.2.f.2/include/mach/message.h

This is message.h in view mode; [Download] [Up]

/* 
 * Mach Operating System
 * Copyright (c) 1989 Carnegie-Mellon University
 * Copyright (c) 1988 Carnegie-Mellon University
 * Copyright (c) 1987 Carnegie-Mellon University
 * All rights reserved.  The CMU software License Agreement specifies
 * the terms and conditions for use and redistribution.
 */
/*
 * HISTORY
 * $Log:	message.h,v $
 * 20-Apr-90  Gregg Kellogg (gk) at NeXT
 *	NeXT: Added in RCV_LARGE option from new IPC.
 *
 * 04-Mar-90  Gregg Kellogg (gk) at NeXT
 *	Go ahead and define MSG_TYPE_PORT_RECEIVE if not MACH_IPC_XXXHACH
 *	for NeXT.  It will work the same as MSG_TYPE_PORT_ALL.
 *
 * Revision 2.13  89/05/01  17:02:55  rpd
 * 	Named the unused bits in msg_header_t and msg_type_t.
 * 	[89/05/01  14:10:59  rpd]
 * 
 * Revision 2.12  89/04/08  23:57:26  rpd
 * 	Added MSG_TYPE_POLYMORPHIC.
 * 	[89/04/08  23:56:51  rpd]
 * 
 * Revision 2.11  89/03/15  15:05:28  gm0w
 * 	Removed define of EXPORT_BOOLEAN and include of mach/boolean.h
 * 	[89/03/14            mrt]
 * 
 * Revision 2.10  89/03/09  20:21:19  rpd
 * 	More cleanup.
 * 
 * Revision 2.9  89/03/05  16:48:39  rpd
 * 	Moved ownership rights under MACH_IPC_XXXHACK (when KERNEL).
 * 	[89/02/16            rpd]
 * 
 * Revision 2.8  89/02/25  18:38:35  gm0w
 * 	Changes for cleanup.
 * 
 * Revision 2.7  89/02/07  00:52:38  mwyoung
 * Relocated from sys/message.h
 * 
 * Revision 2.6  88/10/11  10:25:00  rpd
 * 	Made comments fit into 80 column windows.
 * 	Commented out SEND_MSG_SIZE_CHANGE and SEND_KERNEL.
 * 	[88/10/09  08:48:39  rpd]
 * 
 * Revision 2.5  88/09/25  22:16:18  rpd
 * 	Commented out MSG_TYPE_INVALID.
 * 	[88/09/24  18:10:21  rpd]
 * 
 * Revision 2.4  88/08/24  02:35:27  mwyoung
 * 	Adjusted include file references.
 * 	[88/08/17  02:17:13  mwyoung]
 * 
 * Revision 2.3  88/07/20  21:05:05  rpd
 * Made MSG_TYPE_PORT_NAME a separate type.
 * 
 * 25-Feb-88  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Added SEND_SWITCH for KERNEL-only use; created SEND_USER and
 *	RCV_USER declarations.
 *
 * 20-Nov-87  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Fixed declarations to use msg_timeout_t and msg_size_t everywhere.
 *
 * 12-Nov-87  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Added SEND_MSG_SIZE_CHANGE.
 *
 * 22-Oct-87  David Golub (dbg) at Carnegie-Mellon University
 *	Fixed C++ declaration of msg_rpc.
 *
 * 20-Oct-87  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Add msg_size_t, msg_timeout_t declarations.
 *
 * 13-Oct-87  Mary R. Thompson
 *	Changed timeout params in msg_send, msg_receive and msg_rpc to 
 *	unsigned, since that is how mig declares them.
 *
 * 30-Aug-87  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Added C++ definitions, courtesy of David Detlefs.
 *	Added MSG_TYPE_INTERNAL_MEMORY.
 *
 *  6-Aug-87  Mary Thompson (mrt) at Carnegie Mellon
 *	Added MSG_TYPE_STRING_C to clarify what is intended by the type.
 *
 * 27-May-87  Avadis Tevanian (avie) at Carnegie-Mellon University
 *	Changed msg_size and msg_simple to unsigned int, msg_long_{name,size}
 *	to unsigned shorts.
 *
 * 27-Apr-87  Michael Young (mwyoung) at Carnegie-Mellon University
 *	Added SEND_INTERRUPT option; fixed include file locations;
 *	removed ancient history.
 *
 *	Mach IPC message and primitive function definitions.
 *
 */

#ifndef	_SYS_MESSAGE_H_
#define _SYS_MESSAGE_H_

#include <mach/port.h>

/*
 *	Message data structures.
 *
 *	Messages consist of two parts: a fixed-size header, immediately
 *	followed by a variable-size array of typed data items.
 *
 */

typedef	unsigned int	msg_size_t;

typedef	struct {
		unsigned int	msg_unused : 24,
				msg_simple : 8;
		msg_size_t	msg_size;
		int		msg_type;
		port_t		msg_local_port;
		port_t		msg_remote_port;
		int		msg_id;
} msg_header_t;

#define MSG_SIZE_MAX	8192

/*
 *	Known values for the msg_type field.
 *	These are Accent holdovers, which should be purged when possible.
 *
 *	Only one bit in the msg_type field is used by the kernel.
 *	Others are available to user applications.  See <msg_type.h>
 *	for system application-assigned values.
 */

#define MSG_TYPE_NORMAL		0
#define MSG_TYPE_EMERGENCY	1

/*
 *	Each data item is preceded by a description of that
 *	item, including what type of data, how big it is, and
 *	how many of them are present.
 *
 *	The actual data will either follow this type
 *	descriptor ("inline") or will be specified by a pointer.
 *
 *	If the type name, size, or number is too large to be encoded
 *	in this structure, the "longform" option may be selected,
 *	and those fields must immediately follow in full integer fields.
 *
 *	For convenience, out-of-line data regions or port rights may
 *	be deallocated when the message is sent by specifying the
 *	"deallocate" field.  Beware: if the data item in question is both
 *	out-of-line and contains port rights, then both will be deallocated.
 */

typedef struct  {
	unsigned int	msg_type_name : 8,		/* What kind of data */
			msg_type_size : 8,		/* How many bits is each item */
			msg_type_number : 12,		/* How many items are there */
			msg_type_inline : 1,		/* If true, data follows; else a pointer */
			msg_type_longform : 1,		/* Name, size, number follow: see above */
			msg_type_deallocate : 1,	/* Deallocate port rights or memory */
			msg_type_unused : 1;
} msg_type_t;

typedef	struct	{
	msg_type_t	msg_type_header;
	unsigned short	msg_type_long_name;
	unsigned short	msg_type_long_size;
	unsigned int	msg_type_long_number;
} msg_type_long_t;

/*
 *	Known values for the msg_type_name field.
 *
 *	The only types known to the Mach kernel are
 *	the port types, and those types used in the
 *	kernel RPC interface.
 */

#define MSG_TYPE_UNSTRUCTURED	0
#define MSG_TYPE_BIT		0
#define MSG_TYPE_BOOLEAN	0
#define MSG_TYPE_INTEGER_16	1
#define MSG_TYPE_INTEGER_32	2
#define MSG_TYPE_PORT_ALL	5
#define MSG_TYPE_PORT		6
#define MSG_TYPE_CHAR		8
#define MSG_TYPE_BYTE		9
#define MSG_TYPE_INTEGER_8	9
#define MSG_TYPE_REAL		10
#define MSG_TYPE_STRING		12
#define MSG_TYPE_STRING_C	12
/*	MSG_TYPE_INVALID	13	unused */

#ifdef	KERNEL
#define MSG_TYPE_INTERNAL_MEMORY 14
#else
#define MSG_TYPE_INTERNAL_MEMORY MSG_TYPE_INTEGER_8
#endif

#define MSG_TYPE_PORT_NAME	15		/* A capability name */
#define MSG_TYPE_LAST		16		/* Last assigned */

#define MSG_TYPE_POLYMORPHIC	((unsigned int) -1)

/*
 *	Is a given item a port type?
 */

#define MSG_TYPE_PORT_ANY(x)	\
	(((x) == MSG_TYPE_PORT) || ((x) == MSG_TYPE_PORT_ALL))

/*
 *	Other basic types
 */

typedef	unsigned int	msg_timeout_t;

/*
 *	Options to IPC primitives.
 *
 *	These can be combined by or'ing; the combination RPC call
 *	uses both SEND_ and RCV_ options at once.
 */

typedef	int		msg_option_t;

#define MSG_OPTION_NONE	0x0000	/* Terminate only when message op works */

#define SEND_TIMEOUT	0x0001	/* Terminate on timeout elapsed */
#define SEND_NOTIFY	0x0002	/* Terminate with reply message if need be */

#define SEND_INTERRUPT	0x0004	/* Terminate on software interrupt */

#ifdef	NeXT
#define SEND_SWITCH	0x0020	/* Use handoff scheduling */
#endif

#ifdef	KERNEL
#ifdef	NeXT
#else
#define SEND_USER	(SEND_TIMEOUT|SEND_NOTIFY)
				/* Valid user options */
#endif
#define SEND_ALWAYS	0x0008	/* Never block */
/*	SEND_KERNEL	0x0010	   Kernel is originator (not used) */
#ifdef	NeXT
#define	SEND_USER	(SEND_TIMEOUT|SEND_NOTIFY|SEND_SWITCH)
				/* Valid user options */
#else
#define SEND_SWITCH	0x0020	/* Use handoff scheduling */
#endif
#endif

#define RCV_TIMEOUT	0x0100	/* Terminate on timeout elapsed */
#define RCV_NO_SENDERS	0x0200	/* Terminate if I'm the only sender left */
#define RCV_INTERRUPT	0x0400	/* Terminate on software interrupt */
#if	NeXT
#define RCV_LARGE	0x1000
#endif

#ifdef	KERNEL
#if	NeXT
#define RCV_USER	(RCV_TIMEOUT|RCV_NO_SENDERS|RCV_INTERRUPT|RCV_LARGE)
#else
#define RCV_USER	(RCV_TIMEOUT|RCV_NO_SENDERS|RCV_INTERRUPT)
#endif
#endif

/*
 *	Returns from IPC primitives.
 *
 *	Values are separate in order to allow RPC users to
 *	distinguish which operation failed; for successful completion,
 *	this doesn't matter.
 */

typedef	int		msg_return_t;

#define SEND_SUCCESS		0

#define SEND_ERRORS_START	-100
#ifdef	KERNEL
#define SEND_IN_PROGRESS	-100
#endif
#define SEND_INVALID_MEMORY	-101	/* Message or OOL data invalid */
#define SEND_INVALID_PORT	-102	/* Reference to inacessible port */
#define SEND_TIMED_OUT		-103	/* Terminated due to timeout */
#define SEND_WILL_NOTIFY	-105	/* Msg accepted provisionally */
#define SEND_NOTIFY_IN_PROGRESS	-106	/* Already awaiting a notification */
#define SEND_KERNEL_REFUSED	-107	/* Message to the kernel refused */
#define SEND_INTERRUPTED	-108	/* Software interrupt during send */
#define SEND_MSG_TOO_LARGE	-109	/* Message specified was too large */
#define SEND_MSG_TOO_SMALL	-110	/* Data specified exceeds msg size */
/*	SEND_MSG_SIZE_CHANGE	-111	   Msg size changed during copy */
#define SEND_ERRORS_END		-111

#define msg_return_send(x)	((x) < SEND_ERRORS_START && (x) > SEND_ERRORS_END)

#define RCV_SUCCESS		0

#define RCV_ERRORS_START	-200
#ifdef	KERNEL
#define RCV_IN_PROGRESS		-200
#endif
#define RCV_INVALID_MEMORY	-201
#define RCV_INVALID_PORT	-202
#define RCV_TIMED_OUT		-203
#define RCV_TOO_LARGE		-204	/* Msg structure too small for data */
#define RCV_NOT_ENOUGH_MEMORY	-205	/* Can't find space for OOL data */
#define RCV_ONLY_SENDER		-206	/* Receiver is only sender */
#define RCV_INTERRUPTED		-207
#define RCV_PORT_CHANGE		-208	/* Port was put in a set */
#define RCV_ERRORS_END		-209

#define msg_return_rcv(x)	((x) < RCV_ERRORS_START && (x) > RCV_ERRORS_END)

#define RPC_SUCCESS		0

/*
 *	The IPC primitive functions themselves
 */

msg_return_t	msg_send(
#if	c_plusplus || __STDC__
	msg_header_t	*header,
	msg_option_t	option,
	msg_timeout_t	timeout);
#else
#if	LINTLIBRARY
			header, option, timeout)
	msg_header_t	*header;
	msg_option_t	option;
	msg_timeout_t	timeout;
	{ return(SEND_SUCCESS); }
#else
		);
#endif
#endif

msg_return_t	msg_receive(
#if	c_plusplus || __STDC__
	msg_header_t	*header,
	msg_option_t	option,
	msg_timeout_t	timeout);
#else
#if	LINTLIBRARY
			header, option, timeout)
	msg_header_t	*header;
	msg_option_t	option;
	msg_timeout_t	timeout;
	{ return(RCV_SUCCESS); }
#else
		);
#endif
#endif

msg_return_t	msg_rpc(
#if	c_plusplus || __STDC__
	msg_header_t	*header,	/* in/out */
	msg_option_t	option,
	msg_size_t	rcv_size,
	msg_timeout_t	send_timeout,
	msg_timeout_t	rcv_timeout);
#else
#if	LINTLIBRARY
			header, option, rcv_size,
			send_timeout, rcv_timeout)
	msg_header_t	*header;	/* in/out */
	msg_option_t	option;
	msg_size_t	rcv_size;
	msg_timeout_t	send_timeout;
	msg_timeout_t	rcv_timeout;
	{ return(RPC_SUCCESS); }
#else
		);
#endif
#endif

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.