|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: */
25: /*
26: * Mach Operating System
27: * Copyright (c) 1991,1990,1989 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50: /*
51: */
52: /*
53: * File: ipc/ipc_mqueue.h
54: * Author: Rich Draves
55: * Date: 1989
56: *
57: * Definitions for message queues.
58: */
59:
60: #ifndef _IPC_IPC_MQUEUE_H_
61: #define _IPC_IPC_MQUEUE_H_
62:
63: #include <mach_assert.h>
64: #include <dipc.h>
65:
66: #include <mach/message.h>
67:
68: #include <kern/assert.h>
69: #include <kern/macro_help.h>
70: #include <kern/wait_queue.h>
71:
72: #include <ipc/ipc_kmsg.h>
73: #include <ipc/ipc_object.h>
74: #include <ipc/ipc_types.h>
75:
76: typedef struct ipc_mqueue {
77: union {
78: struct {
79: struct wait_queue wait_queue;
80: struct ipc_kmsg_queue messages;
81: mach_port_msgcount_t msgcount;
82: mach_port_msgcount_t qlimit;
83: mach_port_seqno_t seqno;
84: boolean_t fullwaiters;
85: } port;
86: struct wait_queue_sub set_queue;
87: } data;
88: } *ipc_mqueue_t;
89:
90: #define IMQ_NULL ((ipc_mqueue_t) 0)
91:
92: #define imq_wait_queue data.port.wait_queue
93: #define imq_messages data.port.messages
94: #define imq_msgcount data.port.msgcount
95: #define imq_qlimit data.port.qlimit
96: #define imq_seqno data.port.seqno
97: #define imq_fullwaiters data.port.fullwaiters
98:
99: #define imq_set_queue data.set_queue
100: #define imq_setlinks data.set_queue.wqs_sublinks
101: #define imq_is_set(mq) wait_queue_is_sub(&(mq)->imq_set_queue)
102:
103: #define imq_lock(mq) wait_queue_lock(&(mq)->imq_wait_queue)
104: #define imq_lock_try(mq) wait_queue_lock_try(&(mq)->imq_wait_queue)
105: #define imq_unlock(mq) wait_queue_unlock(&(mq)->imq_wait_queue)
106: #define imq_held(mq) wait_queue_held(&(mq)->imq_wait_queue)
107:
108: #define imq_full(mq) ((mq)->imq_msgcount >= (mq)->imq_qlimit)
109:
110: extern int ipc_mqueue_full;
111: extern int ipc_mqueue_rcv;
112:
113: #define IPC_MQUEUE_FULL (event_t)&ipc_mqueue_full
114: #define IPC_MQUEUE_RECEIVE (event_t)&ipc_mqueue_rcv
115:
116: /*
117: * Exported interfaces
118: */
119:
120: /* Initialize a newly-allocated message queue */
121: extern void ipc_mqueue_init(
122: ipc_mqueue_t mqueue,
123: boolean_t is_set);
124:
125: /* Move messages from one queue to another */
126: extern void ipc_mqueue_move(
127: ipc_mqueue_t dest,
128: ipc_mqueue_t source,
129: ipc_port_t port);
130:
131: /* Wake up receivers waiting in a message queue */
132: extern void ipc_mqueue_changed(
133: ipc_mqueue_t mqueue);
134:
135: /* Send a message to a port */
136: extern mach_msg_return_t ipc_mqueue_send(
137: ipc_mqueue_t mqueue,
138: ipc_kmsg_t kmsg,
139: mach_msg_option_t option,
140: mach_msg_timeout_t timeout);
141:
142: /* Deliver message to message queue or waiting receiver */
143: extern void ipc_mqueue_post(
144: ipc_mqueue_t mqueue,
145: ipc_kmsg_t kmsg);
146:
147: /* Receive a message from a message queue */
148: extern mach_msg_return_t ipc_mqueue_receive(
149: ipc_mqueue_t mqueue,
150: mach_msg_option_t option,
151: mach_msg_size_t max_size,
152: mach_msg_timeout_t timeout,
153: int interruptible,
154: ipc_kmsg_t *kmsgp,
155: mach_port_seqno_t *seqnop);
156:
157: /* Select a message from a queue and try to post it to ourself */
158: extern mach_msg_return_t ipc_mqueue_select(
159: ipc_mqueue_t mqueue,
160: mach_msg_option_t option,
161: mach_msg_size_t max_size,
162: ipc_kmsg_t *kmsgp,
163: mach_port_seqno_t *seqnop);
164:
165: /* Clear a message count reservation */
166: extern void ipc_mqueue_release_msgcount(
167: ipc_mqueue_t mqueue);
168:
169: /* Change a queue limit */
170: extern void ipc_mqueue_set_qlimit(
171: ipc_mqueue_t mqueue,
172: mach_port_msgcount_t qlimit);
173:
174: /* Change a queue's sequence number */
175: extern void ipc_mqueue_set_seqno(
176: ipc_mqueue_t mqueue,
177: mach_port_seqno_t seqno);
178:
179: /* Convert a name in a space to a message queue */
180: extern mach_msg_return_t ipc_mqueue_copyin(
181: ipc_space_t space,
182: mach_port_name_t name,
183: ipc_mqueue_t *mqueuep,
184: ipc_object_t *objectp);
185:
186: #endif /* _IPC_IPC_MQUEUE_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.