| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromecast/media/cma/ipc/media_message_fifo.h" | 5 #include "chromecast/media/cma/ipc/media_message_fifo.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 uint32_t msg_type = 0x2 + (k % 5); | 47 uint32_t msg_type = 0x2 + (k % 5); |
| 48 uint32_t max_msg_content_size = k % 64; | 48 uint32_t max_msg_content_size = k % 64; |
| 49 do { | 49 do { |
| 50 std::unique_ptr<MediaMessage> msg1(MediaMessage::CreateMessage( | 50 std::unique_ptr<MediaMessage> msg1(MediaMessage::CreateMessage( |
| 51 msg_type, base::Bind(&MediaMessageFifo::ReserveMemory, | 51 msg_type, base::Bind(&MediaMessageFifo::ReserveMemory, |
| 52 base::Unretained(fifo.get())), | 52 base::Unretained(fifo.get())), |
| 53 max_msg_content_size)); | 53 max_msg_content_size)); |
| 54 if (msg1) | 54 if (msg1) |
| 55 break; | 55 break; |
| 56 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 56 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 57 } while(true); | 57 } while (true); |
| 58 } | 58 } |
| 59 | 59 |
| 60 fifo.reset(); | 60 fifo.reset(); |
| 61 | 61 |
| 62 event->Signal(); | 62 event->Signal(); |
| 63 } | 63 } |
| 64 | 64 |
| 65 void MsgConsumer(std::unique_ptr<MediaMessageFifo> fifo, | 65 void MsgConsumer(std::unique_ptr<MediaMessageFifo> fifo, |
| 66 int msg_count, | 66 int msg_count, |
| 67 base::WaitableEvent* event) { | 67 base::WaitableEvent* event) { |
| 68 int k = 0; | 68 int k = 0; |
| 69 while (k < msg_count) { | 69 while (k < msg_count) { |
| 70 uint32_t msg_type = 0x2 + (k % 5); | 70 uint32_t msg_type = 0x2 + (k % 5); |
| 71 do { | 71 do { |
| 72 std::unique_ptr<MediaMessage> msg2(fifo->Pop()); | 72 std::unique_ptr<MediaMessage> msg2(fifo->Pop()); |
| 73 if (msg2) { | 73 if (msg2) { |
| 74 if (msg2->type() != PaddingMediaMsg) { | 74 if (msg2->type() != PaddingMediaMsg) { |
| 75 EXPECT_EQ(msg2->type(), msg_type); | 75 EXPECT_EQ(msg2->type(), msg_type); |
| 76 k++; | 76 k++; |
| 77 } | 77 } |
| 78 break; | 78 break; |
| 79 } | 79 } |
| 80 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); | 80 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10)); |
| 81 } while(true); | 81 } while (true); |
| 82 } | 82 } |
| 83 | 83 |
| 84 fifo.reset(); | 84 fifo.reset(); |
| 85 | 85 |
| 86 event->Signal(); | 86 event->Signal(); |
| 87 } | 87 } |
| 88 | 88 |
| 89 void MsgProducerConsumer(std::unique_ptr<MediaMessageFifo> producer_fifo, | 89 void MsgProducerConsumer(std::unique_ptr<MediaMessageFifo> producer_fifo, |
| 90 std::unique_ptr<MediaMessageFifo> consumer_fifo, | 90 std::unique_ptr<MediaMessageFifo> consumer_fifo, |
| 91 base::WaitableEvent* event) { | 91 base::WaitableEvent* event) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 126 |
| 127 std::unique_ptr<MediaMessageFifo> producer_fifo( | 127 std::unique_ptr<MediaMessageFifo> producer_fifo( |
| 128 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( | 128 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( |
| 129 new FifoMemoryChunk(&buffer[0], buffer_size)), | 129 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 130 true)); | 130 true)); |
| 131 std::unique_ptr<MediaMessageFifo> consumer_fifo( | 131 std::unique_ptr<MediaMessageFifo> consumer_fifo( |
| 132 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( | 132 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( |
| 133 new FifoMemoryChunk(&buffer[0], buffer_size)), | 133 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 134 false)); | 134 false)); |
| 135 | 135 |
| 136 base::WaitableEvent event(false, false); | 136 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 137 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 137 thread->task_runner()->PostTask( | 138 thread->task_runner()->PostTask( |
| 138 FROM_HERE, base::Bind(&MsgProducerConsumer, base::Passed(&producer_fifo), | 139 FROM_HERE, base::Bind(&MsgProducerConsumer, base::Passed(&producer_fifo), |
| 139 base::Passed(&consumer_fifo), &event)); | 140 base::Passed(&consumer_fifo), &event)); |
| 140 event.Wait(); | 141 event.Wait(); |
| 141 | 142 |
| 142 thread.reset(); | 143 thread.reset(); |
| 143 } | 144 } |
| 144 | 145 |
| 145 TEST(MediaMessageFifoTest, MultiThreaded) { | 146 TEST(MediaMessageFifoTest, MultiThreaded) { |
| 146 size_t buffer_size = 64 * 1024; | 147 size_t buffer_size = 64 * 1024; |
| 147 std::unique_ptr<uint64_t[]> buffer( | 148 std::unique_ptr<uint64_t[]> buffer( |
| 148 new uint64_t[buffer_size / sizeof(uint64_t)]); | 149 new uint64_t[buffer_size / sizeof(uint64_t)]); |
| 149 | 150 |
| 150 std::unique_ptr<base::Thread> producer_thread( | 151 std::unique_ptr<base::Thread> producer_thread( |
| 151 new base::Thread("FeederThread")); | 152 new base::Thread("FeederThread")); |
| 152 std::unique_ptr<base::Thread> consumer_thread( | 153 std::unique_ptr<base::Thread> consumer_thread( |
| 153 new base::Thread("ConsumerThread")); | 154 new base::Thread("ConsumerThread")); |
| 154 producer_thread->Start(); | 155 producer_thread->Start(); |
| 155 consumer_thread->Start(); | 156 consumer_thread->Start(); |
| 156 | 157 |
| 157 std::unique_ptr<MediaMessageFifo> producer_fifo( | 158 std::unique_ptr<MediaMessageFifo> producer_fifo( |
| 158 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( | 159 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( |
| 159 new FifoMemoryChunk(&buffer[0], buffer_size)), | 160 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 160 true)); | 161 true)); |
| 161 std::unique_ptr<MediaMessageFifo> consumer_fifo( | 162 std::unique_ptr<MediaMessageFifo> consumer_fifo( |
| 162 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( | 163 new MediaMessageFifo(std::unique_ptr<MediaMemoryChunk>( |
| 163 new FifoMemoryChunk(&buffer[0], buffer_size)), | 164 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 164 false)); | 165 false)); |
| 165 | 166 |
| 166 base::WaitableEvent producer_event_done(false, false); | 167 base::WaitableEvent producer_event_done( |
| 167 base::WaitableEvent consumer_event_done(false, false); | 168 base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 169 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 170 base::WaitableEvent consumer_event_done( |
| 171 base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 172 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 168 | 173 |
| 169 const int msg_count = 2048; | 174 const int msg_count = 2048; |
| 170 producer_thread->task_runner()->PostTask( | 175 producer_thread->task_runner()->PostTask( |
| 171 FROM_HERE, base::Bind(&MsgProducer, base::Passed(&producer_fifo), | 176 FROM_HERE, base::Bind(&MsgProducer, base::Passed(&producer_fifo), |
| 172 msg_count, &producer_event_done)); | 177 msg_count, &producer_event_done)); |
| 173 consumer_thread->task_runner()->PostTask( | 178 consumer_thread->task_runner()->PostTask( |
| 174 FROM_HERE, base::Bind(&MsgConsumer, base::Passed(&consumer_fifo), | 179 FROM_HERE, base::Bind(&MsgConsumer, base::Passed(&consumer_fifo), |
| 175 msg_count, &consumer_event_done)); | 180 msg_count, &consumer_event_done)); |
| 176 | 181 |
| 177 producer_event_done.Wait(); | 182 producer_event_done.Wait(); |
| 178 consumer_event_done.Wait(); | 183 consumer_event_done.Wait(); |
| 179 | 184 |
| 180 producer_thread.reset(); | 185 producer_thread.reset(); |
| 181 consumer_thread.reset(); | 186 consumer_thread.reset(); |
| 182 } | 187 } |
| 183 | 188 |
| 184 } // namespace media | 189 } // namespace media |
| 185 } // namespace chromecast | 190 } // namespace chromecast |
| 186 | 191 |
| OLD | NEW |