From 4bd983bf346195343ab94cfe80b52af9fde1a03a Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 18 Mar 2001 18:22:08 +0000 Subject: [PATCH] Patches from Cyril Velter to make shared-memory-conflict-detection code work in BeOS port. --- src/backend/port/beos/shm.c | 32 +++++++++++++++++++++++++------ src/backend/port/beos/support.c | 4 +++- src/backend/utils/init/miscinit.c | 11 +++++++++-- src/include/port/beos.h | 2 ++ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/backend/port/beos/shm.c b/src/backend/port/beos/shm.c index e213ecb664..b30fc2b6b3 100644 --- a/src/backend/port/beos/shm.c +++ b/src/backend/port/beos/shm.c @@ -3,7 +3,7 @@ * shm.c * BeOS System V Shared Memory Emulation * - * Copyright (c) 1999-2000, Cyril VELTER + * Copyright (c) 1999-2001, Cyril VELTER * *------------------------------------------------------------------------- */ @@ -11,6 +11,7 @@ #include "postgres.h" #include #include +#include /* Emulating SYS shared memory with beos areas. WARNING : fork clone areas in copy on write mode */ @@ -68,11 +69,30 @@ int shmctl(int shmid, int flag, struct shmid_ds* dummy) } if (flag == IPC_STAT) { - /* Is there a way to check existence of an area given its ID? - * For now, punt and assume it does not exist. - */ - errno = EINVAL; - return -1; + /* Find any SYSV area with the shmid in its name */ + + area_info inf; + team_info infteam; + int32 cookteam=0; + char name[50]; + sprintf(name,"SYSV_IPC %d",shmid); + + dummy->shm_nattch=0; + + while (get_next_team_info(&cookteam, &infteam) == B_OK) + { + int32 cook=0; + while (get_next_area_info(infteam.team, &cook, &inf) == B_OK) + { + if (strcmp(name,inf.name) == 0) + { + dummy->shm_nattch++; + } + } + } + + errno = 0; + return 0; } errno = EINVAL; return -1; diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c index 3de7b65204..5dfe9e3197 100644 --- a/src/backend/port/beos/support.c +++ b/src/backend/port/beos/support.c @@ -3,7 +3,7 @@ * support.c * BeOS Support functions * - * Copyright (c) 1999-2000, Cyril VELTER + * Copyright (c) 1999-2001, Cyril VELTER * *------------------------------------------------------------------------- */ @@ -279,6 +279,8 @@ void beos_backend_startup(void) delete_area(inf.area); /* Find the postmaster area */ area_postmaster=find_area(inf.name); + /* Compute new area name */ + sprintf(nvnom,"SYSV_IPC %d",area_postmaster); /* Clone it at the exact same address */ clone_area(nvnom,&area_address,B_CLONE_ADDRESS,B_READ_AREA|B_WRITE_AREA,area_postmaster); } diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index c6192aa0c6..f5824327c9 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.62 2001/03/13 01:17:06 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/miscinit.c,v 1.63 2001/03/18 18:22:08 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -540,11 +540,18 @@ CreateLockFile(const char *filename, bool amPostmaster, /* * Check to see if the other process still exists + * + * Normally kill() will fail with ESRCH if the given PID doesn't + * exist. BeOS returns EINVAL for some silly reason, however. */ if (other_pid != my_pid) { if (kill(other_pid, 0) == 0 || - errno != ESRCH) + (errno != ESRCH +#ifdef __BEOS__ + && errno != EINVAL +#endif + )) { /* lockfile belongs to a live process */ fprintf(stderr, "Lock file \"%s\" already exists.\n", diff --git a/src/include/port/beos.h b/src/include/port/beos.h index 58cb5eb485..5bb31f4c67 100644 --- a/src/include/port/beos.h +++ b/src/include/port/beos.h @@ -20,6 +20,7 @@ typedef unsigned char slock_t; #define IPC_EXCL 1024 #define IPC_PRIVATE 234564 #define IPC_NOWAIT 2048 +#define IPC_STAT 4096 #define EACCESS 2048 #define EIDRM 4096 @@ -47,6 +48,7 @@ struct sembuf struct shmid_ds { int dummy; + int shm_nattch; }; int semctl(int semId,int semNum,int flag,union semun); -- 2.40.0