OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/nacl/nacl_ipc_adapter.h" | 5 #include "chrome/nacl/nacl_ipc_adapter.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 // handler. This should wake up any waiting threads and immediately return | 270 // handler. This should wake up any waiting threads and immediately return |
271 // -1. There is an inherent race condition in that we can't be sure if the | 271 // -1. There is an inherent race condition in that we can't be sure if the |
272 // other thread is actually waiting when this happens. This is OK, since the | 272 // other thread is actually waiting when this happens. This is OK, since the |
273 // behavior (which we also explicitly test later) is to return -1 if the | 273 // behavior (which we also explicitly test later) is to return -1 if the |
274 // channel has already had an error when you start waiting. | 274 // channel has already had an error when you start waiting. |
275 class MyThread : public base::SimpleThread { | 275 class MyThread : public base::SimpleThread { |
276 public: | 276 public: |
277 explicit MyThread(NaClIPCAdapter* adapter) | 277 explicit MyThread(NaClIPCAdapter* adapter) |
278 : SimpleThread("NaClIPCAdapterThread"), | 278 : SimpleThread("NaClIPCAdapterThread"), |
279 adapter_(adapter) {} | 279 adapter_(adapter) {} |
280 virtual void Run() { | 280 virtual void Run() OVERRIDE { |
281 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); | 281 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
282 adapter_->OnChannelError(); | 282 adapter_->OnChannelError(); |
283 } | 283 } |
284 private: | 284 private: |
285 scoped_refptr<NaClIPCAdapter> adapter_; | 285 scoped_refptr<NaClIPCAdapter> adapter_; |
286 }; | 286 }; |
287 MyThread thread(adapter_); | 287 MyThread thread(adapter_); |
288 | 288 |
289 // IMPORTANT: do not return early from here down (including ASSERT_*) because | 289 // IMPORTANT: do not return early from here down (including ASSERT_*) because |
290 // the thread needs to joined or it will assert. | 290 // the thread needs to joined or it will assert. |
291 thread.Start(); | 291 thread.Start(); |
292 | 292 |
293 // Request data. This will normally (modulo races) block until data is | 293 // Request data. This will normally (modulo races) block until data is |
294 // received or there is an error, and the thread above will wake us up | 294 // received or there is an error, and the thread above will wake us up |
295 // after 1s. | 295 // after 1s. |
296 const int kBufSize = 64; | 296 const int kBufSize = 64; |
297 char buf[kBufSize]; | 297 char buf[kBufSize]; |
298 int result = BlockingReceive(buf, kBufSize); | 298 int result = BlockingReceive(buf, kBufSize); |
299 EXPECT_EQ(-1, result); | 299 EXPECT_EQ(-1, result); |
300 | 300 |
301 // Test the "previously had an error" case. BlockingReceive should return | 301 // Test the "previously had an error" case. BlockingReceive should return |
302 // immediately if there was an error. | 302 // immediately if there was an error. |
303 result = BlockingReceive(buf, kBufSize); | 303 result = BlockingReceive(buf, kBufSize); |
304 EXPECT_EQ(-1, result); | 304 EXPECT_EQ(-1, result); |
305 | 305 |
306 thread.Join(); | 306 thread.Join(); |
307 } | 307 } |
308 | 308 |
OLD | NEW |