aboutsummaryrefslogtreecommitdiffstats
path: root/ext/probe/probe.c
blob: e252b767b97ad4ee434e5068901464150d85aeb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * probe.c - 
 *
 * $Author$
 *
 * Based on the patch for Ruby 1.8.6 by Joyent Inc.
 *
 * Copyright 2007 Joyent Inc.
 * Copyright 2009 Yuki Sonoda (Yugui).
 */
#include "ruby/ruby.h"

#define FIRE_WITH_SUFFIXED_MSG(probe_name, probe_data, suffix) \
    if (TRACE_RUBY_PROBE_ENABLED()) { \
        char *msg = ALLOCA_N(char, strlen(probe_name) + strlen("-" #suffix) ); \
        sprintf(msg, "%s%s", probe_name, "-" #suffix); \
        FIRE_RUBY_PROBE(msg, (char*)probe_data); \
    }

static VALUE
probe_fire(int argc, VALUE *argv, VALUE klass)
{
    int args;
    VALUE name, data, ret;
    const char *probe_data;
    char *probe_name;

    args = rb_scan_args(argc, argv, "11", &name, &data);
    probe_data = args == 2 ? StringValuePtr(data) : "";
    probe_name = StringValuePtr(name);

    if (rb_block_given_p()) {
        FIRE_WITH_SUFFIXED_MSG(probe_name, probe_data, start);
	ret = rb_yield(Qnil);
        FIRE_WITH_SUFFIXED_MSG(probe_name, probe_data, end);
    } else {
	if (TRACE_RUBY_PROBE_ENABLED())
	    FIRE_RUBY_PROBE(probe_name, (char*)probe_data);
	ret = Qnil;
    }
    return ret;
}

void Init_probe()
{
    rb_define_global_function("fire_probe", probe_fire, -1);
}