mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 15:25:01 +01:00
Add PBD::GlibSemaphore class that uses PBD::atomic_counter etc.
PBD::Semaphore can really be used instead of this class now, but it didn't exist when I needed this class and it is header only, which causes some problems because windows.h is included
This commit is contained in:
parent
57f3ba6a1f
commit
29f178aa4b
3 changed files with 125 additions and 0 deletions
68
libs/pbd/glib_semaphore.cc
Normal file
68
libs/pbd/glib_semaphore.cc
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 Tim Mayberry
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pbd/glib_semaphore.h"
|
||||||
|
|
||||||
|
namespace PBD {
|
||||||
|
|
||||||
|
GlibSemaphore::GlibSemaphore (gint initial_val)
|
||||||
|
:
|
||||||
|
m_counter(initial_val)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void
|
||||||
|
GlibSemaphore::wait ()
|
||||||
|
{
|
||||||
|
Glib::Threads::Mutex::Lock guard (m_mutex);
|
||||||
|
|
||||||
|
while (m_counter.get() < 1) {
|
||||||
|
m_cond.wait(m_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// this shouldn't need to be inside the lock
|
||||||
|
--m_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
GlibSemaphore::try_wait ()
|
||||||
|
{
|
||||||
|
if (!m_mutex.trylock())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// lock successful
|
||||||
|
while (m_counter.get() < 1) {
|
||||||
|
m_cond.wait(m_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// the order of these should not matter
|
||||||
|
--m_counter;
|
||||||
|
m_mutex.unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GlibSemaphore::post ()
|
||||||
|
{
|
||||||
|
// atomic, no locking required
|
||||||
|
++m_counter;
|
||||||
|
m_cond.signal();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace PBD
|
||||||
56
libs/pbd/pbd/glib_semaphore.h
Normal file
56
libs/pbd/pbd/glib_semaphore.h
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2010 Tim Mayberry
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PBD_GLIB_SEMAPHORE_H
|
||||||
|
#define PBD_GLIB_SEMAPHORE_H
|
||||||
|
|
||||||
|
#include <glibmm/threads.h>
|
||||||
|
|
||||||
|
#include "atomic_counter.h"
|
||||||
|
|
||||||
|
namespace PBD {
|
||||||
|
|
||||||
|
class GlibSemaphore
|
||||||
|
{
|
||||||
|
|
||||||
|
// prevent copying and assignment
|
||||||
|
GlibSemaphore(const GlibSemaphore& sema);
|
||||||
|
GlibSemaphore& operator= (const GlibSemaphore& sema);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
GlibSemaphore (gint initial_val = 1);
|
||||||
|
|
||||||
|
void wait ();
|
||||||
|
|
||||||
|
bool try_wait ();
|
||||||
|
|
||||||
|
void post ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
atomic_counter m_counter;
|
||||||
|
Glib::Threads::Cond m_cond;
|
||||||
|
Glib::Threads::Mutex m_mutex;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace PBD
|
||||||
|
|
||||||
|
#endif // PBD_SEMAPHORE_H
|
||||||
|
|
@ -49,6 +49,7 @@ libpbd_sources = [
|
||||||
'file_manager.cc',
|
'file_manager.cc',
|
||||||
'file_utils.cc',
|
'file_utils.cc',
|
||||||
'fpu.cc',
|
'fpu.cc',
|
||||||
|
'glib_semaphore.cc',
|
||||||
'id.cc',
|
'id.cc',
|
||||||
'locale_guard.cc',
|
'locale_guard.cc',
|
||||||
'malign.cc',
|
'malign.cc',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue