Restructure normal (non-error) control flow in sem_close().
Do not retest for the found semaphore after the loop to look it up. Instead, handle both cases of last and non-last close simultaneously, which allows to consolidate the list unlock and successful return. Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
c787b852ae
commit
a52baa12b5
@ -41,6 +41,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
@ -260,6 +261,7 @@ int
|
||||
_sem_close(sem_t *sem)
|
||||
{
|
||||
struct sem_nameinfo *ni;
|
||||
bool last;
|
||||
|
||||
if (sem_check_validity(sem) != 0)
|
||||
return (-1);
|
||||
@ -274,21 +276,17 @@ _sem_close(sem_t *sem)
|
||||
_pthread_mutex_lock(&sem_llock);
|
||||
LIST_FOREACH(ni, &sem_list, next) {
|
||||
if (sem == ni->sem) {
|
||||
if (--ni->open_count > 0) {
|
||||
_pthread_mutex_unlock(&sem_llock);
|
||||
return (0);
|
||||
last = --ni->open_count == 0;
|
||||
if (last)
|
||||
LIST_REMOVE(ni, next);
|
||||
_pthread_mutex_unlock(&sem_llock);
|
||||
if (last) {
|
||||
munmap(sem, sizeof(*sem));
|
||||
free(ni);
|
||||
}
|
||||
break;
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
if (ni != NULL) {
|
||||
LIST_REMOVE(ni, next);
|
||||
_pthread_mutex_unlock(&sem_llock);
|
||||
munmap(sem, sizeof(*sem));
|
||||
free(ni);
|
||||
return (0);
|
||||
}
|
||||
_pthread_mutex_unlock(&sem_llock);
|
||||
errno = EINVAL;
|
||||
return (-1);
|
||||
|
Loading…
Reference in New Issue
Block a user