]> granicus.if.org Git - postgresql/commitdiff
Patches from Cyril Velter to make shared-memory-conflict-detection code
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 18 Mar 2001 18:22:08 +0000 (18:22 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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 <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;
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);