fix(tsan): guard emitEvent against the worker-thread data race (#66)

This commit is contained in:
Gabriel Cruz
2026-06-25 14:59:06 -03:00
committed by GitHub
parent de87823523
commit fd8b4e4d82
4 changed files with 24 additions and 2 deletions
+15 -2
View File
@@ -38,10 +38,21 @@ void Libp2pModuleImpl::promiseBufferCallback(int ret, const uint8_t* data, size_
delete p;
}
void Libp2pModuleImpl::publishEmitEvent() {
std::unique_lock<std::shared_mutex> lock(m_emitEventLock);
m_emitEventSnapshot = emitEvent;
}
void Libp2pModuleImpl::emitEventSafe(const std::string& name, const std::string& data) const {
if (emitEvent) {
emitEvent(name, data);
EmitEventFn fn;
{
std::shared_lock<std::shared_mutex> lock(m_emitEventLock);
fn = m_emitEventSnapshot;
}
if (!fn) {
return;
}
fn(name, data);
}
Libp2pModuleImpl::Libp2pModuleImpl(const Libp2pModuleOptions& options)
@@ -184,6 +195,7 @@ Libp2pModuleImpl::~Libp2pModuleImpl() {
}
StdLogosResult Libp2pModuleImpl::start() {
publishEmitEvent();
return callSync("Failed to start libp2p", [&](SyncPromise* p) {
return libp2p_start(ctx, &Libp2pModuleImpl::promiseCallback, p);
});
@@ -249,6 +261,7 @@ void Libp2pModuleImpl::eventCallback(int ret, const char* msg, size_t len, void*
bool Libp2pModuleImpl::setEventCallback() {
if (!ctx) return false;
publishEmitEvent();
libp2p_set_event_callback(ctx, &Libp2pModuleImpl::eventCallback, this);
return true;
}