2014-02-26 55 views
3

我正在写一个GPU数据库,并且使用javascript作为语言来查询使用node.js.Node.js插件对象破坏

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

请给我一些建议。

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

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

1.一种可正确释放GPU存储器

代码本的代码正确地通过调用对象的析构函数,这使得呼叫以释放GPU存储器释放GPU存储器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(); 
} 

回答

0

没有GpuArray构造这是一个有点难以分不清什么是错的。

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

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

    //... 
} 

您unwraping一个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); 
} 

我没有测试代码,但它理论上应该工作