slackbuilds/audio/seq24/01-mutex.patch

332 lines
7.3 KiB
Diff

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 <jcowgill@debian.org>
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 <alsa/seq_midi_event.h>
#endif
+#include <mutex>
#include <string>
#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 <mutex>
#include <string>
#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 <pthread.h>
-
-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<std::mutex> 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<std::mutex> 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 <pthread.h>
+#include <condition_variable>
+#include <mutex>
+
/* 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<unsigned int,long> 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 <string>
#include <list>
#include <stack>
+#include <mutex>
#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;