Add node bindings

This commit is contained in:
Ben Alpert 2015-09-19 10:59:54 -07:00
parent e922f869e6
commit b3bccf2273
5 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,16 @@
# perf-counters
Lightweight bindings to Linux perf event counters.
```
$ node
> var PerfCounters = require('perf-counters');
> PerfCounters.init();
> var start = PerfCounters.getCounters(); console.log('test'); var end = PerfCounters.getCounters();
test
> start
{ instructions: 1382, loads: 421, stores: 309 }
> end
{ instructions: 647633, loads: 195771, stores: 133246 }
>
```

View File

@ -0,0 +1,15 @@
{
"targets": [
{
"target_name": "perfcounters",
"sources": [
"src/hardware-counter.cpp",
"src/perf-counters.cpp",
"src/thread-local.cpp",
],
"cflags": [
"-Wno-sign-compare",
],
},
],
}

View File

@ -0,0 +1,3 @@
'use strict';
module.exports = require('bindings')('perfcounters');

View File

@ -0,0 +1,10 @@
{
"name": "perf-counters",
"version": "0.1.2",
"description": "Lightweight bindings to Linux perf event counters.",
"main": "index.js",
"license": "BSD-3-Clause",
"dependencies": {
"bindings": "^1.2.1"
}
}

View File

@ -0,0 +1,55 @@
/**
* Copyright 2013-2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#include <node.h>
#include "hardware-counter.h"
namespace PerfCounters {
using HPHP::HardwareCounter;
void Init(const v8::FunctionCallbackInfo<v8::Value>& args) {
// TODO: Allow customizing recorded events
bool enable = true;
std::string events = "";
bool recordSubprocesses = false;
HardwareCounter::Init(enable, events, recordSubprocesses);
HardwareCounter::s_counter.getCheck();
}
void GetCounters(const v8::FunctionCallbackInfo<v8::Value>& args) {
v8::Isolate* isolate = args.GetIsolate();
v8::Local<v8::Object> obj = v8::Object::New(isolate);
std::pair<v8::Isolate*, v8::Local<v8::Object>> pair(isolate, obj);
HardwareCounter::GetPerfEvents(
[](const std::string& key, int64_t value, void* data) {
std::pair<v8::Isolate*, v8::Local<v8::Object>>& pair =
*reinterpret_cast<std::pair<v8::Isolate*, v8::Local<v8::Object>>*>(data);
v8::Isolate* isolate = pair.first;
v8::Local<v8::Object> obj = pair.second;
obj->Set(
v8::String::NewFromUtf8(isolate, key.c_str()),
v8::Number::New(isolate, value)
);
},
&pair);
args.GetReturnValue().Set(obj);
}
void InitModule(v8::Local<v8::Object> exports) {
NODE_SET_METHOD(exports, "init", Init);
NODE_SET_METHOD(exports, "getCounters", GetCounters);
}
NODE_MODULE(perfcounters, InitModule)
}