* developers. During development, use RM_EXPERIMENTAL_ID to avoid needlessly
  * reserving a new ID.
  */
-extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr);
+extern void RegisterCustomRmgr(RmgrId rmid, const RmgrData *rmgr);
 </programlisting>
   <function>RegisterCustomRmgr</function> must be called from the
   extension module's <link linkend="xfunc-c-dynload">_PG_init</link> function.
 
  * reserving a new ID.
  */
 void
-RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr)
+RegisterCustomRmgr(RmgrId rmid, const RmgrData *rmgr)
 {
    if (rmgr->rm_name == NULL || strlen(rmgr->rm_name) == 0)
        ereport(ERROR, (errmsg("custom resource manager name is invalid"),
 
 extern void RmgrStartup(void);
 extern void RmgrCleanup(void);
 extern void RmgrNotFound(RmgrId rmid);
-extern void RegisterCustomRmgr(RmgrId rmid, RmgrData *rmgr);
+extern void RegisterCustomRmgr(RmgrId rmid, const RmgrData *rmgr);
 
 #ifndef FRONTEND
 static inline bool
 
 void       testcustomrmgrs_desc(StringInfo buf, XLogReaderState *record);
 const char *testcustomrmgrs_identify(uint8 info);
 
-static RmgrData testcustomrmgrs_rmgr = {
+static const RmgrData testcustomrmgrs_rmgr = {
    .rm_name = TESTCUSTOMRMGRS_NAME,
    .rm_redo = testcustomrmgrs_redo,
    .rm_desc = testcustomrmgrs_desc,