1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Mach Operating System 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Copyright (c) 1991,1990,1989 Carnegie Mellon University 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * All Rights Reserved. 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Permission to use, copy, modify and distribute this software and its 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * documentation is hereby granted, provided that both the copyright 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * notice and this permission notice appear in all copies of the 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * software, derivative works or modified versions, and any portions 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * thereof, and that both notices appear in supporting documentation. 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Carnegie Mellon requests users of this software to return to 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * School of Computer Science 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Carnegie Mellon University 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Pittsburgh PA 15213-3890 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * any improvements or extensions that they make and grant Carnegie Mellon 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the rights to redistribute these changes. 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * HISTORY 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * $Log:mach_msg.c,v $ 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Revision 2.3 92/01/23 15:22:17 rpd 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Fixed to not pass MACH_SEND_INTERRUPT and MACH_RCV_INTERRUPT 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to the kernel. 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * [92/01/20 rpd] 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Revision 2.2 92/01/15 17:17:13 rpd 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Created from msg.c. 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * [92/01/15 rpd] 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if defined(VGO_darwin) 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_basics.h" 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_core_mach.h" 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <mach/port.h> 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <mach/message.h> 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LIBMACH_OPTIONS (MACH_SEND_INTERRUPT|MACH_RCV_INTERRUPT) 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern mach_msg_return_t 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmach_msg_trap(mach_msg_header_t *msg, 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_option_t option, 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_size_t send_size, 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_size_t rcv_size, 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_port_t rcv_name, 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_timeout_t timeout, 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_port_t notify); 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmach_msg_return_t 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownmach_msg(msg, option, send_size, rcv_size, rcv_name, timeout, notify) 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_header_t *msg; 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_option_t option; 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_size_t send_size; 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_size_t rcv_size; 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_port_t rcv_name; 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_timeout_t timeout; 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_port_t notify; 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mach_msg_return_t mr; 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Consider the following cases: 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *1) Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *plus special bits). 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *2) Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options. 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *3) RPC calls with interruptions in one/both halves. 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * We refrain from passing the option bits that we implement 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to the kernel. This prevents their presence from inhibiting 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the kernel's fast paths (when it checks the option value). 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mr = mach_msg_trap(msg, option &~ LIBMACH_OPTIONS, 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown send_size, rcv_size, rcv_name, 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown timeout, notify); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mr == MACH_MSG_SUCCESS) 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return MACH_MSG_SUCCESS; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((option & MACH_SEND_INTERRUPT) == 0) 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown while (mr == MACH_SEND_INTERRUPTED) 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mr = mach_msg_trap(msg, 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown option &~ LIBMACH_OPTIONS, 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown send_size, rcv_size, rcv_name, 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown timeout, notify); 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((option & MACH_RCV_INTERRUPT) == 0) 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown while (mr == MACH_RCV_INTERRUPTED) 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mr = mach_msg_trap(msg, 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown option &~ (LIBMACH_OPTIONS|MACH_SEND_MSG), 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 0, rcv_size, rcv_name, 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown timeout, notify); 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown return mr; 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif // defined(VGO_darwin) 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- end ---*/ 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/ 111