#include <unistd.h>
#include <stdio.h>
+#include <errno.h>
+
+#include "ucw/fastbuf.h" // For the temp_file_name
/* In Darwin, sem_init() is unfortunately not implemented and the guide
* recommends emulating it using sem_open(). */
static inline sem_t *
sem_alloc(void)
{
- static uns cnt = 0;
- char buf[20];
- sprintf(buf, "tmp/sem-%d-%d", getpid(), cnt++);
- sem_t *sem = sem_open(buf, O_CREAT, 0777, 0);
+ char buf[TEMP_FILE_NAME_LEN];
+ int mode, retry = 10;
+ do
+ {
+ temp_file_name(buf, &mode);
+ sem_t *sem = sem_open(buf, mode | O_CREAT, 0777, 0);
+ }
+ while (sem == (sem_t*) SEM_FAILED && errno == EEXIST && retry --);
ASSERT(sem != (sem_t*) SEM_FAILED);
return sem;
}