调用 Napi::ThreadSafeFunction::Release() 导致 ELIFECYCLE 3221225477 (STATUS_ACCESS_VIOLATION)
calling Napi::ThreadSafeFunction::Release() results in ELIFECYCLE 3221225477 (STATUS_ACCESS_VIOLATION)
标题中提到我有一些奇怪的线程问题。
基本上我像链接示例中那样包装 PS2000 Api with node-addon-api。
由于那些 api 回调需要 "C" 之类的函数,所以我用类似的东西对它们进行了 trampolined:
CLASSNAME *trampoline[N] = {}
template<int I>f(...){
trampoline[I]->tsfn.BlockingCall(&args, [](..., *args){
//do stuff
if(trampoline->calledCallbacksCount >= trampoline->estimatedCallbackCount){
trampoline->tsfn.Release();
}
})
}
CALLBACK *fptr[N] = {
f<0>, ..., f<N>
}
CLASSNAME::CLASSNAME(){
trampoline[nextEmptyIndex] = this;
this->callback = fptr[nextEmtyIndex];
}
CLASSNAME::read(){
this->tsfn = Napi::ThreadSafeFunction::New(...)
//...
nativethread = std::thread([this]{
//... start device stream & wait some time
if(ps2000_get_streaming_last_values(this->deviceHandle, this->callback) == 0){
// no callback
}
if(this->calledCallbacksCount >= this->estimatedCallbackCount){
this->tsfn.Release();
}
}
}
(
short **overviewBuffers,
short overflow,
unsigned long triggeredAt,
short triggered,
short auto_stop,
unsigned long nValues
)
api函数ps2000_get_streaming_last_values
可以多次调用回调,回调的次数可以根据**overviewBuffers
的长度来估算(nValues
)。
当我省略tsfn.Release()
时没有错误。
也returnsnapi_ok
使用时
感觉好像有某种迟到的空回调——但只有当线程被释放时...
我很茫然 - 有人有想法吗?
等等!
传入 jsCallback.Call({Napi::ArrayBuffer::New(env, *buffer, size)})
的 memcpied *buffers
会发生什么
这是访问冲突吗?你如何在不释放 tsfn 的情况下解决这个问题?
我正在 Windows VSCODE,
我的启动 json 包含:
{
"name": "Debug",
"type": "cppvsdbg",
"request": "launch",
"program": "node",
"args": ["index.ts"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false
}
但是调试器没有触发...
问题与节点插件api无关。
这是由 picoscope 设备由于延迟或 w/e 最终导致 nValues > OverviewBufferSize
导致将这些缓冲区复制到超出范围的访问而导致的 nValues > OverviewBufferSize
引起的缓冲区溢出,从而访问违规。
只需处理这些情况并扩大缓冲区大小即可解决此问题。
标题中提到我有一些奇怪的线程问题。
基本上我像链接示例中那样包装 PS2000 Api with node-addon-api。
由于那些 api 回调需要 "C" 之类的函数,所以我用类似的东西对它们进行了 trampolined:
CLASSNAME *trampoline[N] = {}
template<int I>f(...){
trampoline[I]->tsfn.BlockingCall(&args, [](..., *args){
//do stuff
if(trampoline->calledCallbacksCount >= trampoline->estimatedCallbackCount){
trampoline->tsfn.Release();
}
})
}
CALLBACK *fptr[N] = {
f<0>, ..., f<N>
}
CLASSNAME::CLASSNAME(){
trampoline[nextEmptyIndex] = this;
this->callback = fptr[nextEmtyIndex];
}
CLASSNAME::read(){
this->tsfn = Napi::ThreadSafeFunction::New(...)
//...
nativethread = std::thread([this]{
//... start device stream & wait some time
if(ps2000_get_streaming_last_values(this->deviceHandle, this->callback) == 0){
// no callback
}
if(this->calledCallbacksCount >= this->estimatedCallbackCount){
this->tsfn.Release();
}
}
}
(
short **overviewBuffers,
short overflow,
unsigned long triggeredAt,
short triggered,
short auto_stop,
unsigned long nValues
)
api函数ps2000_get_streaming_last_values
可以多次调用回调,回调的次数可以根据**overviewBuffers
的长度来估算(nValues
)。
当我省略tsfn.Release()
时没有错误。
也returnsnapi_ok
使用时
感觉好像有某种迟到的空回调——但只有当线程被释放时...
我很茫然 - 有人有想法吗?
等等!
传入 jsCallback.Call({Napi::ArrayBuffer::New(env, *buffer, size)})
*buffers
会发生什么
这是访问冲突吗?你如何在不释放 tsfn 的情况下解决这个问题?
我正在 Windows VSCODE,
我的启动 json 包含:
{
"name": "Debug",
"type": "cppvsdbg",
"request": "launch",
"program": "node",
"args": ["index.ts"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false
}
但是调试器没有触发...
问题与节点插件api无关。
这是由 picoscope 设备由于延迟或 w/e 最终导致 nValues > OverviewBufferSize
导致将这些缓冲区复制到超出范围的访问而导致的 nValues > OverviewBufferSize
引起的缓冲区溢出,从而访问违规。
只需处理这些情况并扩大缓冲区大小即可解决此问题。