aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-03-18 18:22:08 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-03-18 18:22:08 +0000
commit4bd983bf346195343ab94cfe80b52af9fde1a03a (patch)
treec8d1172ff0c67d6b19076a7f53c5350ced923bff /src
parent5c1b00450c9b6c0e1f70db26e92fd79f7119223b (diff)
downloadpostgresql-4bd983bf346195343ab94cfe80b52af9fde1a03a.tar.gz
postgresql-4bd983bf346195343ab94cfe80b52af9fde1a03a.zip
Patches from Cyril Velter to make shared-memory-conflict-detection code
work in BeOS port.
Diffstat (limited to 'src')
-rw-r--r--src/backend/port/beos/shm.c32
-rw-r--r--src/backend/port/beos/support.c4
-rw-r--r--src/backend/utils/init/miscinit.c11
-rw-r--r--src/include/port/beos.h2
4 files changed, 40 insertions, 9 deletions
diff --git a/src/backend/port/beos/shm.c b/src/backend/port/beos/shm.c
index e213ecb6646..b30fc2b6b37 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 <stdio.h>
#include <OS.h>
+#include <errno.h>
/* 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 3de7b65204f..5dfe9e31976 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 c6192aa0c6e..f5824327c96 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 58cb5eb485a..5bb31f4c670 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);