summaryrefslogtreecommitdiffstats
path: root/src/server/PostProcessor.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-09-15 04:53:18 +0000
committerDavid Robillard <d@drobilla.net>2011-09-15 04:53:18 +0000
commitd4cf461177a0e0309cefc3d02910c51477a3c105 (patch)
treeec3a680629342d161d8425c58650d0c71c2e31c3 /src/server/PostProcessor.cpp
parent728f510e8c542db2907dcd439a9ab99d07282220 (diff)
downloadingen-d4cf461177a0e0309cefc3d02910c51477a3c105.tar.gz
ingen-d4cf461177a0e0309cefc3d02910c51477a3c105.tar.bz2
ingen-d4cf461177a0e0309cefc3d02910c51477a3c105.zip
Fix crash on client event post-processing (e.g. when rapidly manipulating controls).
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3462 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/PostProcessor.cpp')
-rw-r--r--src/server/PostProcessor.cpp32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/server/PostProcessor.cpp b/src/server/PostProcessor.cpp
index 7c756812..2dd9666b 100644
--- a/src/server/PostProcessor.cpp
+++ b/src/server/PostProcessor.cpp
@@ -47,14 +47,14 @@ PostProcessor::append(QueuedEvent* first, QueuedEvent* last)
{
assert(first);
assert(last);
- QueuedEvent* const head = _head.get();
- QueuedEvent* const tail = _tail.get();
- if (!head) {
- _head = first;
+ assert(!last->next());
+ if (_head.get()) {
+ _tail.get()->next(first);
+ _tail = last;
} else {
- tail->next(first);
+ _tail = last;
+ _head = first;
}
- _tail = last;
}
void
@@ -88,19 +88,19 @@ PostProcessor::process()
/* Process normal events */
QueuedEvent* ev = _head.get();
- while (ev) {
- if (ev->time() > end_time)
- break;
-
+ if (!ev) {
+ return;
+ }
+
+ QueuedEvent* const tail = _tail.get();
+ _head = (QueuedEvent*)tail->next();
+ while (ev && ev->time() <= end_time) {
QueuedEvent* const next = (QueuedEvent*)ev->next();
ev->post_process();
- if (next) {
- _head = next;
- } else {
- _head = NULL;
- _tail = NULL;
- }
delete ev;
+ if (ev == tail) {
+ break;
+ }
ev = next;
}
}