diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 179048f32d16ef6af08207b51018b6291c748d86..8f77d1bfc9754433b971cafcbd6c628cd3f4b347 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -3167,13 +3167,25 @@ SignalSomeChildren(int signal, int target) if (bp->dead_end) continue; - if (!(target & BACKEND_TYPE_NORMAL) && !bp->is_autovacuum) - continue; - if (!(target & BACKEND_TYPE_AUTOVAC) && bp->is_autovacuum) - continue; - if (!(target & BACKEND_TYPE_WALSND) && - IsPostmasterChildWalSender(bp->child_slot)) - continue; + + /* + * Since target == BACKEND_TYPE_ALL is the most common case, + * we test it first and avoid touching shared memory for + * every child. + */ + if (target != BACKEND_TYPE_ALL) + { + int child; + + if (bp->is_autovacuum) + child = BACKEND_TYPE_AUTOVAC; + else if (IsPostmasterChildWalSender(bp->child_slot)) + child = BACKEND_TYPE_WALSND; + else + child = BACKEND_TYPE_NORMAL; + if (!(target & child)) + continue; + } ereport(DEBUG4, (errmsg_internal("sending signal %d to process %d", @@ -4380,13 +4392,25 @@ CountChildren(int target) if (bp->dead_end) continue; - if (!(target & BACKEND_TYPE_NORMAL) && !bp->is_autovacuum) - continue; - if (!(target & BACKEND_TYPE_AUTOVAC) && bp->is_autovacuum) - continue; - if (!(target & BACKEND_TYPE_WALSND) && - IsPostmasterChildWalSender(bp->child_slot)) - continue; + + /* + * Since target == BACKEND_TYPE_ALL is the most common case, + * we test it first and avoid touching shared memory for + * every child. + */ + if (target != BACKEND_TYPE_ALL) + { + int child; + + if (bp->is_autovacuum) + child = BACKEND_TYPE_AUTOVAC; + else if (IsPostmasterChildWalSender(bp->child_slot)) + child = BACKEND_TYPE_WALSND; + else + child = BACKEND_TYPE_NORMAL; + if (!(target & child)) + continue; + } cnt++; }