Skip to content

Commit

Permalink
Investigating Windows failures...
Browse files Browse the repository at this point in the history
  • Loading branch information
addaleax committed Apr 23, 2020
1 parent e9792ee commit 92c5830
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 10 deletions.
5 changes: 3 additions & 2 deletions appveyor.yml
Expand Up @@ -5,11 +5,11 @@ environment:
# Test against these versions of Node.js and io.js
matrix:
# node.js
- nodejs_version: "10"
#- nodejs_version: "10"
- nodejs_version: "12"

platform:
- x86
#- x86
- x64

# Install scripts. (runs after repo cloning)
Expand All @@ -27,6 +27,7 @@ test_script:
- node --version
- npm --version
# run tests
- node -e "require('./')"
- npm test

after_test:
Expand Down
3 changes: 3 additions & 0 deletions lib/ref.js
Expand Up @@ -1217,7 +1217,9 @@ exports.NULL.type = exports.types.void;
* @type Buffer
*/

process._rawDebug('+ NULL_POINTER');
exports.NULL_POINTER = exports.ref(exports.NULL);
process._rawDebug('- NULL_POINTER');

/**
* All these '...' comment blocks below are for the documentation generator.
Expand Down Expand Up @@ -1470,3 +1472,4 @@ function overwriteInspect (inspect) {
}
}
}
process._rawDebug('loaded');
90 changes: 82 additions & 8 deletions src/binding.cc
Expand Up @@ -26,29 +26,50 @@ namespace {

napi_status napix_set_instance_data(
napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint) {
fprintf(stderr, "+ napix_set_instance_data(%p)\n", data);
fflush(stderr);
typedef napi_status (*napi_set_instance_data_fn)(
napi_env env, void* data, napi_finalize finalize_cb, void* finalize_hint);
static const napi_set_instance_data_fn napi_set_instance_data__ =
(napi_set_instance_data_fn)
get_symbol_from_current_process("napi_set_instance_data");
/*static */napi_set_instance_data_fn napi_set_instance_data__ = nullptr;

if (napi_set_instance_data__ == nullptr)
// assert(handle != NULL);
napi_set_instance_data__= (napi_set_instance_data_fn)get_symbol_from_current_process("napi_set_instance_data");

fprintf(stderr, "napi_set_instance_data__ = %p\n", (void*)napi_set_instance_data__);
fflush(stderr);

if (napi_set_instance_data__ == nullptr) {
fprintf(stderr, "- napix_set_instance_data(), generic failures\n");
return napi_generic_failure;
return napi_set_instance_data__(env, data, finalize_cb, finalize_hint);
}
auto ret = napi_set_instance_data__(env, data, finalize_cb, finalize_hint);
fprintf(stderr, "- napix_set_instance_data(), status = %d\n", (int)ret);
fflush(stderr);
return ret;
}

napi_status napix_get_instance_data(
napi_env env, void** data) {
fprintf(stderr, "+ napix_get_instance_data()\n");
fflush(stderr);
typedef napi_status (*napi_get_instance_data_fn)(
napi_env env, void** data);
static const napi_get_instance_data_fn napi_get_instance_data__ =
/*static */const napi_get_instance_data_fn napi_get_instance_data__ =
(napi_get_instance_data_fn)
get_symbol_from_current_process("napi_get_instance_data");
fprintf(stderr, "napi_get_instance_data__ = %p\n", (void*)napi_get_instance_data__);
fflush(stderr);

*data = nullptr;
if (napi_get_instance_data__ == nullptr)
if (napi_get_instance_data__ == nullptr) {
fprintf(stderr, "- napix_get_instance_data(), generic failures\n");
fflush(stderr);
return napi_generic_failure;
return napi_get_instance_data__(env, data);
}
auto ret = napi_get_instance_data__(env, data);
fprintf(stderr, "- napix_get_instance_data(), status = %d, ptr = %p\n", (int)ret, (void*)*data);
fflush(stderr);
return ret;
}

// used by the Int64 functions to determine whether to return a Number
Expand All @@ -67,6 +88,18 @@ static const size_t kMaxLength = 0x3fffffff;
class InstanceData final : public RefNapi::Instance {
public:
InstanceData(Env env) : env(env) {}
~InstanceData() {
fprintf(stderr, "+ ~InstanceData()\n");
fflush(stderr);
fprintf(stderr, "pointer_to_orig_buffer.size() = %zu\n", pointer_to_orig_buffer.size());
fflush(stderr);
pointer_to_orig_buffer.clear();
fprintf(stderr, "resetting buffer_from\n");
fflush(stderr);
buffer_from.Reset();
fprintf(stderr, "- ~InstanceData()\n");
fflush(stderr);
}

struct ArrayBufferEntry {
Reference<ArrayBuffer> ab;
Expand All @@ -81,6 +114,8 @@ class InstanceData final : public RefNapi::Instance {
ArrayBuffer buf(env, val);
char* ptr = static_cast<char*>(buf.Data());
if (ptr == nullptr) return;
fprintf(stderr, "Registering pointer %p\n", ptr);
fflush(stderr);

auto it = pointer_to_orig_buffer.find(ptr);
if (it != pointer_to_orig_buffer.end()) {
Expand All @@ -97,7 +132,11 @@ class InstanceData final : public RefNapi::Instance {
});
}

fprintf(stderr, "Adding finalizer for pointer %p\n", ptr);
fflush(stderr);
buf.AddFinalizer([this](Env env, char* ptr) {
fprintf(stderr, "Calling finalizer for pointer %p\n", ptr);
fflush(stderr);
auto it = pointer_to_orig_buffer.find(ptr);
if (--it->second.finalizer_count == 0)
pointer_to_orig_buffer.erase(it);
Expand Down Expand Up @@ -136,26 +175,36 @@ class InstanceData final : public RefNapi::Instance {
*/

Value WrapPointer(Env env, char* ptr, size_t length) {
fprintf(stderr, "+ WrapPointer(%p)\n", (void*)ptr);
fflush(stderr);
if (ptr == nullptr)
length = 0;

InstanceData* data;
if (ptr != nullptr && (data = InstanceData::Get(env)) != nullptr) {
ArrayBuffer ab = data->LookupOrCreateArrayBuffer(ptr, length);
assert(!ab.IsEmpty());
fprintf(stderr, "- WrapPointer(%p) using Buffer.from()\n", (void*)ptr);
fflush(stderr);
return data->buffer_from.Call({
ab, Number::New(env, 0), Number::New(env, length)
});
}

fprintf(stderr, "- WrapPointer(%p) using Buffer::New\n", (void*)ptr);
fflush(stderr);
return Buffer<char>::New(env, ptr, length, [](Env,char*){});
}

char* GetBufferData(Value val) {
fprintf(stderr, "+ GetBufferData()\n");
fflush(stderr);
Buffer<char> buf = val.As<Buffer<char>>();
InstanceData* data = InstanceData::Get(val.Env());
if (data != nullptr)
data->RegisterArrayBuffer(buf.ArrayBuffer());
fprintf(stderr, "- GetBufferData() = %p\n", (char*)buf.Data());
fflush(stderr);
return buf.Data();
}

Expand Down Expand Up @@ -553,22 +602,44 @@ Value ReinterpretBufferUntilZeros(const CallbackInfo& args) {
} // anonymous namespace

Object Init(Env env, Object exports) {
fprintf(stderr, "+ Init()\n");
fflush(stderr);
InstanceData* data = new InstanceData(env);
fprintf(stderr, "data created\n");
fflush(stderr);
{
Value buffer_ctor = env.Global()["Buffer"];
Value buffer_from = buffer_ctor.As<Object>()["from"];
data->buffer_from.Reset(buffer_from.As<Function>(), 1);
fprintf(stderr, "Set Buffer.from()\n");
fflush(stderr);
assert(!data->buffer_from.IsEmpty());
fprintf(stderr, "Setting instance data\n");
fflush(stderr);
napi_status status = napix_set_instance_data(
env, data, [](napi_env env, void* data, void* hint) {
fprintf(stderr, "+ Deleting InstanceData\n");
fflush(stderr);
delete static_cast<InstanceData*>(data);
fprintf(stderr, "- Deleted InstanceData\n");
fflush(stderr);
}, nullptr);
fprintf(stderr, "Done, status = %d\n", (int)status);
fflush(stderr);
if (status != napi_ok) {
fprintf(stderr, "Deleting instance data\n");
fflush(stderr);
delete data;
fprintf(stderr, "Deleted instance data\n");
fflush(stderr);
data = nullptr;
}
}
fprintf(stderr, "Storing as external\n");
fflush(stderr);
exports["instance"] = External<RefNapi::Instance>::New(env, data);
fprintf(stderr, "Begin regular Init()\n");
fflush(stderr);

// "sizeof" map
Object smap = Object::New(env);
Expand Down Expand Up @@ -651,6 +722,9 @@ Object Init(Env env, Object exports) {
exports["readCString"] = Function::New(env, ReadCString);
exports["reinterpret"] = Function::New(env, ReinterpretBuffer);
exports["reinterpretUntilZeros"] = Function::New(env, ReinterpretBufferUntilZeros);

fprintf(stderr, "- Init()\n");
fflush(stderr);
return exports;
}

Expand Down

0 comments on commit 92c5830

Please sign in to comment.