Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: chromecast/media/cma/ipc/media_message_fifo_unittest.cc

Issue 529223003: IPC to pass media data using a lock free circular fifo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add more comments. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/bind.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "base/threading/thread.h"
10 #include "chromecast/media/cma/ipc/media_memory_chunk.h"
11 #include "chromecast/media/cma/ipc/media_message.h"
12 #include "chromecast/media/cma/ipc/media_message_fifo.h"
13 #include "chromecast/media/cma/ipc/media_message_type.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace chromecast {
17 namespace media {
18
19 namespace {
20
21 class FifoMemoryChunk : public MediaMemoryChunk {
22 public:
23 FifoMemoryChunk(void* mem, size_t size)
24 : mem_(mem), size_(size) {}
25 virtual ~FifoMemoryChunk() {}
26
27 virtual void* data() const OVERRIDE { return mem_; }
28 virtual size_t size() const OVERRIDE { return size_; }
29 virtual bool valid() const OVERRIDE { return true; }
30
31 private:
32 void* mem_;
33 size_t size_;
34
35 DISALLOW_COPY_AND_ASSIGN(FifoMemoryChunk);
36 };
37
38 void MsgProducer(
39 scoped_ptr<MediaMessageFifo> fifo, base::WaitableEvent* event) {
40
41 for (int k = 0; k < 2048; k++) {
42 uint32 msg_type = 0x2 + (k % 5);
43 uint32 max_msg_content_size = k % 64;
44 do {
45 scoped_ptr<MediaMessage> msg1(
46 MediaMessage::CreateMessage(
47 msg_type,
48 base::Bind(&MediaMessageFifo::ReserveMemory,
49 base::Unretained(fifo.get())),
50 max_msg_content_size));
51 if (msg1)
52 break;
53 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
54 } while(true);
55 }
56
57 fifo.reset();
58
59 event->Signal();
60 }
61
62 void MsgConsumer(
63 scoped_ptr<MediaMessageFifo> fifo, base::WaitableEvent* event) {
64
65 int k = 0;
66 while (k < 2048) {
67 uint32 msg_type = 0x2 + (k % 5);
68 do {
69 scoped_ptr<MediaMessage> msg2(fifo->Pop());
70 if (msg2) {
71 if (msg2->type() != PaddingMediaMsg) {
72 EXPECT_EQ(msg2->type(), msg_type);
73 k++;
74 }
75 break;
76 }
77 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
78 } while(true);
79 }
80
81 fifo.reset();
82
83 event->Signal();
84 }
85
86 void MsgProducerConsumer(
87 scoped_ptr<MediaMessageFifo> producer_fifo,
88 scoped_ptr<MediaMessageFifo> consumer_fifo,
89 base::WaitableEvent* event) {
90 for (int k = 0; k < 2048; k++) {
91 // Should have enough space to create a message.
92 uint32 msg_type = 0x2 + (k % 5);
93 uint32 max_msg_content_size = k % 64;
94 scoped_ptr<MediaMessage> msg1(
95 MediaMessage::CreateMessage(
96 msg_type,
97 base::Bind(&MediaMessageFifo::ReserveMemory,
98 base::Unretained(producer_fifo.get())),
99 max_msg_content_size));
100 EXPECT_TRUE(msg1);
101
102 // Make sure the message is commited.
103 msg1.reset();
104
105 // At this point, we should have a message to read.
106 scoped_ptr<MediaMessage> msg2(consumer_fifo->Pop());
107 EXPECT_TRUE(msg2);
108 }
109
110 producer_fifo.reset();
111 consumer_fifo.reset();
112
113 event->Signal();
114 }
115
116 } // namespace
117
118 TEST(MediaMessageFifoTest, AlternateWriteRead) {
119 size_t buffer_size = 64 * 1024;
120 scoped_ptr<uint64[]> buffer(new uint64[buffer_size / sizeof(uint64)]);
121
122 scoped_ptr<base::Thread> thread(
123 new base::Thread("FeederConsumerThread"));
124 thread->Start();
125
126 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo(
127 scoped_ptr<MediaMemoryChunk>(
128 new FifoMemoryChunk(&buffer[0], buffer_size)),
129 true));
130 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo(
131 scoped_ptr<MediaMemoryChunk>(
132 new FifoMemoryChunk(&buffer[0], buffer_size)),
133 false));
134
135 base::WaitableEvent event(false, false);
136 thread->message_loop_proxy()->PostTask(
137 FROM_HERE,
138 base::Bind(&MsgProducerConsumer,
139 base::Passed(&producer_fifo),
140 base::Passed(&consumer_fifo),
141 &event));
142 event.Wait();
143
144 thread.reset();
145 }
146
147 TEST(MediaMessageFifoTest, MultiThreaded) {
148 size_t buffer_size = 64 * 1024;
149 scoped_ptr<uint64[]> buffer(new uint64[buffer_size / sizeof(uint64)]);
150
151 scoped_ptr<base::Thread> producer_thread(
152 new base::Thread("FeederThread"));
153 scoped_ptr<base::Thread> consumer_thread(
154 new base::Thread("ConsumerThread"));
155 producer_thread->Start();
156 consumer_thread->Start();
157
158 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo(
159 scoped_ptr<MediaMemoryChunk>(
160 new FifoMemoryChunk(&buffer[0], buffer_size)),
161 true));
162 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo(
163 scoped_ptr<MediaMemoryChunk>(
164 new FifoMemoryChunk(&buffer[0], buffer_size)),
165 false));
166
167 base::WaitableEvent producer_event_done(false, false);
168 base::WaitableEvent consumer_event_done(false, false);
169
170 producer_thread->message_loop_proxy()->PostTask(
171 FROM_HERE,
172 base::Bind(&MsgProducer,
173 base::Passed(&producer_fifo), &producer_event_done));
174 consumer_thread->message_loop_proxy()->PostTask(
175 FROM_HERE,
176 base::Bind(&MsgConsumer,
177 base::Passed(&consumer_fifo), &consumer_event_done));
178
179 producer_event_done.Wait();
180 consumer_event_done.Wait();
181
182 producer_thread.reset();
183 consumer_thread.reset();
184 }
185
186 } // namespace media
187 } // namespace chromecast
188
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698