diff --git a/shmem.c b/shmem.c index d474535..59913f7 100644 --- a/shmem.c +++ b/shmem.c @@ -347,7 +347,12 @@ int shmget(key_t key, size_t size, int flags) path_buffer[path_length] = '\0'; int shmid = atoi(path_buffer); if (shmid != 0) { - int idx = ashv_read_remote_segment(shmid); + int idx = ashv_find_local_index(shmid); + + if (idx == -1) { + idx = ashv_read_remote_segment(shmid); + } + if (idx != -1) { pthread_mutex_unlock(&mutex); return shmem[idx].id; diff --git a/test/deadlock.c b/test/deadlock.c new file mode 100644 index 0000000..f4f4643 --- /dev/null +++ b/test/deadlock.c @@ -0,0 +1,11 @@ +#include "utils.h" + +int main() { + key_t SHMEM_KEY = ftok(".", 23); + + int shmid_from_shmget; + if ((shmid_from_shmget = shmget(SHMEM_KEY, 30, IPC_CREAT | 0666)) < 0) error_exit("shmget"); + if ((shmid_from_shmget = shmget(SHMEM_KEY, 30, IPC_CREAT | 0666)) < 0) error_exit("shmget"); + + return 0; +}