Index: services/resource_coordinator/public/cpp/memory/process_local_dump_manager_impl.cc |
diff --git a/services/resource_coordinator/public/cpp/memory/process_local_dump_manager_impl.cc b/services/resource_coordinator/public/cpp/memory/process_local_dump_manager_impl.cc |
index 3b9fb7b3cf4346fa75749c5e987008b54c06858c..eee8fff0786bed6bd5975f858fb8fdbd8cb643f3 100644 |
--- a/services/resource_coordinator/public/cpp/memory/process_local_dump_manager_impl.cc |
+++ b/services/resource_coordinator/public/cpp/memory/process_local_dump_manager_impl.cc |
@@ -58,7 +58,30 @@ void ProcessLocalDumpManagerImpl::RequestProcessMemoryDump( |
const base::trace_event::MemoryDumpRequestArgs& args, |
const RequestProcessMemoryDumpCallback& callback) { |
base::trace_event::MemoryDumpManager::GetInstance()->CreateProcessDump( |
- args, callback); |
+ args, base::Bind(&ProcessLocalDumpManagerImpl::OnProcessMemoryDumpDone, |
+ base::Unretained(this), callback)); |
+} |
+ |
+void ProcessLocalDumpManagerImpl::OnProcessMemoryDumpDone( |
+ const RequestProcessMemoryDumpCallback& callback, |
+ uint64_t dump_guid, |
+ bool success, |
+ const base::Optional<base::trace_event::MemoryDumpCallbackResult>& result) { |
+ mojom::ProcessMemoryDumpPtr process_memory_dump( |
+ mojom::ProcessMemoryDump::New()); |
+ process_memory_dump->process_type = config_.process_type(); |
+ if (result) { |
+ process_memory_dump->os_dump = result->os_dump; |
dcheng
2017/05/12 08:07:41
Is there a reason to switch from using StructTrait
Primiano Tucci (use gerrit)
2017/05/12 11:42:46
Yes. the MemoryDumpManager::CreateProcessDump() ca
|
+ process_memory_dump->chrome_dump = result->chrome_dump; |
+ for (const auto& kv : result->extra_processes_dump) { |
+ const base::ProcessId pid = kv.first; |
+ const base::trace_event::MemoryDumpCallbackResult::OSMemDump& |
+ os_mem_dump = kv.second; |
+ DCHECK_EQ(0u, process_memory_dump->extra_processes_dump.count(pid)); |
+ process_memory_dump->extra_processes_dump[pid] = os_mem_dump; |
+ } |
+ } |
+ callback.Run(dump_guid, success, std::move(process_memory_dump)); |
} |
void ProcessLocalDumpManagerImpl::RequestGlobalMemoryDump( |
@@ -70,23 +93,33 @@ void ProcessLocalDumpManagerImpl::RequestGlobalMemoryDump( |
// CoordinatorImpl::RequestGlobalMemoryDump). If the delegate is in a child |
// process, parallel requests will be cancelled. |
// |
- // TODO(chiniforooshan): Unify the child and browser behavior. |
+ // TODO(primiano): Remove all this boilerplate. There should be no need of |
+ // any lock, proxy, callback adaption or early out. The service is able to |
+ // deal with queueing. |
if (task_runner_) { |
+ auto callback_proxy = |
+ base::Bind(&ProcessLocalDumpManagerImpl::MemoryDumpCallbackProxy, |
+ base::Unretained(this), callback); |
task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&mojom::Coordinator::RequestGlobalMemoryDump, |
- base::Unretained(coordinator_.get()), args, callback)); |
+ base::Unretained(coordinator_.get()), args, callback_proxy)); |
return; |
} |
+ bool early_out_because_of_another_dump_pending = false; |
{ |
base::AutoLock lock(pending_memory_dump_guid_lock_); |
- if (pending_memory_dump_guid_) { |
- callback.Run(args.dump_guid, false); |
- return; |
- } |
- pending_memory_dump_guid_ = args.dump_guid; |
+ if (pending_memory_dump_guid_) |
+ early_out_because_of_another_dump_pending = true; |
+ else |
+ pending_memory_dump_guid_ = args.dump_guid; |
+ } |
+ if (early_out_because_of_another_dump_pending) { |
+ callback.Run(args.dump_guid, false); |
+ return; |
} |
+ |
auto callback_proxy = |
base::Bind(&ProcessLocalDumpManagerImpl::MemoryDumpCallbackProxy, |
base::Unretained(this), callback); |
@@ -96,12 +129,17 @@ void ProcessLocalDumpManagerImpl::RequestGlobalMemoryDump( |
void ProcessLocalDumpManagerImpl::MemoryDumpCallbackProxy( |
const base::trace_event::GlobalMemoryDumpCallback& callback, |
uint64_t dump_guid, |
- bool success) { |
+ bool success, |
+ mojom::GlobalMemoryDumpPtr) { |
{ |
base::AutoLock lock(pending_memory_dump_guid_lock_); |
- DCHECK_NE(0U, pending_memory_dump_guid_); |
pending_memory_dump_guid_ = 0; |
} |
+ |
+ // The GlobalMemoryDumpPtr argument is ignored. The actual data of the dump |
+ // is exposed only through the service and is not passed back to base. |
+ // TODO(primiano): All these roundtrips are transitional until we move all |
+ // the clients of memory-infra to use directly the service. crbug.com/720352 . |
callback.Run(dump_guid, success); |
} |