diff options
author | davidxu <davidxu@FreeBSD.org> | 2013-02-17 02:52:42 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2013-02-17 02:52:42 +0000 |
commit | 67d28f7aa549ac503535c4f0c06a55fb6e7a1a63 (patch) | |
tree | cee2735f0c925240cd29e26a81383257bfb3793e /lib/libc | |
parent | a57e06a00fbd4f164ab76d450ae9dd7f852d133a (diff) | |
download | FreeBSD-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/libc')
-rw-r--r-- | lib/libc/gen/sem_new.c | 4 |
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); } |