| 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/synchronization/waitable_event.h" | 8 #include "base/synchronization/waitable_event.h" |
| 9 #include "base/threading/thread.h" | 9 #include "base/threading/thread.h" |
| 10 #include "chromecast/media/cma/ipc/media_memory_chunk.h" | 10 #include "chromecast/media/cma/ipc/media_memory_chunk.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo( | 128 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo( |
| 129 scoped_ptr<MediaMemoryChunk>( | 129 scoped_ptr<MediaMemoryChunk>( |
| 130 new FifoMemoryChunk(&buffer[0], buffer_size)), | 130 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 131 true)); | 131 true)); |
| 132 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo( | 132 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo( |
| 133 scoped_ptr<MediaMemoryChunk>( | 133 scoped_ptr<MediaMemoryChunk>( |
| 134 new FifoMemoryChunk(&buffer[0], buffer_size)), | 134 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 135 false)); | 135 false)); |
| 136 | 136 |
| 137 base::WaitableEvent event(false, false); | 137 base::WaitableEvent event(false, false); |
| 138 thread->message_loop_proxy()->PostTask( | 138 thread->task_runner()->PostTask( |
| 139 FROM_HERE, | 139 FROM_HERE, base::Bind(&MsgProducerConsumer, base::Passed(&producer_fifo), |
| 140 base::Bind(&MsgProducerConsumer, | 140 base::Passed(&consumer_fifo), &event)); |
| 141 base::Passed(&producer_fifo), | |
| 142 base::Passed(&consumer_fifo), | |
| 143 &event)); | |
| 144 event.Wait(); | 141 event.Wait(); |
| 145 | 142 |
| 146 thread.reset(); | 143 thread.reset(); |
| 147 } | 144 } |
| 148 | 145 |
| 149 TEST(MediaMessageFifoTest, MultiThreaded) { | 146 TEST(MediaMessageFifoTest, MultiThreaded) { |
| 150 size_t buffer_size = 64 * 1024; | 147 size_t buffer_size = 64 * 1024; |
| 151 scoped_ptr<uint64[]> buffer(new uint64[buffer_size / sizeof(uint64)]); | 148 scoped_ptr<uint64[]> buffer(new uint64[buffer_size / sizeof(uint64)]); |
| 152 | 149 |
| 153 scoped_ptr<base::Thread> producer_thread( | 150 scoped_ptr<base::Thread> producer_thread( |
| 154 new base::Thread("FeederThread")); | 151 new base::Thread("FeederThread")); |
| 155 scoped_ptr<base::Thread> consumer_thread( | 152 scoped_ptr<base::Thread> consumer_thread( |
| 156 new base::Thread("ConsumerThread")); | 153 new base::Thread("ConsumerThread")); |
| 157 producer_thread->Start(); | 154 producer_thread->Start(); |
| 158 consumer_thread->Start(); | 155 consumer_thread->Start(); |
| 159 | 156 |
| 160 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo( | 157 scoped_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo( |
| 161 scoped_ptr<MediaMemoryChunk>( | 158 scoped_ptr<MediaMemoryChunk>( |
| 162 new FifoMemoryChunk(&buffer[0], buffer_size)), | 159 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 163 true)); | 160 true)); |
| 164 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo( | 161 scoped_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo( |
| 165 scoped_ptr<MediaMemoryChunk>( | 162 scoped_ptr<MediaMemoryChunk>( |
| 166 new FifoMemoryChunk(&buffer[0], buffer_size)), | 163 new FifoMemoryChunk(&buffer[0], buffer_size)), |
| 167 false)); | 164 false)); |
| 168 | 165 |
| 169 base::WaitableEvent producer_event_done(false, false); | 166 base::WaitableEvent producer_event_done(false, false); |
| 170 base::WaitableEvent consumer_event_done(false, false); | 167 base::WaitableEvent consumer_event_done(false, false); |
| 171 | 168 |
| 172 const int msg_count = 2048; | 169 const int msg_count = 2048; |
| 173 producer_thread->message_loop_proxy()->PostTask( | 170 producer_thread->task_runner()->PostTask( |
| 174 FROM_HERE, | 171 FROM_HERE, base::Bind(&MsgProducer, base::Passed(&producer_fifo), |
| 175 base::Bind(&MsgProducer, | 172 msg_count, &producer_event_done)); |
| 176 base::Passed(&producer_fifo), | 173 consumer_thread->task_runner()->PostTask( |
| 177 msg_count, | 174 FROM_HERE, base::Bind(&MsgConsumer, base::Passed(&consumer_fifo), |
| 178 &producer_event_done)); | 175 msg_count, &consumer_event_done)); |
| 179 consumer_thread->message_loop_proxy()->PostTask( | |
| 180 FROM_HERE, | |
| 181 base::Bind(&MsgConsumer, | |
| 182 base::Passed(&consumer_fifo), | |
| 183 msg_count, | |
| 184 &consumer_event_done)); | |
| 185 | 176 |
| 186 producer_event_done.Wait(); | 177 producer_event_done.Wait(); |
| 187 consumer_event_done.Wait(); | 178 consumer_event_done.Wait(); |
| 188 | 179 |
| 189 producer_thread.reset(); | 180 producer_thread.reset(); |
| 190 consumer_thread.reset(); | 181 consumer_thread.reset(); |
| 191 } | 182 } |
| 192 | 183 |
| 193 } // namespace media | 184 } // namespace media |
| 194 } // namespace chromecast | 185 } // namespace chromecast |
| 195 | 186 |
| OLD | NEW |