Re: patch for src/backend/port/darwin/sem.c - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: patch for src/backend/port/darwin/sem.c
Date
Msg-id 200101172211.RAA11570@candle.pha.pa.us
Whole thread Raw
In response to patch for src/backend/port/darwin/sem.c  ("Michael C. Thornburgh" <zenomt@armory.com>)
List pgsql-patches
Thanks.  Applied.

>
>
> attached is a patch that makes SysV semaphore emulation
> using POSIX semaphores more robust on Darwin 1.2/Mac OS X
> Public Beta.  this is for the version of 7.1 available
> via anon cvs as of Jan 14 2001 14:00 PST.
>
> since the semaphores and shared memory created by this
> emulator are shared with the backends via fork(), their
> persistent names are not necessary.  removing their
> names with shm_unlink() and sem_unlink() after creation
> obviates the need for any "ipcclean" function.  further,
> without these changes, the shared memory (and, therefore,
> the semaphores) will not be re-initialized/re-created after
> the first execution of the postmaster, until reboot
> or until some (non-existent) ipcclean function is executed.
>
> this patch does the following:
>
>    1) if the shared memory segment "SysV_Sem_Info" already
>       existed, it is cleaned up.  it shouldn't be there anyways.
>
>    2) the real indicator for whether the shared memory/semaphore
>       emulator has been initialized is if "SemInfo" has been
>       initialized.  the shared memory and semaphores must be
>       initialized regardless of whether there was a garbage shared
>       memory segment lying around.
>
>    3) the shared memory segment "SysV_Sem_Info" is created with "O_EXCL"
>       to catch the case where two postmasters might be starting
>       simultaneously, so they don't both end up with the same shared
>       memory (one will fail).  note that this can't be done with the
>       semaphores because Darwin 1.2 has a bug where attempting to
>       open an existing semaphore with "O_EXCL" set will ruin the
>       semaphore until the next reboot.
>
>    4) the shared memory segment "SysV_Sem_Info" is unlinked after
>       it is created.  it will then exist without a name until the
>       postmaster and all backend children exit.
>
>    5) all semaphores are unlinked after they are created.  they'll
>       then exist without names until the postmaster and all backend
>       children exit.
>
> -michael thornburgh, zenomt@armory.com
>
>
>
> *** src/backend/port/darwin/sem.c.orig    Sun Jan 14 15:11:28 2001
> --- src/backend/port/darwin/sem.c    Sun Jan 14 15:32:18 2001
> ***************
> *** 155,165 ****
>           fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE);
>           if (fd == -1 && errno == EEXIST)
>           {
> !             exist = 1;
> !             fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT, MODE);
>           }
>           if (fd == -1)
>               return fd;
>           /* The size may only be set once. Ignore errors. */
>                  ftruncate(fd, sizeof(struct sem_info));
>           SemInfo = mmap(NULL, sizeof(struct sem_info),
> --- 155,167 ----
>           fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE);
>           if (fd == -1 && errno == EEXIST)
>           {
> ! /*             exist = 1; */
> !             shm_unlink(SHM_INFO_NAME);
> !             fd = shm_open(SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE);
>           }
>           if (fd == -1)
>               return fd;
> +         shm_unlink(SHM_INFO_NAME);
>           /* The size may only be set once. Ignore errors. */
>                  ftruncate(fd, sizeof(struct sem_info));
>           SemInfo = mmap(NULL, sizeof(struct sem_info),
> ***************
> *** 174,179 ****
> --- 176,182 ----
>                          fprintf(stderr, "darwin creating sem %s to cover shared mem.\n", semname);
>   #endif
>                          SemInfo->sem = sem_open(semname, O_CREAT, semflg & 0777, 1);
> +                        sem_unlink(semname);
>                          sem_wait(SemInfo->sem);
>               /* initilize shared memory */
>               memset(SemInfo->set, 0, sizeof(SemInfo->set));
> ***************
> *** 244,249 ****
> --- 247,253 ----
>                  fprintf(stderr, "darwin creating sem %s to cover set %d num %dm.\n", semname, semid, semnum);
>   #endif
>                  SemInfo->set[semid].sem[semnum] = sem_open(semname, O_CREAT, semflg & 0777, 0);
> +                sem_unlink(semname);
>
>   /* Currently sem_init always returns -1.
>       if( sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ) == -1 )    {
>


--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

pgsql-patches by date:

Previous
From: Richard Bullington-McGuire
Date:
Subject: Fixes and enhancements to JDBC driver (take 2)
Next
From: Bruce Momjian
Date:
Subject: Re: docs: syntax.sgml patch