Patches from Cyril Velter to make shared-memory-conflict-detection code
authorTom Lane
Sun, 18 Mar 2001 18:22:08 +0000 (18:22 +0000)
committerTom Lane
Sun, 18 Mar 2001 18:22:08 +0000 (18:22 +0000)
work in BeOS port.

src/backend/port/beos/shm.c
src/backend/port/beos/support.c
src/backend/utils/init/miscinit.c
src/include/port/beos.h

index e213ecb6646f6c3b330019a954b7f6c4b0ed5051..b30fc2b6b370e1c64da3281c42800db0242e47c8 100644 (file)
@@ -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;
index 3de7b65204f88541c43da75b25904882ae4c9c7f..5dfe9e31976e6eab29d4446222f6d00fc1b4fce6 100644 (file)
@@ -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);
        }
index c6192aa0c6edeb5004921a169f8ab90d85a84e00..f5824327c968c139e76639f94828b63057c9b215 100644 (file)
@@ -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",
index 58cb5eb485a16cc3d52809bc54ca10fd9d322692..5bb31f4c670c22636c0d442e1e43f11205965840 100644 (file)
@@ -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);