MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sem_remove

Function sem_remove

freebsd/kern/sysv_sem.c:554–598  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

552}
553
554static void
555sem_remove(int semidx, struct ucred *cred)
556{
557 struct semid_kernel *semakptr;
558 int i;
559
560 KASSERT(semidx >= 0 && semidx < seminfo.semmni,
561 ("semidx out of bounds"));
562 mtx_assert(&sem_mtx, MA_OWNED);
563 semakptr = &sema[semidx];
564 KASSERT(semakptr->u.__sem_base - sem + semakptr->u.sem_nsems <= semtot,
565 ("sem_remove: sema %d corrupted sem pointer %p %p %d %d",
566 semidx, semakptr->u.__sem_base, sem, semakptr->u.sem_nsems,
567 semtot));
568
569 semakptr->u.sem_perm.cuid = cred ? cred->cr_uid : 0;
570 semakptr->u.sem_perm.uid = cred ? cred->cr_uid : 0;
571 semakptr->u.sem_perm.mode = 0;
572 racct_sub_cred(semakptr->cred, RACCT_NSEM, semakptr->u.sem_nsems);
573 crfree(semakptr->cred);
574 semakptr->cred = NULL;
575 SEMUNDO_LOCK();
576 semundo_clear(semidx, -1);
577 SEMUNDO_UNLOCK();
578#ifdef MAC
579 mac_sysvsem_cleanup(semakptr);
580#endif
581 wakeup(semakptr);
582 for (i = 0; i < seminfo.semmni; i++) {
583 if ((sema[i].u.sem_perm.mode & SEM_ALLOC) &&
584 sema[i].u.__sem_base > semakptr->u.__sem_base)
585 mtx_lock_flags(&sema_mtx[i], LOP_DUPOK);
586 }
587 for (i = semakptr->u.__sem_base - sem + semakptr->u.sem_nsems;
588 i < semtot; i++)
589 sem[i - semakptr->u.sem_nsems] = sem[i];
590 for (i = 0; i < seminfo.semmni; i++) {
591 if ((sema[i].u.sem_perm.mode & SEM_ALLOC) &&
592 sema[i].u.__sem_base > semakptr->u.__sem_base) {
593 sema[i].u.__sem_base -= semakptr->u.sem_nsems;
594 mtx_unlock(&sema_mtx[i]);
595 }
596 }
597 semtot -= semakptr->u.sem_nsems;
598}
599
600static struct prison *
601sem_find_prison(struct ucred *cred)

Callers 2

kern_semctlFunction · 0.85
sem_prison_cleanupFunction · 0.85

Calls 7

mtx_assertFunction · 0.85
semundo_clearFunction · 0.85
mac_sysvsem_cleanupFunction · 0.85
racct_sub_credFunction · 0.70
crfreeFunction · 0.70
wakeupFunction · 0.70
mtx_unlockFunction · 0.70

Tested by

no test coverage detected