// `wrap_keyword_plugin` makes modifying `PL_keyword_plugin` thread safe.
// However, `wrap_keyword_plugin` and the associated mutex
// `KEYWORD_PLUGIN_MUTEX_LOCK` are only available since 5.27.6.
// We'll use `OP_CHECK_MUTEX_LOCK` in lieu of `KEYWORD_PLUGIN_MUTEX_LOCK`,
// although that mutex is only available since 5.15.8.
#ifndef wrap_keyword_plugin
#   ifdef OP_CHECK_MUTEX_LOCK
#      define KEYWORD_PLUGIN_MUTEX_LOCK OP_CHECK_MUTEX_LOCK
#      define KEYWORD_PLUGIN_MUTEX_UNLOCK OP_CHECK_MUTEX_UNLOCK
#   else
#      define KEYWORD_PLUGIN_MUTEX_LOCK ((void)0)
#      define KEYWORD_PLUGIN_MUTEX_UNLOCK ((void)0)
#   endif
STATIC void wrap_keyword_plugin( pTHX_ Perl_keyword_plugin_t new_plugin, Perl_keyword_plugin_t *old_plugin_p ) {
#define wrap_keyword_plugin( a, b ) wrap_keyword_plugin( aTHX_ a, b )
   if ( *old_plugin_p )
      return;

   KEYWORD_PLUGIN_MUTEX_LOCK;

   if ( !*old_plugin_p ) {
      *old_plugin_p = PL_keyword_plugin;
      PL_keyword_plugin = new_plugin;
   }

   KEYWORD_PLUGIN_MUTEX_UNLOCK;
}
#endif