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