aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEddy Pedroni <epedroni@pm.me>2025-07-24 18:59:30 +0200
committerEddy Pedroni <epedroni@pm.me>2025-07-24 18:59:30 +0200
commit5f93cc8a653e47dd8c426101567f2b91c4e3482d (patch)
treef64a300f1811f847b016515759be79da6fed8d43
parent8d3dfa11baa8b2be32e0a9d31575469e1a7037b8 (diff)
Fix race condition, check port before sending message
-rw-r--r--daemon/src/device_connection.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/daemon/src/device_connection.h b/daemon/src/device_connection.h
index 58ddd7f..5f2b051 100644
--- a/daemon/src/device_connection.h
+++ b/daemon/src/device_connection.h
@@ -7,6 +7,7 @@
#include <rtmidi/RtMidi.h>
#include <string>
+#include <mutex>
namespace midi_router
{
@@ -27,11 +28,13 @@ struct Device_Connection : public Sender
Submitter & submitter;
RtMidiIn midi_in {};
RtMidiOut midi_out {};
+ std::mutex mutex {};
void
send(std::vector<std::uint8_t> const & payload) override
{
- midi_out.sendMessage(&payload);
+ const std::lock_guard<std::mutex> lock(mutex);
+ if (midi_out.isPortOpen()) midi_out.sendMessage(&payload);
}
std::string
@@ -43,6 +46,7 @@ struct Device_Connection : public Sender
void
connect(std::size_t port)
{
+ const std::lock_guard<std::mutex> lock(mutex);
if (!midi_in.isPortOpen()) midi_in.openPort(port);
if (!midi_out.isPortOpen()) midi_out.openPort(port);
}
@@ -50,6 +54,7 @@ struct Device_Connection : public Sender
void
disconnect()
{
+ const std::lock_guard<std::mutex> lock(mutex);
if (midi_in.isPortOpen()) midi_in.closePort();
if (midi_out.isPortOpen()) midi_out.closePort();
}