]> git.sesse.net Git - nageru/commitdiff
Fix a MIDI-related deadlock in the GUI code.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 9 Mar 2019 20:33:16 +0000 (21:33 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 9 Mar 2019 20:33:16 +0000 (21:33 +0100)
shared/midi_device.cpp
shared/midi_device.h

index e4b1a116e17a27ecff7b7768d6e19fa7cf3fcdfb..9d77e218f5078f37b5aa3eeba8c9bb87d84a8226 100644 (file)
@@ -73,7 +73,7 @@ void MIDIDevice::thread_func()
 
        // The sequencer object is now ready to be used from other threads.
        {
-               lock_guard<mutex> lock(mu);
+               lock_guard<recursive_mutex> lock(mu);
                alsa_seq = seq;
                alsa_queue_id = queue_id;
        }
@@ -97,7 +97,7 @@ void MIDIDevice::thread_func()
                while (snd_seq_query_next_port(seq, pinfo) >= 0) {
                        constexpr int mask = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ;
                        if ((snd_seq_port_info_get_capability(pinfo) & mask) == mask) {
-                               lock_guard<mutex> lock(mu);
+                               lock_guard<recursive_mutex> lock(mu);
                                subscribe_to_port_lock_held(seq, *snd_seq_port_info_get_addr(pinfo));
                        }
                }
@@ -154,7 +154,7 @@ void MIDIDevice::handle_event(snd_seq_t *seq, snd_seq_event_t *event)
                return;
        }
 
-       lock_guard<mutex> lock(mu);
+       lock_guard<recursive_mutex> lock(mu);
        switch (event->type) {
        case SND_SEQ_EVENT_CONTROLLER: {
                receiver->controller_received(event->data.control.param, event->data.control.value);
index a9f33d65c6516d835d909f3fa2407fa200b115c6..ec6bf9b5a160b5ededf14600744435a96ef0e951 100644 (file)
@@ -47,7 +47,7 @@ public:
 
        void update_lights(const std::map<LightKey, uint8_t> &active_lights)
        {
-               std::lock_guard<std::mutex> lock(mu);
+               std::lock_guard<std::recursive_mutex> lock(mu);
                update_lights_lock_held(active_lights);
        }
 
@@ -60,7 +60,7 @@ private:
        std::atomic<bool> should_quit{false};
        int should_quit_fd;
 
-       mutable std::mutex mu;
+       mutable std::recursive_mutex mu;  // Recursive because the MIDI receiver may update_lights() back while we are sending it stuff.
        MIDIReceiver *receiver;  // Under <mu>.
 
        std::thread midi_thread;