RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )

From: "Hiroshi Inoue" <Inoue(at)tpf(dot)co(dot)jp>
To: "Horak Daniel" <horak(at)mmp(dot)plzen-city(dot)cz>, "'Tom Lane'" <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: <pgsql-hackers(at)postgreSQL(dot)org>
Subject: RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )
Date: 1999-08-17 23:45:28
Message-ID: 000301bee90a$95d40f00$2801007e@cadzone.tpf.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

> -----Original Message-----
> From: owner-pgsql-hackers(at)postgreSQL(dot)org
> [mailto:owner-pgsql-hackers(at)postgreSQL(dot)org]On Behalf Of Horak Daniel
> Sent: Tuesday, August 17, 1999 9:06 PM
> To: 'Tom Lane'
> Cc: 'pgsql-hackers(at)postgreSQL(dot)org'
> Subject: RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )
>
>
> > In any case, when one backend quits and another one is
> > started, the new
> > one will re-use the semaphore no longer used by the defunct backend.
>
> I have tested my solution a bit more and I have to say that reusing a
> semaphore by a new backend works OK. But it is not possible for a newly
> created backend to use a semaphore allocated by postmaster (it freezes on
> test if the semaphore with given key already exists - done with
> semId=semget(semKey, 0, 0) in function IpcSemaphoreCreate() in
> storage/ipc/ipc.c ). Why it is, I don't know, but it seems that
> my solution
> uses the ipc library in the right way. There are no longer any error
> messages from the ipc library when running the server. And I
> can't say that
> the ipc library is a 100% correct implementation of SysV IPC, it
> is probably
> (sure ;-) )caused by the Windows internals.
>

Yutaka Tanida [yutaka(at)marin(dot)or(dot)jp] and I have examined IPC
library.

We found that postmaster doesn't call exec() after fork() since v6.4.

The value of static/extern variables which cygipc library holds may
be different from their initial values when postmaster fork()s child
backend processes.

I made the following patch for cygipc library on trial.
This patch was effective for Yutaka's test case.

Regards.

Hiroshi Inoue
Inoue(at)tpf(dot)co(dot)jp

*** sem.c.orig Tue Dec 01 00:16:25 1998
--- sem.c Tue Aug 17 13:22:06 1999
***************
*** 58,63 ****
--- 58,78 ----
static int GFirstSem = 0; /*PCPC*/
static int GFdSem ; /*PCPC*/

+ static pid_t GProcessId = 0;
+
+ static void init_globals(void)
+ {
+ pid_t pid;
+
+ if (pid=getpid(), pid != GProcessId)
+ {
+ GFirstSem = 0;
+ used_sems = used_semids = max_semid = 0;
+ sem_seq = 0;
+ GProcessId = pid;
+ }
+ }
+
/************************************************************************/
/* Demande d'acces a la zone partagee de gestion des semaphores */
/************************************************************************/
***************
*** 77,82 ****
--- 92,98 ----
{
int LRet ;

+ init_globals();
if( GFirstSem == 0 )
{
if( IsGSemSemExist() )
*** shm.c.orig Tue Dec 01 01:04:57 1998
--- shm.c Tue Aug 17 13:22:27 1999
***************
*** 59,64 ****
--- 59,81 ----
static int GFirstShm = 0; /*PCPC*/
static int GFdShm ; /*PCPC*/

+ /*****************************************/
+ /* Initialization of static variables */
+ /*****************************************/
+ static pid_t GProcessId = 0;
+ static void init_globals(void)
+ {
+ pid_t pid;
+
+ if (pid=getpid(), pid != GProcessId)
+ {
+ GFirstShm = 0;
+ shm_rss = shm_swp = max_shmid = 0;
+ shm_seq = 0;
+ GProcessId = pid;
+ }
+ }
+
/************************************************************************/
/* Demande d'acces a la zone partagee de gestion des shm */
/************************************************************************/
***************
*** 82,87 ****
--- 99,105 ----
{
int LRet ;

+ init_globals();
if( GFirstShm == 0 )
{
if( IsGSemShmExist() )
*** msg.c.orig Tue Dec 01 00:16:09 1998
--- msg.c Tue Aug 17 13:20:04 1999
***************
*** 57,62 ****
--- 57,77 ----
static int GFirstMsg = 0; /*PCPC*/
static int GFdMsg ; /*PCPC*/

+ /*****************************************/
+ /* Initialization of static variables */
+ /*****************************************/
+ static pid_t GProcessId = 0;
+ static void init_globals(void)
+ {
+ pid_t pid;
+
+ if (pid=getpid(), pid != GProcessId)
+ {
+ GFirstMsg = 0;
+ msgbytes = msghdrs = msg_seq = used_queues = max_msqid = 0;
+ GProcessId = pid;
+ }
+ }
/************************************************************************/
/* Demande d'acces a la zone partagee de gestion des semaphores */
/************************************************************************/
***************
*** 79,84 ****
--- 94,100 ----
{
int LRet ;

+ init_globals();
if( GFirstMsg == 0 )
{
if( IsGSemMsgExist() )

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message D'Arcy J.M. Cain 1999-08-18 01:37:20 Re: [HACKERS] Re: [CORE] Re: tomorrow
Previous Message Ross J. Reedstrom 1999-08-17 23:24:55 Re: [HACKERS] getting at the actual int4 value of an abstime