- /* Allocate shm */
- *shmid = shmget(getpid(), shmsize, IPC_CREAT | IPC_EXCL | 0700);
- if (*shmid < 0) {
- if (errno == EINVAL)
- ERR("shmget() returned EINVAL; maybe /proc/sys/kernel/shmmax should be increased.");
- else
- PERROR("shmget");
- return NULL;
+ /*
+ * Allocate shm, and immediately unlink its shm oject, keeping
+ * only the file descriptor as a reference to the object. If it
+ * already exists (caused by short race window during which the
+ * global object exists in a concurrent shm_open), simply retry.
+ */
+ do {
+ shmfd = shm_open("/ust-shm-tmp",
+ O_CREAT | O_EXCL | O_RDWR, 0700);
+ } while (shmfd < 0 && errno == EEXIST);
+ if (shmfd < 0) {
+ PERROR("shm_open");
+ goto error_shm_open;