Skip to content

Commit 056356f

Browse files
committed
Add getUserSharedBuffer callback finalizer to fix memory leak
1 parent 447c167 commit 056356f

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

src/env.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,8 +1125,8 @@ napi_value ExtendedEnv::getUserSharedBuffer(std::string key, napi_value default_
11251125
resolution = userSharedBuffers.emplace(key, user_shared_buffer).first;
11261126
}
11271127

1128+
napi_threadsafe_function callback = nullptr;
11281129
if (has_callback) {
1129-
napi_threadsafe_function callback;
11301130
napi_value resource;
11311131
napi_status status;
11321132
status = napi_create_object(env, &resource);
@@ -1138,11 +1138,38 @@ napi_value ExtendedEnv::getUserSharedBuffer(std::string key, napi_value default_
11381138
resolution->second.callbacks.push_back(callback);
11391139
}
11401140

1141+
// Create a struct to hold the callback info
1142+
struct CallbackInfo {
1143+
napi_threadsafe_function callback;
1144+
std::vector<napi_threadsafe_function>* callbacks;
1145+
};
1146+
1147+
auto* cb_info = new CallbackInfo{callback, &resolution->second.callbacks};
1148+
11411149
napi_value buffer_value;
1142-
napi_create_external_arraybuffer(env, resolution->second.buffer.mv_data, resolution->second.buffer.mv_size, nullptr, nullptr, &buffer_value);
1150+
napi_create_external_arraybuffer(
1151+
env,
1152+
resolution->second.buffer.mv_data,
1153+
resolution->second.buffer.mv_size,
1154+
// Finalizer callback
1155+
[](napi_env env, void* data, void* hint) {
1156+
auto* cb_info = static_cast<CallbackInfo*>(hint);
1157+
if (cb_info->callback) {
1158+
// Remove this callback from the vector
1159+
auto& callbacks = *cb_info->callbacks;
1160+
callbacks.erase(
1161+
std::remove(callbacks.begin(), callbacks.end(), cb_info->callback),
1162+
callbacks.end()
1163+
);
1164+
napi_release_threadsafe_function(cb_info->callback, napi_tsfn_release);
1165+
}
1166+
delete cb_info;
1167+
},
1168+
cb_info,
1169+
&buffer_value
1170+
);
11431171

11441172
pthread_mutex_unlock(&userBuffersLock);
1145-
11461173
return buffer_value;
11471174
}
11481175

0 commit comments

Comments
 (0)