summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-02-11 01:26:07 +0000
committerDavid Robillard <d@drobilla.net>2007-02-11 01:26:07 +0000
commit5dac076bbe695e76060811e4c767ed9d1b832cb6 (patch)
tree7e45370b9a0a52b162ab66991f7d488381485b32
parentb80a8528382b0ee4b80faa4acb14a763a9bd4a44 (diff)
downloadraul-5dac076bbe695e76060811e4c767ed9d1b832cb6.tar.gz
raul-5dac076bbe695e76060811e4c767ed9d1b832cb6.tar.bz2
raul-5dac076bbe695e76060811e4c767ed9d1b832cb6.zip
Moved Maid from Ingen to Raul.
Working machina MIDI learn, fixes, etc, etc. git-svn-id: http://svn.drobilla.net/lad/raul@302 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--raul/JackDriver.h5
-rw-r--r--raul/Maid.h76
-rw-r--r--raul/Makefile.am3
-rw-r--r--src/Maid.cpp74
-rw-r--r--src/Makefile.am3
5 files changed, 157 insertions, 4 deletions
diff --git a/raul/JackDriver.h b/raul/JackDriver.h
index 512bce7..e7aa30a 100644
--- a/raul/JackDriver.h
+++ b/raul/JackDriver.h
@@ -86,6 +86,9 @@ protected:
virtual void on_shutdown() {}
virtual void on_error() {}
+protected:
+ jack_client_t* _client;
+
private:
static void error_cb(const char* msg);
@@ -102,8 +105,6 @@ private:
static void jack_shutdown_cb(void* me);
- jack_client_t* _client;
-
bool _is_activated;
jack_position_t _last_pos;
jack_nframes_t _buffer_size;
diff --git a/raul/Maid.h b/raul/Maid.h
new file mode 100644
index 0000000..f8f6c29
--- /dev/null
+++ b/raul/Maid.h
@@ -0,0 +1,76 @@
+/* This file is part of Raul.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Raul 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.
+ *
+ * Raul 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 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.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef RAUL_MAID_H
+#define RAUL_MAID_H
+
+#include <boost/utility.hpp>
+#include "raul/SharedPtr.h"
+#include "raul/SRSWQueue.h"
+#include "raul/Deletable.h"
+#include "raul/List.h"
+
+namespace Raul {
+
+
+/** Explicitly driven garbage collector.
+ *
+ * This is used by realtime threads to allow hard realtime deletion of objects
+ * (push() is realtime safe).
+ *
+ * You can also manage a SharedPtr, so cleanup() will delete it when all
+ * references are dropped (except the one held by the Maid itself).
+ * This allows using a SharedPtr freely in hard realtime threads without having
+ * to worry about deletion accidentally occuring in the realtime thread.
+ *
+ * cleanup() should be called periodically to free memory, often enough to
+ * prevent the queue from overflowing. This is probably best done by the main
+ * thread to avoid the overhead of having a thread just to delete things.
+ *
+ * \ingroup raul
+ */
+class Maid : boost::noncopyable
+{
+public:
+ Maid(size_t size);
+ ~Maid();
+
+ /** Push a raw pointer to be deleted when cleanup() is called next.
+ * Realtime safe.
+ */
+ inline void push(Raul::Deletable* obj) {
+ if (obj)
+ _objects.push(obj);
+ }
+
+ void manage(SharedPtr<Raul::Deletable> ptr);
+
+ void cleanup();
+
+private:
+ typedef Raul::SRSWQueue<Raul::Deletable*> Objects;
+ typedef Raul::List<SharedPtr<Raul::Deletable> > Managed;
+
+ Objects _objects;
+ Managed _managed;
+};
+
+
+} // namespace Raul
+
+#endif // RAUL_MAID_H
+
diff --git a/raul/Makefile.am b/raul/Makefile.am
index 72ab43f..12abee0 100644
--- a/raul/Makefile.am
+++ b/raul/Makefile.am
@@ -19,7 +19,8 @@ raulinclude_HEADERS = \
AtomicInt.h \
Deletable.h \
List.h \
- Array.h
+ Array.h \
+ Maid.h
if WITH_LIBLO
raulinclude_HEADERS += AtomLiblo.h
diff --git a/src/Maid.cpp b/src/Maid.cpp
new file mode 100644
index 0000000..ec1e837
--- /dev/null
+++ b/src/Maid.cpp
@@ -0,0 +1,74 @@
+/* This file is part of Raul.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Raul 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.
+ *
+ * Raul 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 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.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "raul/Maid.h"
+#include "raul/Deletable.h"
+
+namespace Raul {
+
+
+Maid::Maid(size_t size)
+: _objects(size)
+{
+}
+
+
+Maid::~Maid()
+{
+ cleanup();
+}
+
+/** Manage a SharedPtr.
+ * NOT realtime safe.
+ *
+ * @ptr is guaranteed to be deleted in the context that calls cleanup()
+ */
+void
+Maid::manage(SharedPtr<Raul::Deletable> ptr)
+{
+ if (ptr)
+ _managed.push_back(new Raul::ListNode<SharedPtr<Raul::Deletable> >(ptr));
+}
+
+
+/** Free all the objects in the queue (passed by push()).
+ */
+void
+Maid::cleanup()
+{
+ Raul::Deletable* obj = NULL;
+
+ while (!_objects.empty()) {
+ obj = _objects.front();
+ _objects.pop();
+ delete obj;
+ }
+
+ for (Managed::iterator i = _managed.begin(); i != _managed.end() ; ) {
+ Managed::iterator next = i;
+ ++next;
+
+ if ((*i).unique())
+ _managed.erase(i);
+
+ i = next;
+ }
+
+}
+
+
+} // namespace Raul
diff --git a/src/Makefile.am b/src/Makefile.am
index aa0b2c8..81370f4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,7 +6,8 @@ lib_LTLIBRARIES = libraul.la
libraul_la_SOURCES = \
Thread.cpp \
Path.cpp \
- Namespaces.cpp
+ Namespaces.cpp \
+ Maid.cpp
if WITH_RAPTOR
libraul_la_SOURCES += RDFWriter.cpp