Commit 7eccc10d authored by Gordon Guan's avatar Gordon Guan Committed by Commit Bot

Add mutex annotations to DiscardableSharedMemoryManager

Add static thread-safety checks to DiscardableSharedMemoryManager to
ensure lock is acquired before using fields which require
synchronization.

Change-Id: I063676b6d4a03b96c24dde6b509cb368f1f7010e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1862861Reviewed-by: default avatarPeng Huang <penghuang@chromium.org>
Reviewed-by: default avatarBenoit L <lizeb@chromium.org>
Commit-Queue: Gordon Guan <gordonguan@google.com>
Cr-Commit-Position: refs/heads/master@{#707413}
parent 57ca0503
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "base/process/process_handle.h" #include "base/process/process_handle.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/memory_dump_provider.h" #include "base/trace_event/memory_dump_provider.h"
#include "components/discardable_memory/common/discardable_memory_export.h" #include "components/discardable_memory/common/discardable_memory_export.h"
...@@ -128,14 +129,17 @@ class DISCARDABLE_MEMORY_EXPORT DiscardableSharedMemoryManager ...@@ -128,14 +129,17 @@ class DISCARDABLE_MEMORY_EXPORT DiscardableSharedMemoryManager
void DeletedDiscardableSharedMemory(int32_t id, int client_id); void DeletedDiscardableSharedMemory(int32_t id, int client_id);
void OnMemoryPressure( void OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
void ReduceMemoryUsageUntilWithinMemoryLimit(); void ReduceMemoryUsageUntilWithinMemoryLimit()
void ReduceMemoryUsageUntilWithinLimit(size_t limit); EXCLUSIVE_LOCKS_REQUIRED(lock_);
void ReleaseMemory(base::DiscardableSharedMemory* memory); void ReduceMemoryUsageUntilWithinLimit(size_t limit)
EXCLUSIVE_LOCKS_REQUIRED(lock_);
void ReleaseMemory(base::DiscardableSharedMemory* memory)
EXCLUSIVE_LOCKS_REQUIRED(lock_);
void BytesAllocatedChanged(size_t new_bytes_allocated) const; void BytesAllocatedChanged(size_t new_bytes_allocated) const;
// Virtual for tests. // Virtual for tests.
virtual base::Time Now() const; virtual base::Time Now() const;
virtual void ScheduleEnforceMemoryPolicy(); virtual void ScheduleEnforceMemoryPolicy() EXCLUSIVE_LOCKS_REQUIRED(lock_);
// Invalidate weak pointers for the mojo thread. // Invalidate weak pointers for the mojo thread.
void InvalidateMojoThreadWeakPtrs(base::WaitableEvent* event); void InvalidateMojoThreadWeakPtrs(base::WaitableEvent* event);
...@@ -146,19 +150,20 @@ class DISCARDABLE_MEMORY_EXPORT DiscardableSharedMemoryManager ...@@ -146,19 +150,20 @@ class DISCARDABLE_MEMORY_EXPORT DiscardableSharedMemoryManager
using MemorySegmentMap = using MemorySegmentMap =
std::unordered_map<int32_t, scoped_refptr<MemorySegment>>; std::unordered_map<int32_t, scoped_refptr<MemorySegment>>;
using ClientMap = std::unordered_map<int, MemorySegmentMap>; using ClientMap = std::unordered_map<int, MemorySegmentMap>;
ClientMap clients_; ClientMap clients_ GUARDED_BY(lock_);
// Note: The elements in |segments_| are arranged in such a way that they form // Note: The elements in |segments_| are arranged in such a way that they form
// a heap. The LRU memory segment always first. // a heap. The LRU memory segment always first.
using MemorySegmentVector = std::vector<scoped_refptr<MemorySegment>>; using MemorySegmentVector = std::vector<scoped_refptr<MemorySegment>>;
MemorySegmentVector segments_; MemorySegmentVector segments_ GUARDED_BY(lock_);
size_t default_memory_limit_; size_t default_memory_limit_ GUARDED_BY(lock_);
size_t memory_limit_; size_t memory_limit_ GUARDED_BY(lock_);
size_t bytes_allocated_; size_t bytes_allocated_ GUARDED_BY(lock_);
std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_; std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_
scoped_refptr<base::SingleThreadTaskRunner> GUARDED_BY(lock_);
enforce_memory_policy_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> enforce_memory_policy_task_runner_
base::Closure enforce_memory_policy_callback_; GUARDED_BY(lock_);
bool enforce_memory_policy_pending_; base::Closure enforce_memory_policy_callback_ GUARDED_BY(lock_);
bool enforce_memory_policy_pending_ GUARDED_BY(lock_);
// The message loop for running mojom::DiscardableSharedMemoryManager // The message loop for running mojom::DiscardableSharedMemoryManager
// implementations. // implementations.
......
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