I happened to be looking at sinvaladt.c and noticed the loop added in commit b4fbe392f8ff6ff1a66b488eb7197eef9e1770a4:
/* * Now that the maxMsgNum change is globally visible, we give everyone * a swift kick to make sure they read the newly added messages. * Releasing SInvalWriteLock will enforce a full memory barrier, so * these (unlocked) changes will be committed to memory before we exit * the function. */ for (i = 0; i < segP->lastBackend; i++) { ProcState *stateP = &segP->procState[i]; stateP->hasMessages = true; } This seems fairly awful when there are a large number of backends. Why could we not remove the hasMessages flags again, and change the unlocked test if (!stateP->hasMessages) return 0; into if (stateP->nextMsgNum == segP->maxMsgNum && !stateP->resetState) return 0; If we are looking at stale shared state, this test might produce a false positive, but I don't see why it's any less safe than testing a hasMessages boolean. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers