diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml
index 96ba95818c..89116ae74c 100644
--- a/doc/src/sgml/xfunc.sgml
+++ b/doc/src/sgml/xfunc.sgml
@@ -3428,6 +3428,29 @@ void RequestNamedLWLockTranche(const char *tranche_name, int num_lwlocks)
contrib/pg_stat_statements/pg_stat_statements.c in the
PostgreSQL source tree.
+
+ There is another, more flexible method of obtaining LWLocks. First,
+ allocate a tranche_id from a shared counter by
+ calling:
+
+int LWLockNewTrancheId(void)
+
+ Next, each individual process using the tranche_id
+ should associate it with a tranche_name by calling:
+
+void LWLockRegisterTranche(int tranche_id, const char *tranche_name)
+
+ It is also required to call LWLockInitialize once
+ per LWLock, passing the tranche_id as argument:
+
+void LWLockInitialize(LWLock *lock, int tranche_id)
+
+ A complete usage example of LWLockNewTrancheId,
+ LWLockInitialize and
+ LWLockRegisterTranche can be found in
+ contrib/pg_prewarm/autoprewarm.c in the
+ PostgreSQL source tree.
+
To avoid possible race-conditions, each backend should use the LWLock
AddinShmemInitLock when connecting to and initializing
@@ -3451,6 +3474,13 @@ if (!ptr)
}
+
+ It is convenient to use shmem_startup_hook which allows
+ placing all the code responsible for initializing shared memory in one
+ place. When using shmem_startup_hook the extension
+ still needs to acquire AddinShmemInitLock in order to
+ work properly on all the supported platforms.
+