Description: Use standard mutex and condition variable classes Use std::recursive_mutex and std::condition_variable instead of custom classes based on pthread. . Fixes FTBFS with recent GCC versions which defines the "mutex" class which conflicts with seq24's version of "mutex". Author: James Cowgill Bug: https://bugs.launchpad.net/seq24/+bug/1647614 Bug-Debian: https://bugs.debian.org/822394 --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ --- a/src/Module.am +++ b/src/Module.am @@ -31,8 +31,6 @@ bin_PROGRAMS = %D%/seq24 %D%/midibus_portmidi.h \ %D%/midifile.cpp \ %D%/midifile.h \ - %D%/mutex.cpp \ - %D%/mutex.h \ %D%/options.cpp \ %D%/options.h \ %D%/optionsfile.cpp \ --- a/src/midibus.h +++ b/src/midibus.h @@ -35,11 +35,11 @@ class midibus; # include #endif +#include #include #include "event.h" #include "sequence.h" -#include "mutex.h" #include "globals.h" const int c_midibus_output_size = 0x100000; @@ -90,7 +90,7 @@ class midibus /* locking */ - mutex m_mutex; + std::recursive_mutex m_mutex; /* mutex */ void lock(); @@ -208,7 +208,7 @@ class mastermidibus sequence *m_seq; /* locking */ - mutex m_mutex; + std::recursive_mutex m_mutex; /* mutex */ void lock(); --- a/src/midibus_portmidi.h +++ b/src/midibus_portmidi.h @@ -25,12 +25,12 @@ class mastermidibus; #ifdef __WIN32__ +#include #include #include "portmidi.h" #include "event.h" #include "sequence.h" -#include "mutex.h" #include "globals.h" const int c_midibus_output_size = 0x100000; @@ -65,7 +65,7 @@ class midibus long m_lasttick; /* locking */ - mutex m_mutex; + std::recursive_mutex m_mutex; /* mutex */ void lock(); @@ -164,7 +164,7 @@ class mastermidibus sequence *m_seq; /* locking */ - mutex m_mutex; + std::recursive_mutex m_mutex; /* mutex */ void lock(); --- a/src/mutex.cpp +++ /dev/null @@ -1,62 +0,0 @@ -//---------------------------------------------------------------------------- -// -// This file is part of seq24. -// -// seq24 is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// seq24 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with seq24; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -//----------------------------------------------------------------------------- - -#include "mutex.h" - -const pthread_mutex_t mutex::recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; -const pthread_cond_t condition_var::cond = PTHREAD_COND_INITIALIZER; - -mutex::mutex( ) -{ - m_mutex_lock = recmutex; -} - -void -mutex::lock( ) -{ - pthread_mutex_lock( &m_mutex_lock ); -} - - -void -mutex::unlock( ) -{ - pthread_mutex_unlock( &m_mutex_lock ); -} - -condition_var::condition_var( ) -{ - m_cond = cond; -} - - -void -condition_var::signal( ) -{ - pthread_cond_signal( &m_cond ); -} - -void -condition_var::wait( ) -{ - pthread_cond_wait( &m_cond, &m_mutex_lock ); -} - - --- a/src/mutex.h +++ /dev/null @@ -1,63 +0,0 @@ -//---------------------------------------------------------------------------- -// -// This file is part of seq24. -// -// seq24 is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// seq24 is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with seq24; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -//----------------------------------------------------------------------------- - -#pragma once - -#include "globals.h" - -#include - -class mutex { - -private: - - static const pthread_mutex_t recmutex; - -protected: - - /* mutex lock */ - pthread_mutex_t m_mutex_lock; - -public: - - mutex(); - - void lock(); - void unlock(); - -}; - -class condition_var : public mutex { - -private: - - static const pthread_cond_t cond; - - pthread_cond_t m_cond; - -public: - - condition_var(); - - void wait(); - void signal(); - -}; - --- a/src/perform.cpp +++ b/src/perform.cpp @@ -426,7 +426,7 @@ perform::~perform() m_outputing = false; m_running = false; - m_condition_var.signal(); + m_condition_var.notify_one(); if (m_out_thread_launched ) pthread_join( m_out_thread, NULL ); @@ -1005,7 +1005,7 @@ void perform::stop() void perform::inner_start(bool a_state) { - m_condition_var.lock(); + std::lock_guard lock(m_mutex); if (!is_running()) { @@ -1015,10 +1015,8 @@ void perform::inner_start(bool a_state) off_sequences(); set_running(true); - m_condition_var.signal(); + m_condition_var.notify_one(); } - - m_condition_var.unlock(); } @@ -1262,18 +1260,18 @@ void perform::output_func() //printf ("waiting for signal\n"); - m_condition_var.lock(); + std::unique_lock lock(m_mutex); while (!m_running) { - m_condition_var.wait(); + m_condition_var.wait(lock); /* if stopping, then kill thread */ if (!m_outputing) break; } - m_condition_var.unlock(); + lock.unlock(); //printf( "signaled [%d]\n", m_playback_mode ); --- a/src/perform.h +++ b/src/perform.h @@ -32,6 +32,9 @@ class perform; #endif #include +#include +#include + /* if we have jack, include the jack headers */ #ifdef JACK_SUPPORT @@ -152,7 +155,8 @@ class perform int m_control_status; int m_screen_set; - condition_var m_condition_var; + std::condition_variable m_condition_var; + std::mutex m_mutex; // do not access these directly, use set/lookup below std::map key_events; --- a/src/perfroll.h +++ b/src/perfroll.h @@ -39,8 +39,6 @@ #include "globals.h" #include "perform.h" -#include "mutex.h" - using namespace Gtk; --- a/src/sequence.h +++ b/src/sequence.h @@ -26,11 +26,11 @@ class sequence; #include #include #include +#include #include "event.h" #include "midibus.h" #include "globals.h" -#include "mutex.h" enum draw_type { @@ -153,7 +153,7 @@ class sequence long m_rec_vol; /* locking */ - mutex m_mutex; + std::recursive_mutex m_mutex; /* used to idenfity which events are ours in the out queue */ //unsigned char m_tag;