node_modules updated, buefy add to lib folder
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
||||
{
|
||||
'conditions' : [
|
||||
['OS=="mac" or OS=="solaris"', {
|
||||
'variables': {
|
||||
'escaped_root': '<!(printf %q "<(module_root_dir)")',
|
||||
}
|
||||
}],
|
||||
['OS=="freebsd"', {
|
||||
'variables' : {
|
||||
'escaped_root': '<!(printf %s "<(module_root_dir)")'
|
||||
}
|
||||
}]
|
||||
],
|
||||
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'DTraceProviderBindings',
|
||||
'sources': [
|
||||
'dtrace_provider.cc',
|
||||
'dtrace_probe.cc',
|
||||
'dtrace_argument.cc'
|
||||
],
|
||||
'conditions': [
|
||||
['OS=="mac" or OS=="solaris"',
|
||||
{ 'include_dirs': [
|
||||
'../libusdt',
|
||||
'<!(node -e "require(\'nan\')")',
|
||||
]
|
||||
}
|
||||
],
|
||||
['OS=="freebsd"',
|
||||
{ 'include_dirs': [
|
||||
'/usr/src/cddl/compat/opensolaris/',
|
||||
'/usr/src/sys/cddl/compat/opensolaris',
|
||||
'/usr/src/sys/cddl/contrib/opensolaris/uts/common/',
|
||||
'../libusdt',
|
||||
'<!(node -e "require(\'nan\')")'
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
'libraries': [
|
||||
'-L<(escaped_root)/../libusdt -l usdt'
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
#include "dtrace_provider.h"
|
||||
#include <nan.h>
|
||||
|
||||
namespace node {
|
||||
|
||||
using namespace v8;
|
||||
|
||||
// Integer Argument
|
||||
|
||||
#ifdef __x86_64__
|
||||
# define INTMETHOD ToInteger()
|
||||
#else
|
||||
# define INTMETHOD ToInt32()
|
||||
#endif
|
||||
|
||||
void * DTraceIntegerArgument::ArgumentValue(v8::Local<Value> value) {
|
||||
if (value->IsUndefined())
|
||||
return 0;
|
||||
else
|
||||
return (void *)(long) value->INTMETHOD->Value();
|
||||
}
|
||||
|
||||
void DTraceIntegerArgument::FreeArgument(void *arg) {
|
||||
}
|
||||
|
||||
const char * DTraceIntegerArgument::Type() {
|
||||
return "int";
|
||||
}
|
||||
|
||||
// String Argument
|
||||
|
||||
void * DTraceStringArgument::ArgumentValue(v8::Local<Value> value) {
|
||||
if (value->IsUndefined())
|
||||
return (void *) strdup("undefined");
|
||||
|
||||
String::Utf8Value str(value->ToString());
|
||||
return (void *) strdup(*str);
|
||||
}
|
||||
|
||||
void DTraceStringArgument::FreeArgument(void *arg) {
|
||||
free(arg);
|
||||
}
|
||||
|
||||
const char * DTraceStringArgument::Type() {
|
||||
return "char *";
|
||||
}
|
||||
|
||||
// JSON Argument
|
||||
|
||||
DTraceJsonArgument::DTraceJsonArgument() {
|
||||
Nan::HandleScope scope;
|
||||
v8::Local<Context> context = Nan::GetCurrentContext();
|
||||
v8::Local<Object> global = context->Global();
|
||||
v8::Local<Object> l_JSON = global->Get(Nan::New<String>("JSON").ToLocalChecked())->ToObject();
|
||||
v8::Local<Function> l_JSON_stringify
|
||||
= v8::Local<Function>::Cast(l_JSON->Get(Nan::New<String>("stringify").ToLocalChecked()));
|
||||
JSON.Reset(l_JSON);
|
||||
JSON_stringify.Reset(l_JSON_stringify);
|
||||
}
|
||||
|
||||
DTraceJsonArgument::~DTraceJsonArgument() {
|
||||
JSON.Reset();
|
||||
JSON_stringify.Reset();
|
||||
}
|
||||
|
||||
void * DTraceJsonArgument::ArgumentValue(v8::Local<Value> value) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
if (value->IsUndefined())
|
||||
return (void *) strdup("undefined");
|
||||
|
||||
v8::Local<Value> info[1];
|
||||
info[0] = value;
|
||||
v8::Local<Value> j = Nan::New<Function>(JSON_stringify)->Call(
|
||||
Nan::New<Object>(JSON), 1, info);
|
||||
|
||||
if (*j == NULL)
|
||||
return (void *) strdup("{ \"error\": \"stringify failed\" }");
|
||||
|
||||
String::Utf8Value json(j->ToString());
|
||||
return (void *) strdup(*json);
|
||||
}
|
||||
|
||||
void DTraceJsonArgument::FreeArgument(void *arg) {
|
||||
free(arg);
|
||||
}
|
||||
|
||||
const char * DTraceJsonArgument::Type() {
|
||||
return "char *";
|
||||
}
|
||||
|
||||
} // namespace node
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
#include "dtrace_provider.h"
|
||||
#include <nan.h>
|
||||
|
||||
namespace node {
|
||||
|
||||
using namespace v8;
|
||||
|
||||
DTraceProbe::DTraceProbe() : Nan::ObjectWrap() {
|
||||
argc = 0;
|
||||
probedef = NULL;
|
||||
}
|
||||
|
||||
DTraceProbe::~DTraceProbe() {
|
||||
for (size_t i = 0; i < argc; i++)
|
||||
delete(this->arguments[i]);
|
||||
usdt_probe_release(probedef);
|
||||
}
|
||||
|
||||
Nan::Persistent<FunctionTemplate> DTraceProbe::constructor_template;
|
||||
|
||||
void DTraceProbe::Initialize(v8::Local<Object> target) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
Local<FunctionTemplate> t = Nan::New<FunctionTemplate>(DTraceProbe::New);
|
||||
t->InstanceTemplate()->SetInternalFieldCount(2);
|
||||
t->SetClassName(Nan::New<String>("DTraceProbe").ToLocalChecked());
|
||||
constructor_template.Reset(t);
|
||||
|
||||
Nan::SetPrototypeMethod(t, "fire", DTraceProbe::Fire);
|
||||
|
||||
target->Set(Nan::New<String>("DTraceProbe").ToLocalChecked(), t->GetFunction());
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProbe::New) {
|
||||
Nan::HandleScope scope;
|
||||
DTraceProbe *probe = new DTraceProbe();
|
||||
probe->Wrap(info.This());
|
||||
info.GetReturnValue().Set(info.This());
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProbe::Fire) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
if (!info[0]->IsFunction()) {
|
||||
Nan::ThrowTypeError("Must give probe value callback as first argument");
|
||||
return;
|
||||
}
|
||||
|
||||
DTraceProbe *pd = Nan::ObjectWrap::Unwrap<DTraceProbe>(info.Holder());
|
||||
info.GetReturnValue().Set(pd->_fire(info, 0));
|
||||
}
|
||||
|
||||
v8::Local<Value> DTraceProbe::_fire(Nan::NAN_METHOD_ARGS_TYPE argsinfo, size_t fnidx) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
if (usdt_is_enabled(this->probedef->probe) == 0) {
|
||||
return Nan::Undefined();
|
||||
}
|
||||
|
||||
// invoke fire callback
|
||||
Nan::TryCatch try_catch;
|
||||
|
||||
size_t cblen = argsinfo.Length() - fnidx - 1;
|
||||
Local<Value> *cbargs = new Local<Value>[cblen];
|
||||
|
||||
for (size_t i = 0; i < cblen; i++) {
|
||||
cbargs[i] = argsinfo[i + fnidx + 1];
|
||||
}
|
||||
|
||||
Local<Function> cb = Local<Function>::Cast(argsinfo[fnidx]);
|
||||
Local<Value> probe_args = cb->Call(this->handle(), cblen, cbargs);
|
||||
|
||||
delete [] cbargs;
|
||||
|
||||
// exception in args callback?
|
||||
if (try_catch.HasCaught()) {
|
||||
Nan::FatalException(try_catch);
|
||||
return Nan::Undefined();
|
||||
}
|
||||
|
||||
// check return
|
||||
if (!probe_args->IsArray()) {
|
||||
return Nan::Undefined();
|
||||
}
|
||||
|
||||
Local<Array> a = Local<Array>::Cast(probe_args);
|
||||
void *argv[USDT_ARG_MAX];
|
||||
|
||||
// convert each argument value
|
||||
for (size_t i = 0; i < argc; i++) {
|
||||
argv[i] = this->arguments[i]->ArgumentValue(a->Get(i));
|
||||
}
|
||||
|
||||
// finally fire the probe
|
||||
usdt_fire_probe(this->probedef->probe, argc, argv);
|
||||
|
||||
// free argument values
|
||||
for (size_t i = 0; i < argc; i++) {
|
||||
this->arguments[i]->FreeArgument(argv[i]);
|
||||
}
|
||||
|
||||
return Nan::True();
|
||||
}
|
||||
|
||||
} // namespace node
|
||||
+225
@@ -0,0 +1,225 @@
|
||||
#include "dtrace_provider.h"
|
||||
#include <nan.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
namespace node {
|
||||
|
||||
using namespace v8;
|
||||
|
||||
DTraceProvider::DTraceProvider() : Nan::ObjectWrap() {
|
||||
provider = NULL;
|
||||
}
|
||||
|
||||
DTraceProvider::~DTraceProvider() {
|
||||
usdt_provider_disable(provider);
|
||||
usdt_provider_free(provider);
|
||||
}
|
||||
|
||||
Nan::Persistent<FunctionTemplate> DTraceProvider::constructor_template;
|
||||
|
||||
void DTraceProvider::Initialize(v8::Local<Object> target) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
Local<FunctionTemplate> t = Nan::New<FunctionTemplate>(DTraceProvider::New);
|
||||
t->InstanceTemplate()->SetInternalFieldCount(1);
|
||||
t->SetClassName(Nan::New<String>("DTraceProvider").ToLocalChecked());
|
||||
constructor_template.Reset(t);
|
||||
|
||||
Nan::SetPrototypeMethod(t, "addProbe", DTraceProvider::AddProbe);
|
||||
Nan::SetPrototypeMethod(t, "removeProbe", DTraceProvider::RemoveProbe);
|
||||
Nan::SetPrototypeMethod(t, "enable", DTraceProvider::Enable);
|
||||
Nan::SetPrototypeMethod(t, "disable", DTraceProvider::Disable);
|
||||
Nan::SetPrototypeMethod(t, "fire", DTraceProvider::Fire);
|
||||
|
||||
target->Set(Nan::New<String>("DTraceProvider").ToLocalChecked(), t->GetFunction());
|
||||
|
||||
DTraceProbe::Initialize(target);
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::New) {
|
||||
Nan::HandleScope scope;
|
||||
DTraceProvider *p = new DTraceProvider();
|
||||
char module[128];
|
||||
|
||||
p->Wrap(info.This());
|
||||
|
||||
if (info.Length() < 1 || !info[0]->IsString()) {
|
||||
Nan::ThrowTypeError("Must give provider name as argument");
|
||||
return;
|
||||
}
|
||||
|
||||
String::Utf8Value name(info[0]->ToString());
|
||||
|
||||
if (info.Length() == 2) {
|
||||
if (!info[1]->IsString()) {
|
||||
Nan::ThrowTypeError("Must give module name as argument");
|
||||
return;
|
||||
}
|
||||
|
||||
String::Utf8Value mod(info[1]->ToString());
|
||||
(void) snprintf(module, sizeof (module), "%s", *mod);
|
||||
} else if (info.Length() == 1) {
|
||||
// If no module name is provided, develop a synthetic module name based
|
||||
// on our address
|
||||
(void) snprintf(module, sizeof (module), "mod-%p", p);
|
||||
} else {
|
||||
Nan::ThrowError("Expected only provider name and module as arguments");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((p->provider = usdt_create_provider(*name, module)) == NULL) {
|
||||
Nan::ThrowError("usdt_create_provider failed");
|
||||
return;
|
||||
}
|
||||
|
||||
info.GetReturnValue().Set(info.This());
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::AddProbe) {
|
||||
Nan::HandleScope scope;
|
||||
const char *types[USDT_ARG_MAX];
|
||||
|
||||
v8::Local<Object> obj = info.Holder();
|
||||
DTraceProvider *provider = Nan::ObjectWrap::Unwrap<DTraceProvider>(obj);
|
||||
|
||||
// create a DTraceProbe object
|
||||
v8::Local<Function> klass =
|
||||
Nan::New<FunctionTemplate>(DTraceProbe::constructor_template)->GetFunction();
|
||||
v8::Local<Object> pd = Nan::NewInstance(klass).ToLocalChecked();
|
||||
|
||||
// store in provider object
|
||||
DTraceProbe *probe = Nan::ObjectWrap::Unwrap<DTraceProbe>(pd->ToObject());
|
||||
obj->Set(info[0]->ToString(), pd);
|
||||
|
||||
// reference the provider to avoid GC'ing it when only probes remain in scope.
|
||||
Nan::ForceSet(pd, Nan::New<String>("__prov__").ToLocalChecked(), obj,
|
||||
static_cast<PropertyAttribute>(DontEnum | ReadOnly | DontDelete));
|
||||
|
||||
// add probe to provider
|
||||
for (int i = 0; i < USDT_ARG_MAX; i++) {
|
||||
if (i < info.Length() - 1) {
|
||||
String::Utf8Value type(info[i + 1]->ToString());
|
||||
|
||||
if (strncmp("json", *type, 4) == 0)
|
||||
probe->arguments[i] = new DTraceJsonArgument();
|
||||
else if (strncmp("char *", *type, 6) == 0)
|
||||
probe->arguments[i] = new DTraceStringArgument();
|
||||
else if (strncmp("int", *type, 3) == 0)
|
||||
probe->arguments[i] = new DTraceIntegerArgument();
|
||||
else
|
||||
probe->arguments[i] = new DTraceStringArgument();
|
||||
|
||||
types[i] = strdup(probe->arguments[i]->Type());
|
||||
probe->argc++;
|
||||
}
|
||||
}
|
||||
|
||||
String::Utf8Value name(info[0]->ToString());
|
||||
probe->probedef = usdt_create_probe(*name, *name, probe->argc, types);
|
||||
Nan::SetInternalFieldPointer(pd, 1, provider);
|
||||
usdt_provider_add_probe(provider->provider, probe->probedef);
|
||||
|
||||
for (size_t i = 0; i < probe->argc; i++) {
|
||||
free((char *)types[i]);
|
||||
}
|
||||
|
||||
info.GetReturnValue().Set(pd);
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::RemoveProbe) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
v8::Local<Object> provider_obj = info.Holder();
|
||||
DTraceProvider *provider = Nan::ObjectWrap::Unwrap<DTraceProvider>(provider_obj);
|
||||
|
||||
v8::Local<Object> probe_obj = Local<Object>::Cast(info[0]);
|
||||
DTraceProbe *probe = Nan::ObjectWrap::Unwrap<DTraceProbe>(probe_obj);
|
||||
|
||||
v8::Local<String> name = Nan::New<String>(probe->probedef->name).ToLocalChecked();
|
||||
provider_obj->Delete(name);
|
||||
|
||||
if (usdt_provider_remove_probe(provider->provider, probe->probedef) != 0) {
|
||||
Nan::ThrowError(usdt_errstr(provider->provider));
|
||||
return;
|
||||
}
|
||||
|
||||
info.GetReturnValue().Set(Nan::True());
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::Enable) {
|
||||
Nan::HandleScope scope;
|
||||
DTraceProvider *provider = Nan::ObjectWrap::Unwrap<DTraceProvider>(info.Holder());
|
||||
|
||||
if (usdt_provider_enable(provider->provider) != 0) {
|
||||
Nan::ThrowError(usdt_errstr(provider->provider));
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::Disable) {
|
||||
Nan::HandleScope scope;
|
||||
DTraceProvider *provider = Nan::ObjectWrap::Unwrap<DTraceProvider>(info.Holder());
|
||||
|
||||
if (usdt_provider_disable(provider->provider) != 0) {
|
||||
Nan::ThrowError(usdt_errstr(provider->provider));
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
NAN_METHOD(DTraceProvider::Fire) {
|
||||
Nan::HandleScope scope;
|
||||
|
||||
if (!info[0]->IsString()) {
|
||||
Nan::ThrowTypeError("Must give probe name as first argument");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!info[1]->IsFunction()) {
|
||||
Nan::ThrowTypeError("Must give probe value callback as second argument");
|
||||
return;
|
||||
}
|
||||
|
||||
v8::Local<Object> holder = info.Holder();
|
||||
DTraceProvider *provider = Nan::ObjectWrap::Unwrap<DTraceProvider>(holder);
|
||||
|
||||
Nan::MaybeLocal<v8::Value> maybe = Nan::Get(holder, info[0]);
|
||||
if (maybe.IsEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> value = maybe.ToLocalChecked();
|
||||
if (!value->IsObject()) {
|
||||
return;
|
||||
}
|
||||
|
||||
v8::Local<Object> probe = Local<Object>::Cast(value);
|
||||
if (probe->InternalFieldCount() != 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Nan::GetInternalFieldPointer(probe, 1) != provider) {
|
||||
return;
|
||||
}
|
||||
|
||||
DTraceProbe *p = Nan::ObjectWrap::Unwrap<DTraceProbe>(probe);
|
||||
if (p == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
p->_fire(info, 1);
|
||||
|
||||
info.GetReturnValue().Set(Nan::True());
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
init(v8::Local<Object> target) {
|
||||
DTraceProvider::Initialize(target);
|
||||
}
|
||||
|
||||
NODE_MODULE(DTraceProviderBindings, init)
|
||||
} // namespace node
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
#include <nan.h>
|
||||
#include <node_object_wrap.h>
|
||||
|
||||
extern "C" {
|
||||
#include <usdt.h>
|
||||
}
|
||||
|
||||
#include <sys/dtrace.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef __APPLE__
|
||||
#include <stdlib.h>
|
||||
#ifndef __FreeBSD__
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace node {
|
||||
|
||||
using namespace v8;
|
||||
|
||||
class DTraceArgument {
|
||||
public:
|
||||
virtual const char *Type() = 0;
|
||||
virtual void *ArgumentValue(v8::Local<Value>) = 0;
|
||||
virtual void FreeArgument(void *) = 0;
|
||||
virtual ~DTraceArgument() { };
|
||||
};
|
||||
|
||||
class DTraceIntegerArgument : public DTraceArgument {
|
||||
public:
|
||||
const char *Type();
|
||||
void *ArgumentValue(v8::Local<Value>);
|
||||
void FreeArgument(void *);
|
||||
};
|
||||
|
||||
class DTraceStringArgument : public DTraceArgument {
|
||||
public:
|
||||
const char *Type();
|
||||
void *ArgumentValue(v8::Local<Value>);
|
||||
void FreeArgument(void *);
|
||||
};
|
||||
|
||||
class DTraceJsonArgument : public DTraceArgument {
|
||||
public:
|
||||
const char *Type();
|
||||
void *ArgumentValue(v8::Local<Value>);
|
||||
void FreeArgument(void *);
|
||||
DTraceJsonArgument();
|
||||
~DTraceJsonArgument();
|
||||
private:
|
||||
Nan::Persistent<Object> JSON;
|
||||
Nan::Persistent<Function> JSON_stringify;
|
||||
};
|
||||
|
||||
class DTraceProbe : public Nan::ObjectWrap {
|
||||
|
||||
public:
|
||||
static void Initialize(v8::Local<v8::Object> target);
|
||||
usdt_probedef_t *probedef;
|
||||
size_t argc;
|
||||
DTraceArgument *arguments[USDT_ARG_MAX];
|
||||
|
||||
static NAN_METHOD(New);
|
||||
static NAN_METHOD(Fire);
|
||||
|
||||
v8::Local<Value> _fire(Nan::NAN_METHOD_ARGS_TYPE, size_t);
|
||||
|
||||
static Nan::Persistent<FunctionTemplate> constructor_template;
|
||||
|
||||
DTraceProbe();
|
||||
~DTraceProbe();
|
||||
private:
|
||||
};
|
||||
|
||||
class DTraceProvider : public Nan::ObjectWrap {
|
||||
|
||||
public:
|
||||
static void Initialize(v8::Local<v8::Object> target);
|
||||
usdt_provider_t *provider;
|
||||
|
||||
static NAN_METHOD(New);
|
||||
static NAN_METHOD(AddProbe);
|
||||
static NAN_METHOD(RemoveProbe);
|
||||
static NAN_METHOD(Enable);
|
||||
static NAN_METHOD(Disable);
|
||||
static NAN_METHOD(Fire);
|
||||
|
||||
DTraceProvider();
|
||||
~DTraceProvider();
|
||||
private:
|
||||
static Nan::Persistent<FunctionTemplate> constructor_template;
|
||||
};
|
||||
|
||||
void InitDTraceProvider(v8::Local<v8::Object> target);
|
||||
}
|
||||
Reference in New Issue
Block a user