root / lab4 / .minix-src / include / sys / msg.h @ 14
History | View | Annotate | Download (6.82 KB)
1 |
/* $NetBSD: msg.h,v 1.25 2015/05/13 01:16:15 pgoyette Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
|
9 |
* NASA Ames Research Center, and by Andrew Doran.
|
10 |
*
|
11 |
* Redistribution and use in source and binary forms, with or without
|
12 |
* modification, are permitted provided that the following conditions
|
13 |
* are met:
|
14 |
* 1. Redistributions of source code must retain the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer.
|
16 |
* 2. Redistributions in binary form must reproduce the above copyright
|
17 |
* notice, this list of conditions and the following disclaimer in the
|
18 |
* documentation and/or other materials provided with the distribution.
|
19 |
*
|
20 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
21 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
24 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 |
* POSSIBILITY OF SUCH DAMAGE.
|
31 |
*/
|
32 |
|
33 |
/*
|
34 |
* SVID compatible msg.h file
|
35 |
*
|
36 |
* Author: Daniel Boulet
|
37 |
*
|
38 |
* Copyright 1993 Daniel Boulet and RTMX Inc.
|
39 |
*
|
40 |
* This system call was implemented by Daniel Boulet under contract from RTMX.
|
41 |
*
|
42 |
* Redistribution and use in source forms, with and without modification,
|
43 |
* are permitted provided that this entire comment appears intact.
|
44 |
*
|
45 |
* Redistribution in binary form may occur without any restrictions.
|
46 |
* Obviously, it would be nice if you gave credit where credit is due
|
47 |
* but requiring it would be too onerous.
|
48 |
*
|
49 |
* This software is provided ``AS IS'' without any warranties of any kind.
|
50 |
*/
|
51 |
|
52 |
#ifndef _SYS_MSG_H_
|
53 |
#define _SYS_MSG_H_
|
54 |
|
55 |
#include <sys/featuretest.h> |
56 |
#include <sys/ipc.h> |
57 |
#ifdef _KERNEL
|
58 |
#include <sys/condvar.h> |
59 |
#include <sys/mutex.h> |
60 |
#endif
|
61 |
|
62 |
#ifdef _KERNEL
|
63 |
struct __msg {
|
64 |
struct __msg *msg_next; /* next msg in the chain */ |
65 |
long msg_type; /* type of this message */ |
66 |
/* >0 -> type of this message */
|
67 |
/* 0 -> free header */
|
68 |
u_short msg_ts; /* size of this message */
|
69 |
short msg_spot; /* location of start of msg in buffer */ |
70 |
}; |
71 |
#endif /* _KERNEL */ |
72 |
|
73 |
#define MSG_NOERROR 010000 /* don't complain about too long msgs */ |
74 |
|
75 |
typedef unsigned long msgqnum_t; |
76 |
typedef size_t msglen_t;
|
77 |
|
78 |
struct msqid_ds {
|
79 |
struct ipc_perm msg_perm; /* operation permission strucure */ |
80 |
msgqnum_t msg_qnum; /* number of messages in the queue */
|
81 |
msglen_t msg_qbytes; /* max # of bytes in the queue */
|
82 |
pid_t msg_lspid; /* process ID of last msgsend() */
|
83 |
pid_t msg_lrpid; /* process ID of last msgrcv() */
|
84 |
time_t msg_stime; /* time of last msgsend() */
|
85 |
time_t msg_rtime; /* time of last msgrcv() */
|
86 |
time_t msg_ctime; /* time of last change */
|
87 |
|
88 |
/*
|
89 |
* These members are private and used only in the internal
|
90 |
* implementation of this interface.
|
91 |
*/
|
92 |
struct __msg *_msg_first; /* first message in the queue */ |
93 |
struct __msg *_msg_last; /* last message in the queue */ |
94 |
msglen_t _msg_cbytes; /* # of bytes currently in queue */
|
95 |
}; |
96 |
|
97 |
#if defined(_NETBSD_SOURCE)
|
98 |
/*
|
99 |
* Based on the configuration parameters described in an SVR2 (yes, two)
|
100 |
* config(1m) man page.
|
101 |
*
|
102 |
* Each message is broken up and stored in segments that are msgssz bytes
|
103 |
* long. For efficiency reasons, this should be a power of two. Also,
|
104 |
* it doesn't make sense if it is less than 8 or greater than about 256.
|
105 |
* Consequently, msginit in kern/sysv_msg.c checks that msgssz is a power of
|
106 |
* two between 8 and 1024 inclusive (and panic's if it isn't).
|
107 |
*/
|
108 |
struct msginfo {
|
109 |
int32_t msgmax; /* max chars in a message */
|
110 |
int32_t msgmni; /* max message queue identifiers */
|
111 |
int32_t msgmnb; /* max chars in a queue */
|
112 |
int32_t msgtql; /* max messages in system */
|
113 |
int32_t msgssz; /* size of a message segment
|
114 |
(see notes above) */
|
115 |
int32_t msgseg; /* number of message segments */
|
116 |
}; |
117 |
|
118 |
/* Warning: 64-bit structure padding is needed here */
|
119 |
struct msgid_ds_sysctl {
|
120 |
struct ipc_perm_sysctl msg_perm;
|
121 |
uint64_t msg_qnum; |
122 |
uint64_t msg_qbytes; |
123 |
uint64_t _msg_cbytes; |
124 |
pid_t msg_lspid; |
125 |
pid_t msg_lrpid; |
126 |
time_t msg_stime; |
127 |
time_t msg_rtime; |
128 |
time_t msg_ctime; |
129 |
int32_t pad; |
130 |
}; |
131 |
struct msg_sysctl_info {
|
132 |
struct msginfo msginfo;
|
133 |
struct msgid_ds_sysctl msgids[1]; |
134 |
}; |
135 |
#endif /* !_POSIX_C_SOURCE && !_XOPEN_SOURCE */ |
136 |
|
137 |
#ifdef _KERNEL
|
138 |
|
139 |
#ifndef MSGSSZ
|
140 |
#define MSGSSZ 8 /* Each segment must be 2^N long */ |
141 |
#endif
|
142 |
#ifndef MSGSEG
|
143 |
#define MSGSEG 2048 /* must be less than 32767 */ |
144 |
#endif
|
145 |
#undef MSGMAX /* ALWAYS compute MGSMAX! */ |
146 |
#define MSGMAX (MSGSSZ*MSGSEG)
|
147 |
#ifndef MSGMNB
|
148 |
#define MSGMNB 2048 /* max # of bytes in a queue */ |
149 |
#endif
|
150 |
#ifndef MSGMNI
|
151 |
#define MSGMNI 40 |
152 |
#endif
|
153 |
#ifndef MSGTQL
|
154 |
#define MSGTQL 40 |
155 |
#endif
|
156 |
|
157 |
/*
|
158 |
* macros to convert between msqid_ds's and msqid's.
|
159 |
*/
|
160 |
#define MSQID(ix,ds) ((ix) & 0xffff | (((ds).msg_perm._seq << 16) & 0xffff0000)) |
161 |
#define MSQID_IX(id) ((id) & 0xffff) |
162 |
#define MSQID_SEQ(id) (((id) >> 16) & 0xffff) |
163 |
|
164 |
/*
|
165 |
* Stuff allocated in machdep.h
|
166 |
*/
|
167 |
struct msgmap {
|
168 |
short next; /* next segment in buffer */ |
169 |
/* -1 -> available */
|
170 |
/* 0..(MSGSEG-1) -> index of next segment */
|
171 |
}; |
172 |
|
173 |
typedef struct kmsq { |
174 |
struct msqid_ds msq_u;
|
175 |
kcondvar_t msq_cv; |
176 |
} kmsq_t; |
177 |
|
178 |
extern struct msginfo msginfo; |
179 |
extern kmsq_t *msqs; /* MSGMNI queues */ |
180 |
extern kmutex_t msgmutex;
|
181 |
|
182 |
#define MSG_LOCKED 01000 /* Is this msqid_ds locked? */ |
183 |
|
184 |
#define SYSCTL_FILL_MSG(src, dst) do { \ |
185 |
SYSCTL_FILL_PERM((src).msg_perm, (dst).msg_perm); \ |
186 |
(dst).msg_qnum = (src).msg_qnum; \ |
187 |
(dst).msg_qbytes = (src).msg_qbytes; \ |
188 |
(dst)._msg_cbytes = (src)._msg_cbytes; \ |
189 |
(dst).msg_lspid = (src).msg_lspid; \ |
190 |
(dst).msg_lrpid = (src).msg_lrpid; \ |
191 |
(dst).msg_stime = (src).msg_stime; \ |
192 |
(dst).msg_rtime = (src).msg_rtime; \ |
193 |
(dst).msg_ctime = (src).msg_ctime; \ |
194 |
} while (/*CONSTCOND*/ 0) |
195 |
|
196 |
#endif /* _KERNEL */ |
197 |
|
198 |
#ifndef _KERNEL
|
199 |
#include <sys/cdefs.h> |
200 |
|
201 |
__BEGIN_DECLS |
202 |
int msgctl(int, int, struct msqid_ds *) __RENAME(__msgctl50); |
203 |
int msgget(key_t, int); |
204 |
int msgsnd(int, const void *, size_t, int); |
205 |
ssize_t msgrcv(int, void *, size_t, long, int); |
206 |
__END_DECLS |
207 |
#else
|
208 |
#include <sys/systm.h> |
209 |
|
210 |
struct proc;
|
211 |
|
212 |
void msginit(void); |
213 |
int msgfini(void); |
214 |
int msgctl1(struct lwp *, int, int, struct msqid_ds *); |
215 |
int msgsnd1(struct lwp *, int, const char *, size_t, int, size_t, |
216 |
copyin_t); |
217 |
int msgrcv1(struct lwp *, int, char *, size_t, long, int, size_t, |
218 |
copyout_t, register_t *); |
219 |
#endif /* !_KERNEL */ |
220 |
|
221 |
#endif /* !_SYS_MSG_H_ */ |