sl@0: /* $FreeBSD: src/sys/sys/sem.h,v 1.29 2004/11/17 13:12:06 rwatson Exp $ */
sl@0: /*	$NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $	*/
sl@0: 
sl@0: /*
sl@0:  *© * © * Portions Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
sl@0:  * SVID compatible sem.h file
sl@0:  *
sl@0:  * Author:  Daniel Boulet
sl@0:  */
sl@0: 
sl@0: #ifndef _SYS_SEM_H_
sl@0: #define _SYS_SEM_H_
sl@0: 
sl@0: #include <sys/ipc.h>
sl@0: 
sl@0: 
sl@0: struct sem {
sl@0: 	u_short	semval;		/* semaphore value */
sl@0: 	pid_t	sempid;		/* process ID of last operation */
sl@0: 	u_short	semncnt;	/* number of processes waiting for semval
sl@0:                            to become greater than current value */
sl@0: 	u_short	semzcnt;	/* number of processes waiting for semval
sl@0:                            to become 0 */
sl@0:     };
sl@0: 
sl@0: struct semid_ds {
sl@0: 	struct ipc_perm	sem_perm;	/* operation permission struct */
sl@0: 	struct sem	*sem_base;	/* pointer to first semaphore in set */
sl@0: 	unsigned short	sem_nsems;	/* number of sems in set */
sl@0: 	time_t		sem_otime;	/* last operation time */
sl@0: 	long		sem_pad1;	/* SVABI/386 says I need this here */
sl@0: 	time_t		sem_ctime;	/* last change time */
sl@0:     					/* Times measured in secs since */
sl@0:     					/* 00:00:00 GMT, Jan. 1, 1970 */
sl@0: 	long		sem_pad2;	/* SVABI/386 says I need this here */
sl@0: 	long		sem_pad3[4];	/* SVABI/386 says I need this here */
sl@0: };
sl@0: 
sl@0: /*
sl@0:  * semop's sops parameter structure
sl@0:  */
sl@0: struct sembuf {
sl@0: 	unsigned short	sem_num;	/* semaphore # */
sl@0: 	short		sem_op;		/* semaphore operation */
sl@0: 	short		sem_flg;	/* operation flags */
sl@0: };
sl@0: #define SEM_UNDO	010000
sl@0: 
sl@0: /*
sl@0:  * semctl's arg parameter structure
sl@0:  */
sl@0: union semun {
sl@0: 	int		val;		/* value for SETVAL */
sl@0: 	struct		semid_ds *buf;	/* buffer for IPC_STAT & IPC_SET */
sl@0: 	unsigned short	*array;		/* array for GETALL & SETALL */
sl@0: };
sl@0: 
sl@0: /*
sl@0:  * commands for semctl
sl@0:  */
sl@0: #define GETNCNT	3	/* Return the value of semncnt {READ} */
sl@0: #define GETPID	4	/* Return the value of sempid {READ} */
sl@0: #define GETVAL	5	/* Return the value of semval {READ} */
sl@0: #define GETALL	6	/* Return semvals into arg.array {READ} */
sl@0: #define GETZCNT	7	/* Return the value of semzcnt {READ} */
sl@0: #define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
sl@0: #define SETALL	9	/* Set semvals from arg.array {ALTER} */
sl@0: #define SEM_STAT 10	/* Like IPC_STAT but treats semid as sema-index */
sl@0: #define SEM_INFO 11	/* Like IPC_INFO but treats semid as sema-index */
sl@0: 
sl@0: /*
sl@0:  * Permissions
sl@0:  */
sl@0: #define SEM_A		IPC_W	/* alter permission */
sl@0: #define SEM_R		IPC_R	/* read permission */
sl@0: 
sl@0: #ifdef _KERNEL
sl@0: 
sl@0: /*
sl@0:  * semaphore info struct
sl@0:  */
sl@0: struct seminfo {
sl@0: 	int	semmap,		/* # of entries in semaphore map */
sl@0: 		semmni,		/* # of semaphore identifiers */
sl@0: 		semmns,		/* # of semaphores in system */
sl@0: 		semmnu,		/* # of undo structures in system */
sl@0: 		semmsl,		/* max # of semaphores per id */
sl@0: 		semopm,		/* max # of operations per semop call */
sl@0: 		semume,		/* max # of undo entries per process */
sl@0: 		semusz,		/* size in bytes of undo structure */
sl@0: 		semvmx,		/* semaphore maximum value */
sl@0: 		semaem;		/* adjust on exit max value */
sl@0: };
sl@0: extern struct seminfo	seminfo;
sl@0: 
sl@0: /*
sl@0:  * Kernel wrapper for the user-level structure
sl@0:  */
sl@0: struct semid_kernel {
sl@0: 	struct	semid_ds u;
sl@0: 	struct	label *label;	/* MAC framework label */
sl@0: };
sl@0: 
sl@0: /* internal "mode" bits */
sl@0: #define	SEM_ALLOC	01000	/* semaphore is allocated */
sl@0: #define	SEM_DEST	02000	/* semaphore will be destroyed on last detach */
sl@0: 
sl@0: /*
sl@0:  * Process sem_undo vectors at proc exit.
sl@0:  */
sl@0: void	semexit(struct proc *p);
sl@0: #endif /* _KERNEL */
sl@0: 
sl@0: #ifndef _KERNEL
sl@0: #include <sys/cdefs.h>
sl@0: #include <sys/_types.h>
sl@0: 
sl@0: #ifndef _SIZE_T_DECLARED
sl@0: typedef __size_t        size_t;
sl@0: #define _SIZE_T_DECLARED
sl@0: #endif
sl@0: 
sl@0: #ifndef _PID_T_DECLARED
sl@0: typedef __pid_t         pid_t;
sl@0: #define _PID_T_DECLARED
sl@0: #endif
sl@0: 
sl@0: // FUNCTION PROTOTYPES
sl@0: 
sl@0: 
sl@0: // FORWARD DECLARATIONS
sl@0: 
sl@0: 
sl@0: // CLASS/STRUCT/FUNCTION DECLARATION
sl@0: 
sl@0: __BEGIN_DECLS
sl@0: 
sl@0: /*
sl@0: * Get semaphore identifier using the IPC key generated by ftok.
sl@0: */
sl@0: 
sl@0: IMPORT_C int semget(key_t key, int nsems, int semflg);
sl@0: 
sl@0: 
sl@0: /*
sl@0: * Perform atomically a user-defined array of semaphore operations on the set of 
sl@0: * semaphores associated with the semaphore identifier specified by the argument semid.
sl@0: */
sl@0: 
sl@0: IMPORT_C int semop(int semid, struct sembuf *sops, unsigned nsops);
sl@0: 
sl@0: 
sl@0: /*
sl@0: * Provides a variety of semaphore control operations as specified by cmd.
sl@0: */
sl@0: IMPORT_C int semctl(int semid, int semnum, int cmd, ...);
sl@0: 
sl@0: 
sl@0: __END_DECLS
sl@0: #endif // #ifndef _KERNEL
sl@0: 
sl@0: #endif // _SYS_SEM_H_
sl@0: 
sl@0: //  End of File