| 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 "build/build_config.h" | 5 #include "build/build_config.h" | 
| 6 | 6 | 
| 7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) | 
| 8 #if defined(OS_MACOSX) | 8 #if defined(OS_MACOSX) | 
| 9 extern "C" { | 9 extern "C" { | 
| 10 #include <sandbox.h> | 10 #include <sandbox.h> | 
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 262         FROM_HERE, base::Bind(&PipeChannelHelper::Connect, out.get())); | 262         FROM_HERE, base::Bind(&PipeChannelHelper::Connect, out.get())); | 
| 263   } | 263   } | 
| 264 | 264 | 
| 265   static void DestroyChannel(std::unique_ptr<IPC::Channel>* c, | 265   static void DestroyChannel(std::unique_ptr<IPC::Channel>* c, | 
| 266                              base::WaitableEvent* event) { | 266                              base::WaitableEvent* event) { | 
| 267     c->reset(0); | 267     c->reset(0); | 
| 268     event->Signal(); | 268     event->Signal(); | 
| 269   } | 269   } | 
| 270 | 270 | 
| 271   ~PipeChannelHelper() { | 271   ~PipeChannelHelper() { | 
| 272     base::WaitableEvent a(true, false); | 272     base::WaitableEvent a(base::WaitableEvent::ResetPolicy::MANUAL, | 
| 273     base::WaitableEvent b(true, false); | 273                           base::WaitableEvent::InitialState::NOT_SIGNALED); | 
|  | 274     base::WaitableEvent b(base::WaitableEvent::ResetPolicy::MANUAL, | 
|  | 275                           base::WaitableEvent::InitialState::NOT_SIGNALED); | 
| 274     in_thread_->task_runner()->PostTask( | 276     in_thread_->task_runner()->PostTask( | 
| 275         FROM_HERE, base::Bind(&PipeChannelHelper::DestroyChannel, &in, &a)); | 277         FROM_HERE, base::Bind(&PipeChannelHelper::DestroyChannel, &in, &a)); | 
| 276     out_thread_->task_runner()->PostTask( | 278     out_thread_->task_runner()->PostTask( | 
| 277         FROM_HERE, base::Bind(&PipeChannelHelper::DestroyChannel, &out, &b)); | 279         FROM_HERE, base::Bind(&PipeChannelHelper::DestroyChannel, &out, &b)); | 
| 278     a.Wait(); | 280     a.Wait(); | 
| 279     b.Wait(); | 281     b.Wait(); | 
| 280   } | 282   } | 
| 281 | 283 | 
| 282   static void Connect(IPC::Channel *channel) { | 284   static void Connect(IPC::Channel *channel) { | 
| 283     EXPECT_TRUE(channel->Connect()); | 285     EXPECT_TRUE(channel->Connect()); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 308 // threads, the producer thread creates socketpairs and sends one of the fds | 310 // threads, the producer thread creates socketpairs and sends one of the fds | 
| 309 // over pipe1 to the middleman thread. The middleman thread simply takes the fd | 311 // over pipe1 to the middleman thread. The middleman thread simply takes the fd | 
| 310 // sends it over pipe2 to the consumer thread. The consumer thread writes a byte | 312 // sends it over pipe2 to the consumer thread. The consumer thread writes a byte | 
| 311 // to each fd it receives and then closes the pipe. The producer thread reads | 313 // to each fd it receives and then closes the pipe. The producer thread reads | 
| 312 // the bytes back from each pair of pipes and make sure that everything worked. | 314 // the bytes back from each pair of pipes and make sure that everything worked. | 
| 313 // This feedback mechanism makes sure that not too many file descriptors are | 315 // This feedback mechanism makes sure that not too many file descriptors are | 
| 314 // in flight at the same time. For more info on the bug, see: | 316 // in flight at the same time. For more info on the bug, see: | 
| 315 // http://crbug.com/298276 | 317 // http://crbug.com/298276 | 
| 316 class IPCMultiSendingFdsTest : public testing::Test { | 318 class IPCMultiSendingFdsTest : public testing::Test { | 
| 317  public: | 319  public: | 
| 318   IPCMultiSendingFdsTest() : received_(true, false) {} | 320   IPCMultiSendingFdsTest() | 
|  | 321       : received_(base::WaitableEvent::ResetPolicy::MANUAL, | 
|  | 322                   base::WaitableEvent::InitialState::NOT_SIGNALED) {} | 
| 319 | 323 | 
| 320   void Producer(PipeChannelHelper* dest, | 324   void Producer(PipeChannelHelper* dest, | 
| 321                 base::Thread* t, | 325                 base::Thread* t, | 
| 322                 int pipes_to_send) { | 326                 int pipes_to_send) { | 
| 323     for (int i = 0; i < pipes_to_send; i++) { | 327     for (int i = 0; i < pipes_to_send; i++) { | 
| 324       received_.Reset(); | 328       received_.Reset(); | 
| 325       std::pair<int, int> pipe_fds = make_socket_pair(); | 329       std::pair<int, int> pipe_fds = make_socket_pair(); | 
| 326       t->task_runner()->PostTask( | 330       t->task_runner()->PostTask( | 
| 327           FROM_HERE, base::Bind(&PipeChannelHelper::Send, | 331           FROM_HERE, base::Bind(&PipeChannelHelper::Send, | 
| 328                                 base::Unretained(dest), pipe_fds.second)); | 332                                 base::Unretained(dest), pipe_fds.second)); | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 378   base::WaitableEvent received_; | 382   base::WaitableEvent received_; | 
| 379 }; | 383 }; | 
| 380 | 384 | 
| 381 TEST_F(IPCMultiSendingFdsTest, StressTest) { | 385 TEST_F(IPCMultiSendingFdsTest, StressTest) { | 
| 382   Run(); | 386   Run(); | 
| 383 } | 387 } | 
| 384 | 388 | 
| 385 }  // namespace | 389 }  // namespace | 
| 386 | 390 | 
| 387 #endif  // defined(OS_POSIX) | 391 #endif  // defined(OS_POSIX) | 
| OLD | NEW | 
|---|