Ohm-Management - Projektarbeit B-ME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dtrace_probe.cc 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "dtrace_provider.h"
  2. #include <nan.h>
  3. namespace node {
  4. using namespace v8;
  5. DTraceProbe::DTraceProbe() : Nan::ObjectWrap() {
  6. argc = 0;
  7. probedef = NULL;
  8. }
  9. DTraceProbe::~DTraceProbe() {
  10. for (size_t i = 0; i < argc; i++)
  11. delete(this->arguments[i]);
  12. usdt_probe_release(probedef);
  13. }
  14. Nan::Persistent<FunctionTemplate> DTraceProbe::constructor_template;
  15. void DTraceProbe::Initialize(v8::Local<Object> target) {
  16. Nan::HandleScope scope;
  17. Local<FunctionTemplate> t = Nan::New<FunctionTemplate>(DTraceProbe::New);
  18. t->InstanceTemplate()->SetInternalFieldCount(2);
  19. t->SetClassName(Nan::New<String>("DTraceProbe").ToLocalChecked());
  20. constructor_template.Reset(t);
  21. Nan::SetPrototypeMethod(t, "fire", DTraceProbe::Fire);
  22. target->Set(Nan::New<String>("DTraceProbe").ToLocalChecked(), t->GetFunction());
  23. }
  24. NAN_METHOD(DTraceProbe::New) {
  25. Nan::HandleScope scope;
  26. DTraceProbe *probe = new DTraceProbe();
  27. probe->Wrap(info.This());
  28. info.GetReturnValue().Set(info.This());
  29. }
  30. NAN_METHOD(DTraceProbe::Fire) {
  31. Nan::HandleScope scope;
  32. if (!info[0]->IsFunction()) {
  33. Nan::ThrowTypeError("Must give probe value callback as first argument");
  34. return;
  35. }
  36. DTraceProbe *pd = Nan::ObjectWrap::Unwrap<DTraceProbe>(info.Holder());
  37. info.GetReturnValue().Set(pd->_fire(info, 0));
  38. }
  39. v8::Local<Value> DTraceProbe::_fire(Nan::NAN_METHOD_ARGS_TYPE argsinfo, size_t fnidx) {
  40. Nan::HandleScope scope;
  41. if (usdt_is_enabled(this->probedef->probe) == 0) {
  42. return Nan::Undefined();
  43. }
  44. // invoke fire callback
  45. Nan::TryCatch try_catch;
  46. size_t cblen = argsinfo.Length() - fnidx - 1;
  47. Local<Value> *cbargs = new Local<Value>[cblen];
  48. for (size_t i = 0; i < cblen; i++) {
  49. cbargs[i] = argsinfo[i + fnidx + 1];
  50. }
  51. Local<Function> cb = Local<Function>::Cast(argsinfo[fnidx]);
  52. Local<Value> probe_args = cb->Call(this->handle(), cblen, cbargs);
  53. delete [] cbargs;
  54. // exception in args callback?
  55. if (try_catch.HasCaught()) {
  56. Nan::FatalException(try_catch);
  57. return Nan::Undefined();
  58. }
  59. // check return
  60. if (!probe_args->IsArray()) {
  61. return Nan::Undefined();
  62. }
  63. Local<Array> a = Local<Array>::Cast(probe_args);
  64. void *argv[USDT_ARG_MAX];
  65. // convert each argument value
  66. for (size_t i = 0; i < argc; i++) {
  67. argv[i] = this->arguments[i]->ArgumentValue(a->Get(i));
  68. }
  69. // finally fire the probe
  70. usdt_fire_probe(this->probedef->probe, argc, argv);
  71. // free argument values
  72. for (size_t i = 0; i < argc; i++) {
  73. this->arguments[i]->FreeArgument(argv[i]);
  74. }
  75. return Nan::True();
  76. }
  77. } // namespace node