Node.js插件对象销毁

时间:2014-02-26 19:31:23

标签: c++ node.js v8 embedded-v8

我正在编写GPU数据库,并使用javascript作为语言来查询使用node.js.

我已经编写了一个节点插件,因为我用C ++编写了GPU数据库。但是我的node.js插件有问题,因为我的c ++对象没有被破坏,但只有当我没有明确使用new运算符时。如果我正在使用new运算符,那很好,就是在调用一个创建新方法的方法时 - 比如copy()等。我使用V8 :: AdjustAmountOfExternalAllocatedMemory(size())作为V8的指示,我有分配外部记忆(在GPU上)。

我可以得到一些建议。

1。正确释放GPU内存的代码

这段代码通过调用对象析构函数来正确释放GPU内存,后者调用释放GPU内存:

var gpudb = require('./build/Release/gpudb');

var n = 1000000;
for (var i = 0; i < 10000; ++i) {
    var col = new gpudb.GpuArray(n);
}

2。但是,这段代码不会调用对象的析构函数来释放GPU内存。

var gpudb = require('./build/Release/gpudb');

var n = 1000000;
var col = new gpudb.GpuArray(n);
for (var i = 0; i < 10000; ++i) {
        var copyOfCol = col.copy();
}

第3。现在,这里分别是构造函数和复制函数的函数。

Handle<Value> GpuVector::New(const Arguments& args) {
  HandleScope scope;

  if (args.IsConstructCall()) {
    // Invoked as constructor: `new GpuVector(...)`
    int value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
    GpuVector* obj = new GpuVector(value);
    obj->Wrap(args.This());
    return args.This();
  } else {
    // Invoked as plain function `GpuVector(...)`, turn into construct call.
    const int argc = 1;
    Local<Value> argv[argc] = { args[0] };
    return scope.Close(constructor->NewInstance(argc, argv));
  }
}

Handle<Value> GpuArray::Copy(const Arguments& args) {
    HandleScope scope;

    GpuArray* in = ObjectWrap::Unwrap<GpuVector>(args.This());
    GpuArray* out = new GpuArray(in); // creates new gpu memory slot and copies the data over

    out->Wrap(args.This());
    return args.This();
}

1 个答案:

答案 0 :(得分:0)

如果没有GpuArray构造函数,就会更难分辨出错误。

但是我可以看到一些不正确的东西:

Handle<Value> GpuArray::Copy(const Arguments& args) {
    //...
    GpuArray* in = ObjectWrap::Unwrap<GpuVector>(args.This());

    //...
}

您正在从GpuVector对象中取消GpuArray对象,这是错误的。

Wrap / Unwrap方法应该用于在c ++对象和它们各自的js对象之间建立连接,而不是在不同对象之间建立连接。

从您发布的代码中,看起来像是(但我可能错了)您正在尝试克隆该对象,如果我正确的话,应该这样做:

Handle<Value> GpuArray::Copy(const Arguments& args) {
    HandleScope scope;

    GpuArray* in = ObjectWrap::Unwrap<GpuArray>( args.This() );

    //build argc and argv here

    Local<Object> outJs = constructorOfGpuArray->NewInstance( argc, argv );
    GpuArray* out = ObjectWrap::Unwrap<GpuArray>( outJs );

    //set members/etc of the "out" object so it looks identical to the "in" object

    //return the js object to the caller.
    return scope.Close( outJs );
}

我没有对代码进行测试,但它应该在理论上