diff --git a/src/backend/storage/lmgr/spin.c b/src/backend/storage/lmgr/spin.c
index d262efa300fd830907dc0a3f2179c6ebd5a65c25..56442ed073e966c9c01316de47dd28d395a6f6a4 100644
--- a/src/backend/storage/lmgr/spin.c
+++ b/src/backend/storage/lmgr/spin.c
@@ -23,6 +23,7 @@
 #include "postgres.h"
 
 #include "miscadmin.h"
+#include "replication/walsender.h"
 #include "storage/lwlock.h"
 #include "storage/spin.h"
 
@@ -50,14 +51,21 @@ SpinlockSemas(void)
 int
 SpinlockSemas(void)
 {
+	int		nsemas;
+
 	/*
 	 * It would be cleaner to distribute this logic into the affected modules,
 	 * similar to the way shmem space estimation is handled.
 	 *
-	 * For now, though, we just need a few spinlocks (10 should be plenty)
-	 * plus one for each LWLock and one for each buffer header.
+	 * For now, though, there are few enough users of spinlocks that we just
+	 * keep the knowledge here.
 	 */
-	return NumLWLocks() + NBuffers + 10;
+	nsemas = NumLWLocks();		/* one for each lwlock */
+	nsemas += NBuffers;			/* one for each buffer header */
+	nsemas += max_wal_senders;	/* one for each wal sender process */
+	nsemas += 30;				/* plus a bunch for other small-scale use */
+
+	return nsemas;
 }
 
 /*