sema
HANDLE sema; /* main wait semaphore */
if ((cv->sema = CreateSemaphoreA(NULL, 0, LONG_MAX, NULL)) == NULL) {
CloseHandle(cv->sema);
CloseHandle(cv->sema);
rc = obj_wait(cv->sema, deadline);
ReleaseSemaphore(cv->sema, num_wake, NULL);
ReleaseSemaphore(cv->sema, 1, NULL);
static struct sema vc_sema;
typedef struct sema ksema_t;
struct sema sema;
#define down(_sem) sema_wait(&(_sem)->sema)
#define down_interruptible(_sem) sema_wait(&(_sem)->sema), 0
#define down_trylock(_sem) !sema_trywait(&(_sem)->sema)
#define up(_sem) sema_post(&(_sem)->sema)
memset(&sem->sema, 0, sizeof(sem->sema));
sema_init(&sem->sema, val, "lnxsema");
memset(&sem->sema, 0, sizeof(sem->sema));
sema_init(&sem->sema, 1, "lnxsema");
struct sema cmpl;
struct sema mb_cmpl;
struct sema completion;
struct sema done; /* request done sema */
struct sema synch_sema; /*Synchronize the request/response if needed */
struct sema hs_drain_sema;
struct sema dev_sema;
struct sema cmd_sema;
sema_wait(&hwc->sema);
sema_init(&hwc->sema, num_msg, "gdma hwc sema");
sema_post(&hwc->sema);
struct sema sema;
struct sema ioctl_count_sema;
struct sema sem; /**< OS counting semaphore structure */
struct sema mx;
struct sema *pIoctlSem; // for ioctl sync.
struct sema *sid;
CpaStatus qatUtilsSemaphoreInit(struct sema **pSid, uint32_t start_value);
CpaStatus qatUtilsSemaphoreDestroy(struct sema **pSid);
CpaStatus qatUtilsSemaphoreWait(struct sema **pSid, int32_t timeout);
CpaStatus qatUtilsSemaphoreTryWait(struct sema **semaphore);
CpaStatus qatUtilsSemaphorePost(struct sema **pSid);
qatUtilsSemaphoreDestroy(struct sema **pSid)
qatUtilsSemaphoreInit(struct sema **pSid, uint32_t start_value)
*pSid = malloc(sizeof(struct sema), M_QAT, M_WAITOK);
qatUtilsSemaphoreWait(struct sema **pSid, int32_t timeout)
qatUtilsSemaphoreTryWait(struct sema **pSid)
qatUtilsSemaphorePost(struct sema **pSid)
typedef struct sema OS_SEMA_LOCK_T;
os_create_semaphore(const char *name, int value, struct sema *sema)
sema_init(sema, value, name);
os_destroy_semaphore(struct sema *sema)
sema_destroy(sema);
os_sema_lock(struct sema *sema)
sema_post(sema);
os_sema_unlock(struct sema *sema)
sema_wait(sema);
int os_create_semaphore(const char *, int,struct sema *);
int os_destroy_semaphore(struct sema *);
void os_sema_lock(struct sema *);
void os_sema_unlock(struct sema *);
typedef struct sema vmci_event;
CTR6(KTR_LOCK, "%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
mtx_unlock(&sema->sema_mtx);
_sema_timedwait(struct sema *sema, int timo, const char *file, int line)
mtx_lock(&sema->sema_mtx);
for (error = 0; sema->sema_value == 0 && error == 0;) {
sema->sema_waiters++;
error = cv_timedwait(&sema->sema_cv, &sema->sema_mtx, timo);
sema->sema_waiters--;
if (sema->sema_value > 0) {
sema->sema_value--;
CTR6(KTR_LOCK, "%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
CTR5(KTR_LOCK, "%s(%p) \"%s\" fail at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), file, line);
mtx_unlock(&sema->sema_mtx);
_sema_trywait(struct sema *sema, const char *file, int line)
mtx_lock(&sema->sema_mtx);
if (sema->sema_value > 0) {
sema->sema_value--;
CTR6(KTR_LOCK, "%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
CTR5(KTR_LOCK, "%s(%p) \"%s\" fail at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), file, line);
mtx_unlock(&sema->sema_mtx);
sema_value(struct sema *sema)
mtx_lock(&sema->sema_mtx);
ret = sema->sema_value;
mtx_unlock(&sema->sema_mtx);
sema_init(struct sema *sema, int value, const char *description)
bzero(sema, sizeof(*sema));
mtx_init(&sema->sema_mtx, description, "sema backing lock",
cv_init(&sema->sema_cv, description);
sema->sema_value = value;
CTR4(KTR_LOCK, "%s(%p, %d, \"%s\")", __func__, sema, value, description);
sema_destroy(struct sema *sema)
CTR3(KTR_LOCK, "%s(%p) \"%s\"", __func__, sema,
cv_wmesg(&sema->sema_cv));
KASSERT((sema->sema_waiters == 0), ("%s(): waiters\n", __func__));
mtx_destroy(&sema->sema_mtx);
cv_destroy(&sema->sema_cv);
_sema_post(struct sema *sema, const char *file, int line)
mtx_lock(&sema->sema_mtx);
sema->sema_value++;
if (sema->sema_waiters && sema->sema_value > 0)
cv_signal(&sema->sema_cv);
CTR6(KTR_LOCK, "%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
mtx_unlock(&sema->sema_mtx);
_sema_wait(struct sema *sema, const char *file, int line)
mtx_lock(&sema->sema_mtx);
while (sema->sema_value == 0) {
sema->sema_waiters++;
cv_wait(&sema->sema_cv, &sema->sema_mtx);
sema->sema_waiters--;
sema->sema_value--;
error = mac_sysvsem_check_semget(cred, &sema[semid]);
if ((sema[semid].u.sem_perm.mode & SEM_ALLOC) == 0)
KASSERT((sema[semid].u.sem_perm.mode & SEM_ALLOC) == 0,
sema[semid].u.sem_perm.key = key;
sema[semid].u.sem_perm.cuid = cred->cr_uid;
sema[semid].u.sem_perm.uid = cred->cr_uid;
sema[semid].u.sem_perm.cgid = cred->cr_gid;
sema[semid].u.sem_perm.gid = cred->cr_gid;
sema[semid].u.sem_perm.mode = (semflg & 0777) | SEM_ALLOC;
sema[semid].cred = crhold(cred);
sema[semid].u.sem_perm.seq =
(sema[semid].u.sem_perm.seq + 1) & 0x7fff;
sema[semid].u.sem_nsems = nsems;
sema[semid].u.sem_otime = 0;
sema[semid].u.sem_ctime = time_second;
sema[semid].u.__sem_base = &sem[semtot];
bzero(sema[semid].u.__sem_base,
sizeof(sema[semid].u.__sem_base[0])*nsems);
mac_sysvsem_create(cred, &sema[semid]);
sema[semid].u.__sem_base, &sem[semtot]));
td->td_retval[0] = IXSEQ_TO_IPCID(semid, sema[semid].u.sem_perm);
static struct semid_kernel *sema; /* semaphore id pool */
semakptr = &sema[semid];
semakptr = &sema[semid];
if ((sema[i].u.sem_perm.mode & SEM_ALLOC) == 0 ||
rpr == NULL || sem_prison_cansee(rpr, &sema[i]) != 0)
tsemak = sema[i];
if ((sema[i].u.sem_perm.mode & SEM_ALLOC) == 0 ||
rpr == NULL || sem_prison_cansee(rpr, &sema[i]) != 0)
*psemak = sema[i];
if ((sema[i].u.sem_perm.mode & SEM_ALLOC) &&
sema[i].cred != NULL && sema[i].cred->cr_prison == pr) {
SYSCTL_PROC(_kern_ipc, OID_AUTO, sema,
sema = malloc(sizeof(struct semid_kernel) * seminfo.semmni, M_SEM,
sema[i].u.__sem_base = 0;
sema[i].u.sem_perm.mode = 0;
sema[i].u.sem_perm.seq = 0;
mac_sysvsem_init(&sema[i]);
mac_sysvsem_destroy(&sema[i]);
free(sema, M_SEM);
semakptr = &sema[semidx];
if ((sema[i].u.sem_perm.mode & SEM_ALLOC) &&
sema[i].u.__sem_base > semakptr->u.__sem_base)
if ((sema[i].u.sem_perm.mode & SEM_ALLOC) &&
sema[i].u.__sem_base > semakptr->u.__sem_base) {
sema[i].u.__sem_base -= semakptr->u.sem_nsems;
semakptr = &sema[semid];
semakptr = &sema[semidx];
if ((sema[semid].u.sem_perm.mode & SEM_ALLOC) &&
sema[semid].cred != NULL &&
sema[semid].cred->cr_prison == cred->cr_prison &&
sema[semid].u.sem_perm.key == key)
if ((error = ipcperm(td, &sema[semid].u.sem_perm,
if (nsems > 0 && sema[semid].u.sem_nsems < nsems) {
static struct sema aio_newproc_sem;
void sema_init(struct sema *sema, int value, const char *description);
void sema_destroy(struct sema *sema);
void _sema_post(struct sema *sema, const char *file, int line);
void _sema_wait(struct sema *sema, const char *file, int line);
int _sema_timedwait(struct sema *sema, int timo, const char *file, int
int _sema_trywait(struct sema *sema, const char *file, int line);
int sema_value(struct sema *sema);
#define sema_post(sema) _sema_post((sema), LOCK_FILE, LOCK_LINE)
#define sema_wait(sema) _sema_wait((sema), LOCK_FILE, LOCK_LINE)
#define sema_timedwait(sema, timo) \
_sema_timedwait((sema), (timo), LOCK_FILE, LOCK_LINE)
#define sema_trywait(sema) _sema_trywait((sema), LOCK_FILE, LOCK_LINE)
tsiz = sizeof(sema);
&sema, tsiz);
kaddr = (u_long)sema;
struct semid_kernel *sema;
extern struct semid_kernel *sema;