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

Side by Side Diff: ppapi/proxy/proxy_channel.cc

Issue 11722017: Use an explicit PID for duplicating Pepper handles rather than the Channel's. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/proxy/proxy_channel.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "ppapi/proxy/proxy_channel.h" 5 #include "ppapi/proxy/proxy_channel.h"
6 6
7 #include "base/logging.h"
8 #include "base/process_util.h"
7 #include "ipc/ipc_platform_file.h" 9 #include "ipc/ipc_platform_file.h"
8 #include "ipc/ipc_test_sink.h" 10 #include "ipc/ipc_test_sink.h"
9 11
10 #if defined(OS_NACL) 12 #if defined(OS_NACL)
11 #include <unistd.h> 13 #include <unistd.h>
12 #endif 14 #endif
13 15
14 namespace ppapi { 16 namespace ppapi {
15 namespace proxy { 17 namespace proxy {
16 18
17 ProxyChannel::ProxyChannel() 19 ProxyChannel::ProxyChannel()
18 : delegate_(NULL), 20 : delegate_(NULL),
21 peer_pid_(base::kNullProcessId),
19 test_sink_(NULL) { 22 test_sink_(NULL) {
20 } 23 }
21 24
22 ProxyChannel::~ProxyChannel() { 25 ProxyChannel::~ProxyChannel() {
23 DVLOG(1) << "ProxyChannel::~ProxyChannel()"; 26 DVLOG(1) << "ProxyChannel::~ProxyChannel()";
24 } 27 }
25 28
26 bool ProxyChannel::InitWithChannel(Delegate* delegate, 29 bool ProxyChannel::InitWithChannel(Delegate* delegate,
30 base::ProcessId peer_pid,
27 const IPC::ChannelHandle& channel_handle, 31 const IPC::ChannelHandle& channel_handle,
28 bool is_client) { 32 bool is_client) {
29 delegate_ = delegate; 33 delegate_ = delegate;
34 peer_pid_ = peer_pid;
30 IPC::Channel::Mode mode = is_client ? IPC::Channel::MODE_CLIENT 35 IPC::Channel::Mode mode = is_client ? IPC::Channel::MODE_CLIENT
31 : IPC::Channel::MODE_SERVER; 36 : IPC::Channel::MODE_SERVER;
32 channel_.reset(new IPC::SyncChannel(channel_handle, mode, this, 37 channel_.reset(new IPC::SyncChannel(channel_handle, mode, this,
33 delegate->GetIPCMessageLoop(), true, 38 delegate->GetIPCMessageLoop(), true,
34 delegate->GetShutdownEvent())); 39 delegate->GetShutdownEvent()));
35 return true; 40 return true;
36 } 41 }
37 42
38 void ProxyChannel::InitWithTestSink(IPC::TestSink* test_sink) { 43 void ProxyChannel::InitWithTestSink(IPC::TestSink* test_sink) {
39 DCHECK(!test_sink_); 44 DCHECK(!test_sink_);
40 test_sink_ = test_sink; 45 test_sink_ = test_sink;
46 #if !defined(OS_NACL)
47 peer_pid_ = base::GetCurrentProcId();
48 #endif
41 } 49 }
42 50
43 void ProxyChannel::OnChannelError() { 51 void ProxyChannel::OnChannelError() {
44 channel_.reset(); 52 channel_.reset();
45 } 53 }
46 54
47 #if defined(OS_POSIX) && !defined(OS_NACL) 55 #if defined(OS_POSIX) && !defined(OS_NACL)
48 int ProxyChannel::TakeRendererFD() { 56 int ProxyChannel::TakeRendererFD() {
49 DCHECK(channel()); 57 DCHECK(channel());
50 return channel()->TakeClientFileDescriptor(); 58 return channel()->TakeClientFileDescriptor();
51 } 59 }
52 #endif 60 #endif
53 61
54 IPC::PlatformFileForTransit ProxyChannel::ShareHandleWithRemote( 62 IPC::PlatformFileForTransit ProxyChannel::ShareHandleWithRemote(
55 base::PlatformFile handle, 63 base::PlatformFile handle,
56 bool should_close_source) { 64 bool should_close_source) {
57 // Channel could be closed if the plugin crashes. 65 // Channel could be closed if the plugin crashes.
58 if (!channel_.get()) { 66 if (!channel_.get()) {
59 if (should_close_source) { 67 if (should_close_source) {
60 #if !defined(OS_NACL) 68 #if !defined(OS_NACL)
61 base::ClosePlatformFile(handle); 69 base::ClosePlatformFile(handle);
62 #else 70 #else
63 close(handle); 71 close(handle);
64 #endif 72 #endif
65 } 73 }
66 return IPC::InvalidPlatformFileForTransit(); 74 return IPC::InvalidPlatformFileForTransit();
67 } 75 }
68 return delegate_->ShareHandleWithRemote(handle, *channel_, 76 DCHECK(peer_pid_ != base::kNullProcessId);
77 return delegate_->ShareHandleWithRemote(handle, peer_pid_,
69 should_close_source); 78 should_close_source);
70 } 79 }
71 80
72 bool ProxyChannel::Send(IPC::Message* msg) { 81 bool ProxyChannel::Send(IPC::Message* msg) {
73 if (test_sink_) 82 if (test_sink_)
74 return test_sink_->Send(msg); 83 return test_sink_->Send(msg);
75 if (channel_.get()) 84 if (channel_.get())
76 return channel_->Send(msg); 85 return channel_->Send(msg);
77 86
78 // Remote side crashed, drop this message. 87 // Remote side crashed, drop this message.
79 delete msg; 88 delete msg;
80 return false; 89 return false;
81 } 90 }
82 91
83 } // namespace proxy 92 } // namespace proxy
84 } // namespace ppapi 93 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/proxy_channel.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698