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

Side by Side Diff: util/win/exception_handler_server.cc

Issue 1428803006: win: Implement CrashpadClient::StartHandler() (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Address review feedback; add a test Created 5 years, 1 month 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
« no previous file with comments | « util/win/exception_handler_server.h ('k') | util/win/exception_handler_server_test.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 2015 The Crashpad Authors. All rights reserved. 1 // Copyright 2015 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 WinVMAddress debug_critical_section_address_; 227 WinVMAddress debug_critical_section_address_;
228 228
229 DISALLOW_COPY_AND_ASSIGN(ClientData); 229 DISALLOW_COPY_AND_ASSIGN(ClientData);
230 }; 230 };
231 231
232 } // namespace internal 232 } // namespace internal
233 233
234 ExceptionHandlerServer::Delegate::~Delegate() { 234 ExceptionHandlerServer::Delegate::~Delegate() {
235 } 235 }
236 236
237 ExceptionHandlerServer::ExceptionHandlerServer(const std::string& pipe_name) 237 ExceptionHandlerServer::ExceptionHandlerServer(const std::string& pipe_name,
238 bool persistent)
238 : pipe_name_(pipe_name), 239 : pipe_name_(pipe_name),
239 port_(CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 1)), 240 port_(CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 1)),
240 clients_lock_(), 241 clients_lock_(),
241 clients_() { 242 clients_(),
243 persistent_(persistent) {
242 } 244 }
243 245
244 ExceptionHandlerServer::~ExceptionHandlerServer() { 246 ExceptionHandlerServer::~ExceptionHandlerServer() {
245 } 247 }
246 248
247 void ExceptionHandlerServer::Run(Delegate* delegate) { 249 void ExceptionHandlerServer::Run(Delegate* delegate) {
248 uint64_t shutdown_token = base::RandUint64(); 250 uint64_t shutdown_token = base::RandUint64();
249 // We create two pipe instances, so that there's one listening while the 251 // We create two pipe instances, so that there's one listening while the
250 // PipeServiceProc is processing a registration. 252 // PipeServiceProc is processing a registration.
251 ScopedKernelHANDLE thread_handles[2]; 253 ScopedKernelHANDLE thread_handles[2];
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 if (!key) { 292 if (!key) {
291 // Shutting down. 293 // Shutting down.
292 break; 294 break;
293 } 295 }
294 296
295 // Otherwise, this is a request to unregister and destroy the given client. 297 // Otherwise, this is a request to unregister and destroy the given client.
296 // delete'ing the ClientData blocks in UnregisterWaitEx to ensure all 298 // delete'ing the ClientData blocks in UnregisterWaitEx to ensure all
297 // outstanding threadpool waits are complete. This is important because the 299 // outstanding threadpool waits are complete. This is important because the
298 // process handle can be signalled *before* the dump request is signalled. 300 // process handle can be signalled *before* the dump request is signalled.
299 internal::ClientData* client = reinterpret_cast<internal::ClientData*>(key); 301 internal::ClientData* client = reinterpret_cast<internal::ClientData*>(key);
300 { 302 base::AutoLock lock(clients_lock_);
301 base::AutoLock lock(clients_lock_); 303 clients_.erase(client);
302 clients_.erase(client);
303 }
304 delete client; 304 delete client;
305 if (!persistent_ && clients_.empty())
306 break;
305 } 307 }
306 308
307 // Signal to the named pipe instances that they should terminate. 309 // Signal to the named pipe instances that they should terminate.
308 for (int i = 0; i < arraysize(thread_handles); ++i) { 310 for (int i = 0; i < arraysize(thread_handles); ++i) {
309 ClientToServerMessage message; 311 ClientToServerMessage message;
310 memset(&message, 0, sizeof(message)); 312 memset(&message, 0, sizeof(message));
311 message.type = ClientToServerMessage::kShutdown; 313 message.type = ClientToServerMessage::kShutdown;
312 message.shutdown.token = shutdown_token; 314 message.shutdown.token = shutdown_token;
313 ServerToClientMessage response; 315 ServerToClientMessage response;
314 SendToCrashHandlerServer(pipe_name_16, 316 SendToCrashHandlerServer(pipe_name_16,
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 void __stdcall ExceptionHandlerServer::OnProcessEnd(void* ctx, BOOLEAN) { 501 void __stdcall ExceptionHandlerServer::OnProcessEnd(void* ctx, BOOLEAN) {
500 // This function is executed on the thread pool. 502 // This function is executed on the thread pool.
501 internal::ClientData* client = reinterpret_cast<internal::ClientData*>(ctx); 503 internal::ClientData* client = reinterpret_cast<internal::ClientData*>(ctx);
502 base::AutoLock lock(*client->lock()); 504 base::AutoLock lock(*client->lock());
503 505
504 // Post back to the main thread to have it delete this client record. 506 // Post back to the main thread to have it delete this client record.
505 PostQueuedCompletionStatus(client->port(), 0, ULONG_PTR(client), nullptr); 507 PostQueuedCompletionStatus(client->port(), 0, ULONG_PTR(client), nullptr);
506 } 508 }
507 509
508 } // namespace crashpad 510 } // namespace crashpad
OLDNEW
« no previous file with comments | « util/win/exception_handler_server.h ('k') | util/win/exception_handler_server_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698