RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) ) - Mailing list pgsql-hackers
| From | Hiroshi Inoue |
|---|---|
| Subject | RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) ) |
| Date | |
| Msg-id | 000301bee90a$95d40f00$2801007e@cadzone.tpf.co.jp Whole thread Raw |
| In response to | RE: [HACKERS] backend freezeing on win32 fixed (I hope ;-) ) (Horak Daniel <horak@mmp.plzen-city.cz>) |
| Responses |
Re: [HACKERS] backend freezeing on win32 fixed (I hope ;-) )
|
| List | pgsql-hackers |
> -----Original Message-----
> From: owner-pgsql-hackers@postgreSQL.org
> [mailto:owner-pgsql-hackers@postgreSQL.org]On Behalf Of Horak Daniel
> Sent: Tuesday, August 17, 1999 9:06 PM
> To: 'Tom Lane'
> Cc: 'pgsql-hackers@postgreSQL.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@marin.or.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@tpf.co.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
gestiondes 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
gestiondes 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
gestiondes semaphores */ /************************************************************************/
***************
*** 79,84 ****
--- 94,100 ---- { int LRet ;
+ init_globals(); if( GFirstMsg == 0 ) { if( IsGSemMsgExist() )
pgsql-hackers by date: