Index: webrtc/base/bufferqueue.cc |
diff --git a/webrtc/base/bufferqueue.cc b/webrtc/base/bufferqueue.cc |
index 955af51f6be3069e742cce44f7c40153ba1d1e04..10aae8c0b7d00d76326476af2dc8729536567745 100644 |
--- a/webrtc/base/bufferqueue.cc |
+++ b/webrtc/base/bufferqueue.cc |
@@ -13,7 +13,12 @@ |
namespace rtc { |
BufferQueue::BufferQueue(size_t capacity, size_t default_size) |
- : capacity_(capacity), default_size_(default_size) { |
+ : capacity_(capacity), default_size_(default_size), |
+ owner_(Thread::Current()) { |
+} |
+ |
+BufferQueue::BufferQueue(size_t capacity, size_t default_size, Thread* owner) |
+ : capacity_(capacity), default_size_(default_size), owner_(owner) { |
torbjorng (webrtc)
2015/11/16 14:05:03
Consider combining the two constructors, by using
joachim
2015/11/16 21:30:15
Done.
|
} |
BufferQueue::~BufferQueue() { |
@@ -38,6 +43,7 @@ bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) { |
return false; |
} |
+ bool was_writable = queue_.size() < capacity_; |
Buffer* packet = queue_.front(); |
queue_.pop_front(); |
@@ -51,6 +57,9 @@ bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) { |
*bytes_read = bytes; |
} |
free_list_.push_back(packet); |
+ if (!was_writable) { |
+ PostEvent(owner_, BQ_WRITE); |
+ } |
return true; |
} |
@@ -61,6 +70,7 @@ bool BufferQueue::WriteBack(const void* buffer, size_t bytes, |
return false; |
} |
+ bool was_readable = !queue_.empty(); |
Buffer* packet; |
if (!free_list_.empty()) { |
packet = free_list_.back(); |
@@ -74,7 +84,26 @@ bool BufferQueue::WriteBack(const void* buffer, size_t bytes, |
*bytes_written = bytes; |
} |
queue_.push_back(packet); |
+ if (!was_readable) { |
+ PostEvent(owner_, BQ_READ); |
+ } |
return true; |
} |
+void BufferQueue::PostEvent(Thread* t, int events) { |
torbjorng (webrtc)
2015/11/16 14:05:03
Nit: t => thread
joachim
2015/11/16 21:30:15
No longer applies (removed).
|
+ t->Post(this, MSG_POST_EVENT, new BufferEventData(events)); |
+} |
+ |
+void BufferQueue::PostEvent(int events) { |
+ PostEvent(Thread::Current(), events); |
+} |
+ |
+void BufferQueue::OnMessage(Message* msg) { |
+ if (MSG_POST_EVENT == msg->message_id) { |
+ BufferEventData* pe = static_cast<BufferEventData*>(msg->pdata); |
+ SignalEvent(this, pe->events); |
+ delete msg->pdata; |
+ } |
+} |
+ |
} // namespace rtc |