summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2013-02-17 02:52:42 +0000
committerdavidxu <davidxu@FreeBSD.org>2013-02-17 02:52:42 +0000
commit67d28f7aa549ac503535c4f0c06a55fb6e7a1a63 (patch)
treecee2735f0c925240cd29e26a81383257bfb3793e /lib
parenta57e06a00fbd4f164ab76d450ae9dd7f852d133a (diff)
downloadFreeBSD-src-67d28f7aa549ac503535c4f0c06a55fb6e7a1a63.zip
FreeBSD-src-67d28f7aa549ac503535c4f0c06a55fb6e7a1a63.tar.gz
Make more code be protected by internal mutex, and now it is fork-safe, in
error case, the file exclusive lock is now released as soon as possible, in previous code, child process can still hold the exclusive lock.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/sem_new.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/libc/gen/sem_new.c b/lib/libc/gen/sem_new.c
index 0393fac..1bf84ea 100644
--- a/lib/libc/gen/sem_new.c
+++ b/lib/libc/gen/sem_new.c
@@ -229,18 +229,18 @@ _sem_open(const char *name, int flags, ...)
ni->open_count = 1;
ni->sem = sem;
LIST_INSERT_HEAD(&sem_list, ni, next);
- _pthread_mutex_unlock(&sem_llock);
_close(fd);
+ _pthread_mutex_unlock(&sem_llock);
return (sem);
error:
errsave = errno;
- _pthread_mutex_unlock(&sem_llock);
if (fd != -1)
_close(fd);
if (sem != NULL)
munmap(sem, sizeof(sem_t));
free(ni);
+ _pthread_mutex_unlock(&sem_llock);
errno = errsave;
return (SEM_FAILED);
}
OpenPOWER on IntegriCloud