tracer.c   [plain text]


#include "ruby.h"

#ifdef ENABLE_DTRACE
#include "dtrace.h"
#endif

VALUE rb_mDtrace;

static VALUE
ruby_dtrace_probe(int argc, VALUE *argv, unsigned check_only)
{
#ifdef ENABLE_DTRACE
  if (check_only) {
    return RUBY_RUBY_PROBE_ENABLED() ? Qtrue : Qfalse; 
  }
  else {
    VALUE name, data;
    char *probe_data;
 
    rb_scan_args(argc, argv, "11", &name, &data);
    probe_data = NIL_P(data) ? "" : StringValuePtr(data);

    RUBY_RUBY_PROBE(StringValuePtr(name), probe_data);
  }
#endif
  return Qnil;
}

static VALUE
ruby_dtrace_fire(int argc, VALUE *argv, VALUE klass)
{
  return ruby_dtrace_probe(argc, argv, 0);
}

static VALUE
ruby_dtrace_enabled(VALUE klass)
{
  return ruby_dtrace_probe(0, NULL, 1);
}

void Init_DTracer()
{
  rb_mDtrace = rb_define_module("DTracer");
  rb_define_module_function(rb_mDtrace, "fire", ruby_dtrace_fire, -1);
  rb_define_module_function(rb_mDtrace, "enabled?", ruby_dtrace_enabled, 0);
}