内存映射文件的简单节点C插件崩溃节点

时间:2017-09-13 10:22:34

标签: c++ v8 mmap

我的目标是创建一个简单的插件,打开一个内存映射文件,并为缓冲区提供节点原始访问。内存映射文件已经存在,因此我不需要创建新文件 - 如果文件尚未创建(由另一个进程),则会抛出错误。

这是我到目前为止所做的:

#include <nan.h>
#include <windows.h>

using namespace v8;

void get_shm(const Nan::FunctionCallbackInfo <v8::Value> &info) {
    if (info.Length() != 1) {
        return Nan::ThrowTypeError("Wrong number of arguments. You must specify size of mapped file!");
    }

    if (!info[0]->IsNumber()) {
        return Nan::ThrowTypeError("Bad argument. Size of mapped file must be a number!");
    }

    int len = info[0]->Uint32Value();

    HANDLE h = OpenFileMappingA(FILE_MAP_WRITE | FILE_MAP_READ, 1, "Global\\_GB_SharedMemory_Read");
    if (h == NULL) {
        Nan::ThrowTypeError("Couldn't open memory mapped file");
    }

    char *buf = (char *) MapViewOfFile(h, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, len);

    Nan::MaybeLocal<Object> jsbuf = Nan::NewBuffer(buf, len);
    info.GetReturnValue().Set(jsbuf.ToLocalChecked());
}

void Init(v8::Local <v8::Object> exports) {
    exports->Set(Nan::New("get_shm").ToLocalChecked(), 
       Nan::New<v8::FunctionTemplate>(get_shm)->GetFunction());
}

NODE_MODULE(addon_shm, Init)

不幸的是,在返回NewBuffer之后的某个时刻节点崩溃(可能是由于访问冲突)。它不会立即崩溃,但会在一些不可预测的时间后崩溃。

我没有尝试在Javascript中从缓冲区读取/写入。使用add的唯一一行是:

const buf=shm.get_shm(10);

其他进程创建的映射文件大于10。

如果我使用malloc创建缓冲区,则不会出现问题。

如果我只调用get_shm(10)而不存储结果,则不会出现问题。

努力理解这个问题......

0 个答案:

没有答案