Skip to content

Commit 0a3abe3

Browse files
jfrey-xxtstenner
authored andcommitted
improve efficiency while waiting for new samples
1 parent ff1d5c2 commit 0a3abe3

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

src/consumer_queue.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "sample.h"
44
#include "send_buffer.h"
55
#include <chrono>
6-
#include <thread>
76

87
using namespace lsl;
98

@@ -23,10 +22,13 @@ consumer_queue::~consumer_queue() {
2322
}
2423

2524
void consumer_queue::push_sample(const sample_p &sample) {
25+
// acquire lock for more predictable behavior in regards to pop_sample()
26+
std::unique_lock<std::mutex> lk(mut_);
2627
while (!buffer_.push(sample)) {
2728
sample_p dummy;
2829
buffer_.pop(dummy);
2930
}
31+
cv_.notify_one();
3032
}
3133

3234
sample_p consumer_queue::pop_sample(double timeout) {
@@ -35,12 +37,10 @@ sample_p consumer_queue::pop_sample(double timeout) {
3537
buffer_.pop(result);
3638
} else {
3739
if (!buffer_.pop(result)) {
38-
// turn timeout into the point in time at which we give up
39-
timeout += lsl::lsl_clock();
40-
do {
41-
if (lsl::lsl_clock() >= timeout) break;
42-
std::this_thread::sleep_for(std::chrono::milliseconds(1));
43-
} while (!buffer_.pop(result));
40+
// wait for a new sample until the thread calling push_sample delivers one, or until timeout
41+
std::unique_lock<std::mutex> lk(mut_);
42+
std::chrono::duration<double> sec(timeout);
43+
cv_.wait_for(lk, sec, [&]{ return this->buffer_.pop(result); });
4444
}
4545
}
4646
return result;

src/consumer_queue.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "common.h"
55
#include "forward.h"
66
#include <boost/lockfree/spsc_queue.hpp>
7+
#include <mutex>
8+
#include <condition_variable>
79

810
namespace lsl {
911
/**
@@ -52,6 +54,9 @@ class consumer_queue {
5254
private:
5355
send_buffer_p registry_; // optional consumer registry
5456
buffer_type buffer_; // the sample buffer
57+
// used to wait for new samples
58+
std::mutex mut_;
59+
std::condition_variable cv_;
5560
};
5661

5762
} // namespace lsl

0 commit comments

Comments
 (0)