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

Side by Side Diff: chrome/browser/service/service_process_control.cc

Issue 6349029: Get service processes working on Mac and Linux. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix up small typo in comment Created 9 years, 10 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 | « no previous file | chrome/browser/service/service_process_control_browsertest.cc » ('j') | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/browser/service/service_process_control.h" 5 #include "chrome/browser/service/service_process_control.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/process_util.h" 9 #include "base/process_util.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 } 115 }
116 116
117 // Actually going to connect. 117 // Actually going to connect.
118 VLOG(1) << "Connecting to Service Process IPC Server"; 118 VLOG(1) << "Connecting to Service Process IPC Server";
119 // Run the IPC channel on the shared IO thread. 119 // Run the IPC channel on the shared IO thread.
120 base::Thread* io_thread = g_browser_process->io_thread(); 120 base::Thread* io_thread = g_browser_process->io_thread();
121 121
122 // TODO(hclam): Handle error connecting to channel. 122 // TODO(hclam): Handle error connecting to channel.
123 const std::string channel_id = GetServiceProcessChannelName(); 123 const std::string channel_id = GetServiceProcessChannelName();
124 channel_.reset( 124 channel_.reset(
125 new IPC::SyncChannel(channel_id, IPC::Channel::MODE_CLIENT, this, 125 new IPC::SyncChannel(channel_id, IPC::Channel::MODE_NAMED_CLIENT, this,
126 io_thread->message_loop(), true, 126 io_thread->message_loop(), true,
127 g_browser_process->shutdown_event())); 127 g_browser_process->shutdown_event()));
128 channel_->set_sync_messages_with_no_timeout_allowed(false);
129
130 // We just established a channel with the service process. Notify it if an
131 // upgrade is available.
132 if (UpgradeDetector::GetInstance()->notify_upgrade()) {
133 Send(new ServiceMsg_UpdateAvailable);
134 } else {
135 if (registrar_.IsEmpty())
136 registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED,
137 NotificationService::AllSources());
138 }
139 } 128 }
140 129
141 void ServiceProcessControl::RunConnectDoneTasks() { 130 void ServiceProcessControl::RunConnectDoneTasks() {
142 RunAllTasksHelper(&connect_done_tasks_); 131 RunAllTasksHelper(&connect_done_tasks_);
143 DCHECK(connect_done_tasks_.empty()); 132 DCHECK(connect_done_tasks_.empty());
144 if (is_connected()) { 133 if (is_connected()) {
145 RunAllTasksHelper(&connect_success_tasks_); 134 RunAllTasksHelper(&connect_success_tasks_);
146 DCHECK(connect_success_tasks_.empty()); 135 DCHECK(connect_success_tasks_.empty());
147 STLDeleteElements(&connect_failure_tasks_); 136 STLDeleteElements(&connect_failure_tasks_);
148 } else { 137 } else {
(...skipping 23 matching lines...) Expand all
172 failure_task = NULL; 161 failure_task = NULL;
173 connect_done_tasks_.push_back(success_task); 162 connect_done_tasks_.push_back(success_task);
174 } else { 163 } else {
175 connect_success_tasks_.push_back(success_task); 164 connect_success_tasks_.push_back(success_task);
176 } 165 }
177 } 166 }
178 167
179 if (failure_task) 168 if (failure_task)
180 connect_failure_tasks_.push_back(failure_task); 169 connect_failure_tasks_.push_back(failure_task);
181 170
171 // If we already in the process of launching, then we are done.
172 if (launcher_) {
173 return;
174 }
175
182 // If the service process is already running then connects to it. 176 // If the service process is already running then connects to it.
183 if (CheckServiceProcessReady()) { 177 if (CheckServiceProcessReady()) {
184 ConnectInternal(); 178 ConnectInternal();
185 return; 179 return;
186 } 180 }
187 181
188 // If we already in the process of launching, then we are done.
189 if (launcher_) {
190 return;
191 }
192
193 // A service process should have a different mechanism for starting, but now 182 // A service process should have a different mechanism for starting, but now
194 // we start it as if it is a child process. 183 // we start it as if it is a child process.
195 FilePath exe_path = ChildProcessHost::GetChildPath(true); 184 FilePath exe_path = ChildProcessHost::GetChildPath(true);
196 if (exe_path.empty()) { 185 if (exe_path.empty()) {
197 NOTREACHED() << "Unable to get service process binary name."; 186 NOTREACHED() << "Unable to get service process binary name.";
198 } 187 }
199 188
200 CommandLine* cmd_line = new CommandLine(exe_path); 189 CommandLine* cmd_line = new CommandLine(exe_path);
201 cmd_line->AppendSwitchASCII(switches::kProcessType, 190 cmd_line->AppendSwitchASCII(switches::kProcessType,
202 switches::kServiceProcess); 191 switches::kServiceProcess);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 OnCloudPrintProxyIsEnabled) 237 OnCloudPrintProxyIsEnabled)
249 IPC_MESSAGE_HANDLER(ServiceHostMsg_RemotingHost_HostInfo, 238 IPC_MESSAGE_HANDLER(ServiceHostMsg_RemotingHost_HostInfo,
250 OnRemotingHostInfo) 239 OnRemotingHostInfo)
251 IPC_MESSAGE_UNHANDLED(handled = false) 240 IPC_MESSAGE_UNHANDLED(handled = false)
252 IPC_END_MESSAGE_MAP() 241 IPC_END_MESSAGE_MAP()
253 return handled; 242 return handled;
254 } 243 }
255 244
256 void ServiceProcessControl::OnChannelConnected(int32 peer_pid) { 245 void ServiceProcessControl::OnChannelConnected(int32 peer_pid) {
257 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
247 channel_->set_sync_messages_with_no_timeout_allowed(false);
248
249 // We just established a channel with the service process. Notify it if an
250 // upgrade is available.
251 if (UpgradeDetector::GetInstance()->notify_upgrade()) {
252 Send(new ServiceMsg_UpdateAvailable);
253 } else {
254 if (registrar_.IsEmpty())
255 registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED,
256 NotificationService::AllSources());
257 }
258 RunConnectDoneTasks(); 258 RunConnectDoneTasks();
259 } 259 }
260 260
261 void ServiceProcessControl::OnChannelError() { 261 void ServiceProcessControl::OnChannelError() {
262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
263 channel_.reset(); 263 channel_.reset();
264 RunConnectDoneTasks(); 264 RunConnectDoneTasks();
265 } 265 }
266 266
267 bool ServiceProcessControl::Send(IPC::Message* message) { 267 bool ServiceProcessControl::Send(IPC::Message* message) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 MessageHandler* message_handler) { 334 MessageHandler* message_handler) {
335 message_handlers_.insert(message_handler); 335 message_handlers_.insert(message_handler);
336 } 336 }
337 337
338 void ServiceProcessControl::RemoveMessageHandler( 338 void ServiceProcessControl::RemoveMessageHandler(
339 MessageHandler* message_handler) { 339 MessageHandler* message_handler) {
340 message_handlers_.erase(message_handler); 340 message_handlers_.erase(message_handler);
341 } 341 }
342 342
343 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcessControl); 343 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcessControl);
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/service/service_process_control_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698