File tree Expand file tree Collapse file tree 2 files changed +12
-7
lines changed Expand file tree Collapse file tree 2 files changed +12
-7
lines changed Original file line number Diff line number Diff line change 3
3
#include " sample.h"
4
4
#include " send_buffer.h"
5
5
#include < chrono>
6
- #include < thread>
7
6
8
7
using namespace lsl ;
9
8
@@ -23,10 +22,13 @@ consumer_queue::~consumer_queue() {
23
22
}
24
23
25
24
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_);
26
27
while (!buffer_.push (sample)) {
27
28
sample_p dummy;
28
29
buffer_.pop (dummy);
29
30
}
31
+ cv_.notify_one ();
30
32
}
31
33
32
34
sample_p consumer_queue::pop_sample (double timeout) {
@@ -35,12 +37,10 @@ sample_p consumer_queue::pop_sample(double timeout) {
35
37
buffer_.pop (result);
36
38
} else {
37
39
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); });
44
44
}
45
45
}
46
46
return result;
Original file line number Diff line number Diff line change 4
4
#include " common.h"
5
5
#include " forward.h"
6
6
#include < boost/lockfree/spsc_queue.hpp>
7
+ #include < mutex>
8
+ #include < condition_variable>
7
9
8
10
namespace lsl {
9
11
/* *
@@ -52,6 +54,9 @@ class consumer_queue {
52
54
private:
53
55
send_buffer_p registry_; // optional consumer registry
54
56
buffer_type buffer_; // the sample buffer
57
+ // used to wait for new samples
58
+ std::mutex mut_;
59
+ std::condition_variable cv_;
55
60
};
56
61
57
62
} // namespace lsl
You can’t perform that action at this time.
0 commit comments