|
|
@ -67,15 +67,15 @@ 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
|
|
|
/* Early failure check for exclusive open; otherwise the case
|
|
|
* where the semaphore already exists is expensive. */ |
|
|
* where the semaphore already exists is expensive. */ |
|
|
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) { |
|
|
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) { |
|
|
errno = EEXIST; |
|
|
errno = EEXIST; |
|
|
return SEM_FAILED; |
|
|
goto fail; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); |
|
|
|
|
|
|
|
|
|
|
|
for (;;) { |
|
|
for (;;) { |
|
|
/* If exclusive mode is not requested, try opening an
|
|
|
/* If exclusive mode is not requested, try opening an
|
|
|
* existing file first and fall back to creation. */ |
|
|
* existing file first and fall back to creation. */ |
|
|
@ -153,6 +153,9 @@ sem_t *sem_open(const char *name, int flags, ...) |
|
|
|
|
|
|
|
|
fail: |
|
|
fail: |
|
|
pthread_setcancelstate(cs, 0); |
|
|
pthread_setcancelstate(cs, 0); |
|
|
|
|
|
LOCK(lock); |
|
|
|
|
|
semtab[slot].sem = 0; |
|
|
|
|
|
UNLOCK(lock); |
|
|
return SEM_FAILED; |
|
|
return SEM_FAILED; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|