summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/filters.cc8
-rw-r--r--src/filters.h7
2 files changed, 11 insertions, 4 deletions
diff --git a/src/filters.cc b/src/filters.cc
index 6c4c0f48..0c45d356 100644
--- a/src/filters.cc
+++ b/src/filters.cc
@@ -107,6 +107,9 @@ void truncate_xacts::flush()
void truncate_xacts::operator()(post_t& post)
{
+ if (completed)
+ return;
+
if (last_xact != post.xact) {
if (last_xact)
xacts_seen++;
@@ -114,8 +117,11 @@ void truncate_xacts::operator()(post_t& post)
}
if (tail_count == 0 && head_count > 0 &&
- static_cast<int>(xacts_seen) >= head_count)
+ static_cast<int>(xacts_seen) >= head_count) {
+ flush();
+ completed = true;
return;
+ }
posts.push_back(&post);
}
diff --git a/src/filters.h b/src/filters.h
index 61ae4841..82fbf687 100644
--- a/src/filters.h
+++ b/src/filters.h
@@ -125,8 +125,9 @@ public:
class truncate_xacts : public item_handler<post_t>
{
- int head_count;
- int tail_count;
+ int head_count;
+ int tail_count;
+ bool completed;
posts_list posts;
std::size_t xacts_seen;
@@ -139,7 +140,7 @@ public:
int _head_count, int _tail_count)
: item_handler<post_t>(handler),
head_count(_head_count), tail_count(_tail_count),
- xacts_seen(0), last_xact(NULL) {
+ completed(false), xacts_seen(0), last_xact(NULL) {
TRACE_CTOR(truncate_xacts, "post_handler_ptr, int, int");
}
virtual ~truncate_xacts() {