xref: /dragonfly/lib/libc/sysvipc/sysvipc_sem.h (revision ff86f401)
182657471SMarkus Pfeiffer /* $FreeBSD: src/sys/kern/sysv_sem.c,v 1.69 2004/03/17 09:37:13 cperciva Exp $ */
282657471SMarkus Pfeiffer 
382657471SMarkus Pfeiffer /*
482657471SMarkus Pfeiffer  * Implementation of SVID semaphores
582657471SMarkus Pfeiffer  *
682657471SMarkus Pfeiffer  * Author:  Daniel Boulet
782657471SMarkus Pfeiffer  * Copyright (c) 2013 Larisa Grigore <larisagrigore@gmail.com>
882657471SMarkus Pfeiffer  *
982657471SMarkus Pfeiffer  * This software is provided ``AS IS'' without any warranties of any kind.
1082657471SMarkus Pfeiffer  */
1182657471SMarkus Pfeiffer 
12*ff86f401SSascha Wildner #ifndef _SYSVIPC_SEM_H_
13*ff86f401SSascha Wildner #define _SYSVIPC_SEM_H_
1482657471SMarkus Pfeiffer 
1582657471SMarkus Pfeiffer #include <sys/sem.h>
1682657471SMarkus Pfeiffer 
1782657471SMarkus Pfeiffer #include "sysvipc_lock.h"
1882657471SMarkus Pfeiffer #include "sysvipc_lock_generic.h"
1982657471SMarkus Pfeiffer 
2082657471SMarkus Pfeiffer //#define SYSV_SEMS
2182657471SMarkus Pfeiffer 		/* Used to define if each semaphore in the
2282657471SMarkus Pfeiffer 		 * set is protected by a mutex, the entire
2382657471SMarkus Pfeiffer 		 * group being protected by a read lock.
2482657471SMarkus Pfeiffer 		 * If SYSV_SEMS is not defined, then the entire
2582657471SMarkus Pfeiffer 		 * group is protected only by a write lock.
2682657471SMarkus Pfeiffer 		 */
2782657471SMarkus Pfeiffer struct sem {
2882657471SMarkus Pfeiffer 	u_short	semval;		/* semaphore value */
2982657471SMarkus Pfeiffer 	pid_t	sempid;		/* pid of last operation */
3082657471SMarkus Pfeiffer 	u_short	semncnt;	/* # awaiting semval > cval */
3182657471SMarkus Pfeiffer 	u_short	semzcnt;	/* # awaiting semval = 0 */
3282657471SMarkus Pfeiffer #ifdef SYSV_SEMS
3382657471SMarkus Pfeiffer 	struct sysv_mutex sem_mutex;
3482657471SMarkus Pfeiffer #endif
3582657471SMarkus Pfeiffer };
3682657471SMarkus Pfeiffer 
3782657471SMarkus Pfeiffer /* Used internally. The struct semid_ds is used only
3882657471SMarkus Pfeiffer  * by caller, as argument to semctl.
3982657471SMarkus Pfeiffer  */
4082657471SMarkus Pfeiffer struct semid_ds_internal {
4182657471SMarkus Pfeiffer 	struct	ipc_perm sem_perm;	/* operation permission struct */
4282657471SMarkus Pfeiffer 	u_short	sem_nsems;	/* number of sems in set */
4382657471SMarkus Pfeiffer 	time_t	sem_otime;	/* last operation time */
4482657471SMarkus Pfeiffer 	time_t	sem_ctime;	/* last change time */
4582657471SMarkus Pfeiffer     				/* Times measured in secs since */
4682657471SMarkus Pfeiffer     				/* 00:00:00 GMT, Jan. 1, 1970 */
4782657471SMarkus Pfeiffer 	struct	sem sem_base[0];	/* pointer to first semaphore in set */
4882657471SMarkus Pfeiffer };
4982657471SMarkus Pfeiffer 
5082657471SMarkus Pfeiffer struct semid_pool {
5182657471SMarkus Pfeiffer #ifdef SYSV_RWLOCK
5282657471SMarkus Pfeiffer 	struct sysv_rwlock rwlock;
5382657471SMarkus Pfeiffer #else
5482657471SMarkus Pfeiffer 	struct sysv_mutex mutex;
5582657471SMarkus Pfeiffer #endif
5682657471SMarkus Pfeiffer 	struct semid_ds_internal ds;
5782657471SMarkus Pfeiffer 	char gen;
5882657471SMarkus Pfeiffer };
5982657471SMarkus Pfeiffer 
6082657471SMarkus Pfeiffer /*
6182657471SMarkus Pfeiffer  * Undo structure (one per process)
6282657471SMarkus Pfeiffer  */
6382657471SMarkus Pfeiffer struct sem_undo {
6482657471SMarkus Pfeiffer //	pthread_rwlock_t un_lock;
6582657471SMarkus Pfeiffer 	int	un_pages;
6682657471SMarkus Pfeiffer 	short	un_cnt;			/* # of active entries */
6782657471SMarkus Pfeiffer 	short	un_unused;
6882657471SMarkus Pfeiffer 	struct undo {
6982657471SMarkus Pfeiffer 		short	un_adjval;	/* adjust on exit values */
7082657471SMarkus Pfeiffer 		short	un_num;		/* semaphore # */
7182657471SMarkus Pfeiffer 		int	un_id;		/* semid */
7282657471SMarkus Pfeiffer 	} un_ent[0];			/* undo entries */
7382657471SMarkus Pfeiffer };
7482657471SMarkus Pfeiffer 
754a41674fSSascha Wildner int sysvipc___semctl(int, int, int, union semun *);
7682657471SMarkus Pfeiffer int sysvipc_semget(key_t, int, int);
7782657471SMarkus Pfeiffer int sysvipc_semop(int, struct sembuf *, unsigned);
7882657471SMarkus Pfeiffer 
79*ff86f401SSascha Wildner #endif /* !_SYSVIPC_SEM_H_ */
80