diff options
Diffstat (limited to 'src/backend/port/sysv_shmem.c')
-rw-r--r-- | src/backend/port/sysv_shmem.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index a946b8d0134..ef4ee2fce6e 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -10,7 +10,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/port/sysv_shmem.c,v 1.42 2004/12/31 22:00:30 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/port/sysv_shmem.c,v 1.42.4.1 2007/07/02 20:12:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -223,6 +223,17 @@ PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2) if (errno == EACCES) return false; /* + * Some Linux kernel versions (in fact, all of them as of July 2007) + * sometimes return EIDRM when EINVAL is correct. The Linux kernel + * actually does not have any internal state that would justify + * returning EIDRM, so we can get away with assuming that EIDRM is + * equivalent to EINVAL on that platform. + */ +#ifdef HAVE_LINUX_EIDRM_BUG + if (errno == EIDRM) + return false; +#endif + /* * Otherwise, we had better assume that the segment is in use. * The only likely case is EIDRM, which implies that the segment * has been IPC_RMID'd but there are still processes attached to it. |