Index: chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc |
diff --git a/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc b/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc |
index 81ea2910fd4cad04b75a37f7c94864699a6d2c1e..8ba34bc502507075cd32439273153e032d619063 100644 |
--- a/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc |
+++ b/chrome/browser/media/router/discovery/dial/safe_dial_device_description_parser.cc |
@@ -12,31 +12,34 @@ |
namespace media_router { |
-SafeDialDeviceDescriptionParser::SafeDialDeviceDescriptionParser() {} |
+SafeDialDeviceDescriptionParser::SafeDialDeviceDescriptionParser() |
+ : pending_parsing_requests_(0) {} |
SafeDialDeviceDescriptionParser::~SafeDialDeviceDescriptionParser() {} |
void SafeDialDeviceDescriptionParser::Start( |
const std::string& xml_text, |
const DeviceDescriptionCallback& callback) { |
+ DVLOG(2) << "Start parsing device description..."; |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!utility_process_mojo_client_); |
- DCHECK(callback); |
- device_description_callback_ = callback; |
+ DCHECK(callback); |
- utility_process_mojo_client_ = |
- base::MakeUnique<content::UtilityProcessMojoClient< |
- chrome::mojom::DialDeviceDescriptionParser>>( |
- l10n_util::GetStringUTF16( |
- IDS_UTILITY_PROCESS_DIAL_DEVICE_DESCRIPTION_PARSER_NAME)); |
+ if (!utility_process_mojo_client_) { |
+ DVLOG(2) << "Start utility process in background..."; |
+ utility_process_mojo_client_ = |
+ base::MakeUnique<content::UtilityProcessMojoClient< |
+ chrome::mojom::DialDeviceDescriptionParser>>( |
+ l10n_util::GetStringUTF16( |
+ IDS_UTILITY_PROCESS_DIAL_DEVICE_DESCRIPTION_PARSER_NAME)); |
- utility_process_mojo_client_->set_error_callback(base::Bind( |
- &SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed, |
- base::Unretained(this))); |
+ utility_process_mojo_client_->set_error_callback(base::Bind( |
+ &SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed, this, |
+ callback)); |
- // This starts utility process in the background. |
- utility_process_mojo_client_->Start(); |
+ // This starts utility process in the background. |
+ utility_process_mojo_client_->Start(); |
+ } |
// This call is queued up until the Mojo message pipe has been established to |
// the service running in the utility process. |
@@ -44,26 +47,34 @@ void SafeDialDeviceDescriptionParser::Start( |
xml_text, |
base::Bind( |
&SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionComplete, |
- base::Unretained(this))); |
+ this, callback)); |
+ |
+ ++pending_parsing_requests_; |
} |
void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionComplete( |
+ const DeviceDescriptionCallback& callback, |
chrome::mojom::DialDeviceDescriptionPtr device_description) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(callback); |
- utility_process_mojo_client_.reset(); // Terminate the utility process. |
+ --pending_parsing_requests_; |
+ callback.Run(std::move(device_description)); |
- DCHECK(device_description_callback_); |
- device_description_callback_.Run(std::move(device_description)); |
+ if (!pending_parsing_requests_) |
+ utility_process_mojo_client_.reset(); // Terminate the utility process. |
} |
-void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed() { |
+void SafeDialDeviceDescriptionParser::OnParseDeviceDescriptionFailed( |
+ const DeviceDescriptionCallback& callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(callback); |
- utility_process_mojo_client_.reset(); // Terminate the utility process. |
+ --pending_parsing_requests_; |
+ callback.Run(nullptr); |
- DCHECK(device_description_callback_); |
- device_description_callback_.Run(nullptr); |
+ if (!pending_parsing_requests_) |
+ utility_process_mojo_client_.reset(); // Terminate the utility process. |
} |
} // namespace media_router |