On 2017-06-06 23:24:50 +0200, Petr Jelinek wrote:
> On 06/06/17 23:17, Andres Freund wrote:
> > Right.  I found a couple more instance of similarly iffy, although not
> > quite as broken, patterns in launcher.c.  It's easy to get this wrong,
> > but it's a lot easy if you do it differently everywhere you use a
> > latch.  It's not good if code in the same file, by the same author(s),
> > has different ways of using latches.
> 
> Huh? I see same pattern everywhere in launcher.c, what am I missing?

WaitForReplicationWorkerAttach:
while (...)
    CHECK_FOR_INTERRUPTS();
    /* other stuff including returns */
    WaitLatch()
    WL_POSTMASTER_DEATH
    ResetLatch()

logicalrep_worker_stop loop 1:
while (...)
    /* other stuff */
    CHECK_FOR_INTERRUPTS()
    WaitLatch()
    POSTMASTER_DEATH
    ResetLatch()
    /* other stuff including returns */
logicalrep_worker_stop loop 1:
while (...)
    /* other stuff including returns */
    CHECK_FOR_INTERRUPTS();
    WaitLatch()
    WL_POSTMASTER_DEATH
    ResetLatch()

ApplyLauncherMain:
while (!got_SIGTERM)
    /* lots other stuff */
    WaitLatch()
    WL_POSTMASTER_DEATH
    /* some other stuff */
    ResetLatch()
(note no CFI)

they're not hugely different, but subtely there are differences.
Sometimes you're guaranteed to check for interrupts after resetting the
latch, in other cases not. Sometimes expensive-ish things happen before
a CFI...

Greetings,

Andres Freund


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to