Fix deadlock issues.
authorDavid Robillard <d@drobilla.net>
Mon, 16 Feb 2009 04:39:34 +0000 (04:39 +0000)
committerDavid Robillard <d@drobilla.net>
Mon, 16 Feb 2009 04:39:34 +0000 (04:39 +0000)
Add IdentityConverter for when no conversion is actually needed.

git-svn-id: svn://localhost/ardour2/branches/3.0@4595 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/evoral/evoral/TimeConverter.hpp
libs/evoral/src/Sequence.cpp

index 3f434d9dd7f2f4f20316bfafa67659caaa150d58..eabe0e47621894950d45ef410c3d2426492fd029 100644 (file)
@@ -38,6 +38,15 @@ public:
        virtual A from(B b) const = 0;
 };
 
+
+/** A stub TimeConverter that simple statically casts between types. */
+template<typename A, typename B>
+class IdentityConverter : public TimeConverter<A,B> {
+       B to(A a)   const { return static_cast<B>(a); }
+       A from(B b) const { return static_cast<A>(b); }
+};
+
+
 } // namespace Evoral
 
 #endif // EVORAL_TIME_CONVERTER_HPP
index ac0ca231f19b5479c2fed3de82b1827fae88b060..d11988e70c58798e6f285cc3d4de1ee85d91bca8 100644 (file)
@@ -191,12 +191,10 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
 
        if (!_event || _event->size() == 0) {
                DUMP(format("Starting at end @ %1%\n") % t);
-               _is_end = true;
                _type   = NIL;
-               if (_locked) {
-                       _seq->read_unlock();
-                       _locked = false;
-               }
+               _is_end = true;
+               _locked = false;
+               _seq->read_unlock();
        } else {
                DUMP(format("New iterator = %1% : %2% @ %3%\n")
                                % (int)_event->event_type()
@@ -371,6 +369,8 @@ Sequence<Time>::const_iterator::operator=(const const_iterator& other)
                if (other._locked) {
                   other._seq->read_lock();
                }
+       } else if (!_locked && other._locked) {
+               _seq->read_lock();
        }
 
        _seq           = other._seq;
@@ -582,6 +582,7 @@ Sequence<Time>::append(const Event<Time>& event)
 
        if (!midi_event_is_valid(ev.buffer(), ev.size())) {
                cerr << "WARNING: Sequence ignoring illegal MIDI event" << endl;
+               write_unlock();
                return;
        }