Commit 2053a1f7 authored by Etienne Bergeron's avatar Etienne Bergeron Committed by Commit Bot

Fix memory leak caused by incorrect usage of map

This CL is fixing an memory leak detected by memlog.

The bug got introduced here:
 https://chromium-review.googlesource.com/c/chromium/src/+/1526067

The loopup in the map is using the [] operator which is creating a
default entry when the key is not present. Over the time, that map
came really big and consumes too much memory.

The fix is to not use the [] operator, but to validate the presence
of the key.

R=rockot@chromium.org,siggi@chromium.org
CC=yuzus@chromium.org

Bug: 973200
Change-Id: I701e682deddace850d094c68d75adea1cec391cc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1669101Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarSigurður Ásgeirsson <siggi@chromium.org>
Commit-Queue: Etienne Bergeron <etienneb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#671407}
parent af1510d5
...@@ -348,8 +348,7 @@ void ChannelProxy::Context::AddListenerTaskRunner( ...@@ -348,8 +348,7 @@ void ChannelProxy::Context::AddListenerTaskRunner(
void ChannelProxy::Context::RemoveListenerTaskRunner(int32_t routing_id) { void ChannelProxy::Context::RemoveListenerTaskRunner(int32_t routing_id) {
DCHECK(default_listener_task_runner_->BelongsToCurrentThread()); DCHECK(default_listener_task_runner_->BelongsToCurrentThread());
base::AutoLock lock(listener_thread_task_runners_lock_); base::AutoLock lock(listener_thread_task_runners_lock_);
if (base::Contains(listener_thread_task_runners_, routing_id)) listener_thread_task_runners_.erase(routing_id);
listener_thread_task_runners_.erase(routing_id);
} }
// Called on the IPC::Channel thread. // Called on the IPC::Channel thread.
...@@ -360,10 +359,11 @@ base::SingleThreadTaskRunner* ChannelProxy::Context::GetTaskRunner( ...@@ -360,10 +359,11 @@ base::SingleThreadTaskRunner* ChannelProxy::Context::GetTaskRunner(
return default_listener_task_runner_.get(); return default_listener_task_runner_.get();
base::AutoLock lock(listener_thread_task_runners_lock_); base::AutoLock lock(listener_thread_task_runners_lock_);
base::SingleThreadTaskRunner* task_runner = auto task_runner = listener_thread_task_runners_.find(routing_id);
listener_thread_task_runners_[routing_id].get(); if (task_runner != listener_thread_task_runners_.end()) {
if (task_runner) DCHECK(task_runner->second.get());
return task_runner; return task_runner->second.get();
}
return default_listener_task_runner_.get(); return default_listener_task_runner_.get();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment