File: mach_msg.c

package info (click to toggle)
valgrind 1%3A3.10.0-4~bpo7%2B1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy-backports
  • size: 97,940 kB
  • sloc: ansic: 589,429; xml: 21,096; exp: 8,751; cpp: 7,366; asm: 6,526; perl: 5,656; sh: 5,334; makefile: 4,946; haskell: 195
file content (110 lines) | stat: -rw-r--r-- 3,698 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* 
 * Mach Operating System
 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie Mellon
 * the rights to redistribute these changes.
 */
/*
 * HISTORY
 * $Log:mach_msg.c,v $
 * Revision 2.3  92/01/23  15:22:17  rpd
 * Fixed to not pass MACH_SEND_INTERRUPT and MACH_RCV_INTERRUPT
 * to the kernel.
 * [92/01/20            rpd]
 * 
 * Revision 2.2  92/01/15  17:17:13  rpd
 * Created from msg.c.
 * [92/01/15            rpd]
 * 
 */

#if defined(VGO_darwin) 

#include "pub_core_basics.h"
#include "pub_core_mach.h"

#include <mach/port.h>
#include <mach/message.h>

#define LIBMACH_OPTIONS (MACH_SEND_INTERRUPT|MACH_RCV_INTERRUPT)

extern mach_msg_return_t 
mach_msg_trap(mach_msg_header_t *msg, 
              mach_msg_option_t option,
              mach_msg_size_t send_size,
              mach_msg_size_t rcv_size,
              mach_port_t rcv_name,
              mach_msg_timeout_t timeout,
              mach_port_t notify);

mach_msg_return_t
mach_msg(msg, option, send_size, rcv_size, rcv_name, timeout, notify)
    mach_msg_header_t *msg;
    mach_msg_option_t option;
    mach_msg_size_t send_size;
    mach_msg_size_t rcv_size;
    mach_port_t rcv_name;
    mach_msg_timeout_t timeout;
    mach_port_t notify;
{
    mach_msg_return_t mr;

    /*
     * Consider the following cases:
     *1) Errors in pseudo-receive (eg, MACH_SEND_INTERRUPTED
     *plus special bits).
     *2) Use of MACH_SEND_INTERRUPT/MACH_RCV_INTERRUPT options.
     *3) RPC calls with interruptions in one/both halves.
     *
     * We refrain from passing the option bits that we implement
     * to the kernel.  This prevents their presence from inhibiting
     * the kernel's fast paths (when it checks the option value).
     */

    mr = mach_msg_trap(msg, option &~ LIBMACH_OPTIONS,
                       send_size, rcv_size, rcv_name,
                       timeout, notify);
    if (mr == MACH_MSG_SUCCESS)
        return MACH_MSG_SUCCESS;

    if ((option & MACH_SEND_INTERRUPT) == 0)
        while (mr == MACH_SEND_INTERRUPTED)
            mr = mach_msg_trap(msg,
                               option &~ LIBMACH_OPTIONS,
                               send_size, rcv_size, rcv_name,
                               timeout, notify);

    if ((option & MACH_RCV_INTERRUPT) == 0)
        while (mr == MACH_RCV_INTERRUPTED)
            mr = mach_msg_trap(msg,
                               option &~ (LIBMACH_OPTIONS|MACH_SEND_MSG),
                               0, rcv_size, rcv_name,
                               timeout, notify);

    return mr;
}

#endif // defined(VGO_darwin) 

/*--------------------------------------------------------------------*/
/*--- end                                                          ---*/
/*--------------------------------------------------------------------*/