View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0002140 | ardour | bugs | public | 2008-03-25 05:13 | 2020-04-19 20:13 |
| Reporter | hansfbaier | Assigned To | timbyr | ||
| Priority | normal | Severity | block | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Platform | Linux Ubuntu studio gutsy | OS | Linux | OS Version | 2.6.22-14-rt |
| Summary | 0002140: UI freezes after playback and modifying midi notes | ||||
| Description | After playback and moving the playhead to home any operations that modify the midi model would freeze the UI. | ||||
| Steps To Reproduce | <space> <space> <home> <create/resize/delete note> | ||||
| Additional Information | It seems to be a deadlock problem. Probably the playing code somehow fails to release its read lock so the write lock of the midi model operation waits forever. 30 __kernel_vsyscall() 0xffffe410 29 pthread_cond_wait@@GLIBC_2.3.2() 0xb6984676 28 g_static_rw_lock_writer_lock() 0xb757e587 27 Glib::StaticRWLock::writer_lock() /home/jack/src/ardour/libs/glibmm2/glib/glibmm/thread.cc:301 0xb750d0e3 26 ARDOUR::MidiModel::write_lock() /home/jack/src/ardour/libs/ardour/ardour/midi_model.h:61 0xb7d6e492 25 ARDOUR::MidiModel::DeltaCommand::operator() /home/jack/src/ardour/libs/ardour/midi_model.cc:583 0xb7d66a90 24 ARDOUR::MidiModel::apply_command() /home/jack/src/ardour/libs/ardour/midi_model.cc:538 0xb7d643c3 23 MidiRegionView::create_note_at() /home/jack/src/ardour/gtk2_ardour/midi_region_view.cc:377 0x086a8730 22 MidiRegionView::canvas_event() /home/jack/src/ardour/gtk2_ardour/midi_region_view.cc:332 0x086a9735 21 sigc::bound_mem_functor1<bool, MidiRegionView, _GdkEvent*>::operator() /home/jack/src/ardour/libs/sigc++2/sigc++/functors/mem_fun.h:1838 0x086ac039 20 sigc::adaptor_functor<sigc::bound_mem_functor1<bool, MidiRegionView, _GdkEvent*> >::operator()<_GdkEvent* const&>() /home/jack/src/ardour/libs/sigc++2/sigc++/adaptors/adaptor_trait.h:84 0x086ac059 19 sigc::internal::slot_call1<sigc::bound_mem_functor1<bool, MidiRegionView, _GdkEvent*>, bool, _GdkEvent*>::call_it() /home/jack/src/ardour/libs/sigc++2/sigc++/functors/slot.h:137 0x086ac07f 18 sigc::slot1<bool, _GdkEvent*>::operator() /home/jack/src/ardour/libs/sigc++2/sigc++/functors/slot.h:512 0xb6cb472b 17 (anonymous namespace)::Item_signal_event_callback() /home/jack/src/ardour/libs/libgnomecanvasmm/libgnomecanvasmm/item.cc:138 0xb691a8fa 16 gnome_canvas_marshal_BOOLEAN__BOXED() 0xb6970c10 15 g_closure_invoke() 0xb7609772 14 <symbol is not available> 0xb761a323 13 <symbol is not available> 0x08f82b40 12 <symbol is not available> 0xbf925e00 11 <symbol is not available> 0x00000002 10 <symbol is not available> 0xbf925dec 9 <symbol is not available> 0x08eede20 8 <symbol is not available> 0x08eeb014 7 <symbol is not available> 0xb7639678 6 <symbol is not available> 0x094151b0 5 <symbol is not available> 0xbf925de4 4 <symbol is not available> 0x00000175 3 <symbol is not available> 0xbf925e14 2 <symbol is not available> 0x094068b0 1 <symbol is not available> 0x00000000 | ||||
| Tags | No tags attached. | ||||
|
|
It definetely is a deadlock problem. With the debugger the mutexes read_counter is 1 and want_to_write is one. So there is a read lock that has not been released. |
|
2008-03-25 09:56
|
bugfix_unbalanced_locks_in_midi_model.diff (4,870 bytes)
Index: libs/ardour/midi_model.cc
===================================================================
--- libs/ardour/midi_model.cc (Revision 3179)
+++ libs/ardour/midi_model.cc (Arbeitskopie)
@@ -36,6 +36,34 @@
using namespace ARDOUR;
+void
+MidiModel::write_lock()
+{
+ _lock.writer_lock();
+ _automation_lock.lock();
+}
+
+void
+MidiModel::write_unlock()
+{
+ _lock.writer_unlock();
+ _automation_lock.unlock();
+}
+
+void
+MidiModel::read_lock() const
+{
+ _lock.reader_lock();
+ /*_automation_lock.lock();*/
+}
+
+void
+MidiModel::read_unlock() const
+{
+ _lock.reader_unlock();
+ /*_automation_lock.unlock();*/
+}
+
// Read iterator (const_iterator)
MidiModel::const_iterator::const_iterator(const MidiModel& model, double t)
@@ -106,18 +134,21 @@
if (_event.size() == 0) {
//cerr << "Created MIDI iterator @ " << t << " is at end." << endl;
_is_end = true;
- _model->read_unlock();
- _locked = false;
- } /*else {
+ if(_locked) {
+ _model->read_unlock();
+ _locked = false;
+ }
+ } else {
printf("MIDI Iterator = %X @ %lf\n", _event.type(), _event.time());
- }*/
+ }
}
MidiModel::const_iterator::~const_iterator()
{
- if (_locked)
+ if (_locked) {
_model->read_unlock();
+ }
}
@@ -182,22 +213,20 @@
type = CC;
if (type == NOTE_ON) {
- //cerr << "********** MIDI Iterator = note on" << endl;
+ cerr << "********** MIDI Iterator = note on" << endl;
_event = MIDI::Event((*_note_iter)->on_event(), false);
_active_notes.push(*_note_iter);
++_note_iter;
} else if (type == NOTE_OFF) {
- //cerr << "********** MIDI Iterator = note off" << endl;
+ cerr << "********** MIDI Iterator = note off" << endl;
_event = MIDI::Event(_active_notes.top()->off_event(), false);
_active_notes.pop();
} else if (type == CC) {
- //cerr << "********** MIDI Iterator = CC" << endl;
+ cerr << "********** MIDI Iterator = CC" << endl;
_model->control_to_midi_event(_event, *_control_iter);
} else {
- //cerr << "********** MIDI Iterator = END" << endl;
+ cerr << "********** MIDI Iterator = END" << endl;
_is_end = true;
- _model->read_unlock();
- _locked = false;
}
assert(_is_end || _event.size() > 0);
@@ -233,9 +262,6 @@
_control_iter = other._control_iter;
assert( ! _event.owns_buffer());
-
- if (_locked)
- _model->read_lock();
return *this;
}
@@ -265,16 +291,16 @@
size_t
MidiModel::read(MidiRingBuffer& dst, nframes_t start, nframes_t nframes, nframes_t stamp_offset) const
{
- //cerr << this << " MM::read @ " << start << " * " << nframes << " + " << stamp_offset << endl;
- //cerr << this << " MM # notes: " << n_notes() << endl;
+ cerr << this << " MM::read @ " << start << " * " << nframes << " + " << stamp_offset << endl;
+ cerr << this << " MM # notes: " << n_notes() << endl;
size_t read_events = 0;
if (start != _next_read) {
_read_iter = const_iterator(*this, (double)start);
- //cerr << "Repositioning iterator from " << _next_read << " to " << start << endl;
+ cerr << "Repositioning iterator from " << _next_read << " to " << start << endl;
} else {
- //cerr << "Using cached iterator at " << _next_read << endl;
+ cerr << "Using cached iterator at " << _next_read << endl;
}
_next_read = start + nframes;
@@ -282,11 +308,15 @@
while (_read_iter != end() && _read_iter->time() < start + nframes) {
assert(_read_iter->size() > 0);
dst.write(_read_iter->time() + stamp_offset, _read_iter->size(), _read_iter->buffer());
- //cerr << this << " MM::read event @ " << _read_iter->time() << endl;
+ cerr << this << " MM::read event @ " << _read_iter->time()
+ << "type: " << int(_read_iter->type())
+ << "note: " << int(_read_iter->note())
+ << "velocity: " << int(_read_iter->velocity())
+ << endl;
++_read_iter;
++read_events;
}
-
+
return read_events;
}
Index: libs/ardour/ardour/midi_model.h
===================================================================
--- libs/ardour/ardour/midi_model.h (Revision 3179)
+++ libs/ardour/ardour/midi_model.h (Arbeitskopie)
@@ -58,10 +58,10 @@
MidiModel(Session& s, size_t size=0);
// This is crap.
- void write_lock() { _lock.writer_lock(); _automation_lock.lock(); }
- void write_unlock() { _lock.writer_unlock(); _automation_lock.unlock(); }
- void read_lock() const { _lock.reader_lock(); /*_automation_lock.lock();*/ }
- void read_unlock() const { _lock.reader_unlock(); /*_automation_lock.unlock();*/ }
+ void write_lock();
+ void write_unlock();
+ void read_lock() const;
+ void read_unlock() const;
void clear() { _notes.clear(); }
@@ -164,7 +164,7 @@
friend class MidiModel;
const MidiModel* _model;
- MIDI::Event _event;
+ MIDI::Event _event;
typedef std::priority_queue<
boost::shared_ptr<Note>, std::deque< boost::shared_ptr<Note> >,
|
|
|
There were unbalanced locks in midi_model.cc. |
|
|
According to svn log this issue was fixed by reporter in branches/3.0@3211 |
|
|
Issue has been closed automatically, by Trigger Close Plugin. Feel free to re-open with additional information if you think the issue is not resolved. |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2008-03-25 05:13 | hansfbaier | New Issue | |
| 2008-03-25 05:17 | hansfbaier | Note Added: 0004812 | |
| 2008-03-25 09:56 | hansfbaier | File Added: bugfix_unbalanced_locks_in_midi_model.diff | |
| 2008-03-25 10:00 | hansfbaier | Note Added: 0004814 | |
| 2008-04-14 12:47 | timbyr | Status | new => resolved |
| 2008-04-14 12:47 | timbyr | Fixed in Version | => SVN/MIDI (trunk) |
| 2008-04-14 12:47 | timbyr | Resolution | open => fixed |
| 2008-04-14 12:47 | timbyr | Assigned To | => timbyr |
| 2008-04-14 12:47 | timbyr | Note Added: 0004865 | |
| 2020-04-19 20:13 | system | Note Added: 0021666 | |
| 2020-04-19 20:13 | system | Status | resolved => closed |