The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

#ifndef __PerlCallback_h_
#define __PerlCallback_h_

#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#undef do_open
#undef do_close
#ifdef __cplusplus
}
#endif

namespace SOOT {

  /* This stuff is used for implementing TExec wrapping */

  /* Run the given callback using call_sv in void context without args */
  void ExecPerlCallback(pTHX_ SV* callback);

  /* Store the given callback using the given id (usually abusing a pointer) in the global storage of callbacks */
  void StorePerlCallback(pTHX_ long unsigned int id, SV* callback);

  /* Run the callback identified by the given id. Returns != 0 if the callback was run. */
  int ExecStoredPerlCallback(pTHX_ long unsigned int id);

  /* Remove the callback identified by the given id */
  void ClearStoredPerlCallback(pTHX_ long unsigned int id);

} // end namespace SOOT

#endif