projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix missing argument in variadic syscall macros
[musl]
/
src
/
thread
/
sem_open.c
diff --git
a/src/thread/sem_open.c
b/src/thread/sem_open.c
index
ed2353c
..
9a95d25
100644
(file)
--- a/
src/thread/sem_open.c
+++ b/
src/thread/sem_open.c
@@
-67,23
+67,23
@@
sem_t *sem_open(const char *name, int flags, ...)
flags &= (O_CREAT|O_EXCL);
flags &= (O_CREAT|O_EXCL);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
/* Early failure check for exclusive open; otherwise the case
* where the semaphore already exists is expensive. */
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
errno = EEXIST;
/* Early failure check for exclusive open; otherwise the case
* where the semaphore already exists is expensive. */
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
errno = EEXIST;
-
return SEM_FAILED
;
+
goto fail
;
}
}
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
-
for (;;) {
/* If exclusive mode is not requested, try opening an
* existing file first and fall back to creation. */
if (flags != (O_CREAT|O_EXCL)) {
fd = open(name, FLAGS);
if (fd >= 0) {
for (;;) {
/* If exclusive mode is not requested, try opening an
* existing file first and fall back to creation. */
if (flags != (O_CREAT|O_EXCL)) {
fd = open(name, FLAGS);
if (fd >= 0) {
- if (
(map = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED
||
-
fstat(fd, &st) < 0
) {
+ if (
fstat(fd, &st) < 0
||
+
(map = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED
) {
close(fd);
goto fail;
}
close(fd);
goto fail;
}
@@
-123,9
+123,9
@@
sem_t *sem_open(const char *name, int flags, ...)
goto fail;
}
close(fd);
goto fail;
}
close(fd);
- if (link(tmp, name) == 0) break;
- e = errno;
+ e = link(tmp, name) ? errno : 0;
unlink(tmp);
unlink(tmp);
+ if (!e) break;
/* Failure is only fatal when doing an exclusive open;
* otherwise, next iteration will try to open the
* existing file. */
/* Failure is only fatal when doing an exclusive open;
* otherwise, next iteration will try to open the
* existing file. */
@@
-153,6
+153,9
@@
sem_t *sem_open(const char *name, int flags, ...)
fail:
pthread_setcancelstate(cs, 0);
fail:
pthread_setcancelstate(cs, 0);
+ LOCK(lock);
+ semtab[slot].sem = 0;
+ UNLOCK(lock);
return SEM_FAILED;
}
return SEM_FAILED;
}