projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix dup3 ignoring all flags but O_CLOEXEC on archs with SYS_dup2 syscall
[musl]
/
src
/
thread
/
sem_open.c
diff --git
a/src/thread/sem_open.c
b/src/thread/sem_open.c
index
de8555c
..
0ad29de
100644
(file)
--- a/
src/thread/sem_open.c
+++ b/
src/thread/sem_open.c
@@
-12,6
+12,12
@@
#include <stdlib.h>
#include <pthread.h>
#include "lock.h"
#include <stdlib.h>
#include <pthread.h>
#include "lock.h"
+#include "fork_impl.h"
+
+#define malloc __libc_malloc
+#define calloc __libc_calloc
+#define realloc undef
+#define free undef
static struct {
ino_t ino;
static struct {
ino_t ino;
@@
-19,6
+25,7
@@
static struct {
int refcnt;
} *semtab;
static volatile int lock[1];
int refcnt;
} *semtab;
static volatile int lock[1];
+volatile int *const __sem_open_lockptr = lock;
#define FLAGS (O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NONBLOCK)
#define FLAGS (O_RDWR|O_NOFOLLOW|O_CLOEXEC|O_NONBLOCK)
@@
-163,10
+170,12
@@
int sem_close(sem_t *sem)
int i;
LOCK(lock);
for (i=0; i<SEM_NSEMS_MAX && semtab[i].sem != sem; i++);
int i;
LOCK(lock);
for (i=0; i<SEM_NSEMS_MAX && semtab[i].sem != sem; i++);
- if (
!
--semtab[i].refcnt) {
-
semtab[i].sem = 0
;
-
semtab[i].ino =
0;
+ if (--semtab[i].refcnt) {
+
UNLOCK(lock)
;
+
return
0;
}
}
+ semtab[i].sem = 0;
+ semtab[i].ino = 0;
UNLOCK(lock);
munmap(sem, sizeof *sem);
return 0;
UNLOCK(lock);
munmap(sem, sizeof *sem);
return 0;