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