--- /dev/null
+<!-- doc/src/sgml/test-shm-mq.sgml -->
+
+<sect1 id="test-shm-mq" xreflabel="test_shm_mq">
+ <title>test_shm_mq</title>
+
+ <indexterm zone="test-shm-mq">
+ <primary>test_shm_mq</primary>
+ </indexterm>
+
+ <para>
+ <filename>test_shm_mq</> is an example of how to use dynamic shared memory
+ and the shared memory message queue facilities to coordinate a user backend
+ with the efforts of one or more background workers. It is not intended to
+ do anything useful on its own; rather, it is a demonstration of how these
+ facilities can be used, and a unit test of those facilities.
+ </para>
+
+ <para>
+ The function is this extension send the same message repeatedly through
+ a loop of processes. The message payload, the size of the message queue
+ through which it is sent, and the number of processes in the loop are
+ configurable. At the end, the message may be verified to ensure that it
+ has not been corrupted in transmission.
+ </para>
+
+ <sect2>
+ <title>Functions</title>
+
+<synopsis>
+test_shm_mq(queue_size int8, message text,
+ repeat_count int4 default 1, num_workers int4 default 1)
+ RETURNS void
+</synopsis>
+
+ <para>
+ This function sends and receives messages synchronously. The user
+ backend sends the provided message to the first background worker using
+ a message queue of the given size. The first background worker sends
+ the message to the second background worker, if the number of workers
+ is greater than one, and so forth. Eventually, the last background
+ worker sends the message back to the user backend. If the repeat count
+ is greater than one, the user backend then sends the message back to
+ the first worker. Once the message has been send and received by all
+ the coordinating processes a number of times equal to the repeat count,
+ the user backend verifies that the message finally received matches the
+ one originally sent and throws an error if not.
+ </para>
+
+<synopsis>
+test_shm_mq_pipelined(queue_size int8, message text,
+ repeat_count int4 default 1, num_workers int4 default 1,
+ verify bool default true)
+ RETURNS void
+</synopsis>
+
+ <para>
+ This function sends the same message multiple times, as specified by the
+ repeat count, to the first background worker using a queue of the given
+ size. These messages are then forwarded to each background worker in
+ turn, in each case using a queue of the given size. Finally, the last
+ background worker sends the messages back to the user backend. The user
+ backend uses non-blocking sends and receives, so that it may begin receiving
+ copies of the message before it has finished sending all copies of the
+ message. The <literal>verify</> argument controls whether or not the
+ received copies are checked against the message that was sent. (This
+ takes nontrivial time so it may be useful to disable it for benchmarking
+ purposes.)
+ </para>
+
+ </sect2>
+</sect1>