shm.h revision 189283
139213Sgibbs/* $FreeBSD: head/sys/sys/shm.h 189283 2009-03-02 18:53:30Z kib $ */
239213Sgibbs/*	$NetBSD: shm.h,v 1.15 1994/06/29 06:45:17 cgd Exp $	*/
3111206Sken
439213Sgibbs/*-
539213Sgibbs * Copyright (c) 1994 Adam Glass
639213Sgibbs * All rights reserved.
739213Sgibbs *
839213Sgibbs * Redistribution and use in source and binary forms, with or without
939213Sgibbs * modification, are permitted provided that the following conditions
1039213Sgibbs * are met:
1139213Sgibbs * 1. Redistributions of source code must retain the above copyright
1239213Sgibbs *    notice, this list of conditions and the following disclaimer.
1339213Sgibbs * 2. Redistributions in binary form must reproduce the above copyright
1439213Sgibbs *    notice, this list of conditions and the following disclaimer in the
1539213Sgibbs *    documentation and/or other materials provided with the distribution.
1639213Sgibbs * 3. All advertising materials mentioning features or use of this software
1739213Sgibbs *    must display the following acknowledgement:
1839213Sgibbs *      This product includes software developed by Adam Glass.
1939213Sgibbs * 4. The name of the author may not be used to endorse or promote products
2039213Sgibbs *    derived from this software without specific prior written permission
2139213Sgibbs *
2239213Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2339213Sgibbs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2439213Sgibbs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2539213Sgibbs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2639213Sgibbs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2750477Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2839213Sgibbs * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2939213Sgibbs * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3039213Sgibbs * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3139213Sgibbs * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3239213Sgibbs */
3339213Sgibbs
3439213Sgibbs/*
3539213Sgibbs * As defined+described in "X/Open System Interfaces and Headers"
3639213Sgibbs *                         Issue 4, p. XXX
3739213Sgibbs */
3839213Sgibbs
3939213Sgibbs#ifndef _SYS_SHM_H_
4039213Sgibbs#define _SYS_SHM_H_
4139213Sgibbs
4239213Sgibbs#include <sys/cdefs.h>
4339213Sgibbs#include <sys/ipc.h>
4439213Sgibbs#include <sys/_types.h>
4539213Sgibbs
4639213Sgibbs#define SHM_RDONLY  010000  /* Attach read-only (else read-write) */
4739213Sgibbs#define SHM_RND     020000  /* Round attach address to SHMLBA */
4839213Sgibbs#define SHMLBA      PAGE_SIZE /* Segment low boundary address multiple */
4940020Sken
5039213Sgibbs/* "official" access mode definitions; somewhat braindead since you have
5139213Sgibbs   to specify (SHM_* >> 3) for group and (SHM_* >> 6) for world permissions */
5239213Sgibbs#define SHM_R       (IPC_R)
5339213Sgibbs#define SHM_W       (IPC_W)
5460041Sphk
5551836Sphk/* predefine tbd *LOCK shmctl commands */
5651836Sphk#define	SHM_LOCK	11
5739213Sgibbs#define	SHM_UNLOCK	12
5839213Sgibbs
59105421Snjl/* ipcs shmctl commands for Linux compatability */
6060422Sken#define	SHM_STAT	13
6139213Sgibbs#define	SHM_INFO	14
6239213Sgibbs
6339213Sgibbs#ifndef _PID_T_DECLARED
6439213Sgibbstypedef	__pid_t		pid_t;
6539213Sgibbs#define	_PID_T_DECLARED
6639213Sgibbs#endif
6739213Sgibbs
6839213Sgibbs#ifndef _TIME_T_DECLARED
6939213Sgibbstypedef	__time_t	time_t;
7039213Sgibbs#define	_TIME_T_DECLARED
7139213Sgibbs#endif
7239213Sgibbs
7339213Sgibbs#ifndef _SIZE_T_DECLARED
7439213Sgibbstypedef	__size_t	size_t;
7539213Sgibbs#define	_SIZE_T_DECLARED
7639213Sgibbs#endif
7739213Sgibbs
7839213Sgibbsstruct shmid_ds {
7939213Sgibbs	struct ipc_perm shm_perm;	/* operation permission structure */
8039213Sgibbs	int             shm_segsz;	/* size of segment in bytes */
8139213Sgibbs	pid_t           shm_lpid;   /* process ID of last shared memory op */
82111206Sken	pid_t           shm_cpid;	/* process ID of creator */
83111206Sken	short		shm_nattch;	/* number of current attaches */
84111206Sken	time_t          shm_atime;	/* time of last shmat() */
85111206Sken	time_t          shm_dtime;	/* time of last shmdt() */
86111206Sken	time_t          shm_ctime;	/* time of last change by shmctl() */
87111206Sken	void           *shm_internal;   /* sysv stupidity */
8839213Sgibbs};
8939213Sgibbs
9039213Sgibbs#ifdef _KERNEL
9139213Sgibbs
9239213Sgibbs/*
9339213Sgibbs * System 5 style catch-all structure for shared memory constants that
9439213Sgibbs * might be of interest to user programs.  Do we really want/need this?
9539213Sgibbs */
9639213Sgibbsstruct shminfo {
9739213Sgibbs	u_long	shmmax;		/* max shared memory segment size (bytes) */
9839213Sgibbs	u_long	shmmin;		/* max shared memory segment size (bytes) */
99111206Sken	u_long	shmmni;		/* max number of shared memory identifiers */
100111206Sken	u_long	shmseg;		/* max shared memory segments per process */
101111206Sken	u_long	shmall;		/* max amount of shared memory (pages) */
10239213Sgibbs};
10339213Sgibbs
10439213Sgibbs/*
10539213Sgibbs * Add a kernel wrapper to the shmid_ds struct so that private info (like the
10639213Sgibbs * MAC label) can be added to it, without changing the user interface.
10739213Sgibbs */
10839213Sgibbsstruct shmid_kernel {
10939213Sgibbs	struct shmid_ds u;
11039213Sgibbs	struct label *label;	/* MAC label */
11139213Sgibbs	size_t shm_bsegsz;
11239213Sgibbs};
11339213Sgibbs
11439213Sgibbsextern struct shminfo	shminfo;
11539213Sgibbs
11639213Sgibbsstruct shm_info {
11739213Sgibbs	int used_ids;
11839213Sgibbs	unsigned long shm_tot;
11939213Sgibbs	unsigned long shm_rss;
12039213Sgibbs	unsigned long shm_swp;
12139213Sgibbs	unsigned long swap_attempts;
122111206Sken	unsigned long swap_successes;
123111206Sken};
124111206Sken
125111206Skenstruct thread;
126111206Skenstruct proc;
127111206Skenstruct vmspace;
128111206Sken
129111206Skenvoid	shmexit(struct vmspace *);
130111206Skenvoid	shmfork(struct proc *, struct proc *);
131111206Sken#else /* !_KERNEL */
13239213Sgibbs
13339213Sgibbs#include <sys/cdefs.h>
13439213Sgibbs
13539213Sgibbs#ifndef _SIZE_T_DECLARED
13639213Sgibbstypedef __size_t        size_t;
13739213Sgibbs#define _SIZE_T_DECLARED
13839213Sgibbs#endif
13939213Sgibbs
14046581Sken__BEGIN_DECLS
14159249Sphkint shmsys(int, ...);
14260938Sjakevoid *shmat(int, const void *, int);
14339213Sgibbsint shmget(key_t, size_t, int);
14439213Sgibbsint shmctl(int, int, struct shmid_ds *);
14539213Sgibbsint shmdt(const void *);
14639213Sgibbs__END_DECLS
14760938Sjake
14839213Sgibbs#endif /* !_KERNEL */
14939213Sgibbs
15039213Sgibbs#endif /* !_SYS_SHM_H_ */
151104456Sphk