Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / base / memory / discardable_memory_emulated.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/memory/discardable_memory_emulated.h"
6
7 #include "base/lazy_instance.h"
8 #include "base/memory/discardable_memory_manager.h"
9
10 namespace base {
11 namespace {
12
13 base::LazyInstance<internal::DiscardableMemoryManager>::Leaky g_manager =
14     LAZY_INSTANCE_INITIALIZER;
15
16 }  // namespace
17
18 namespace internal {
19
20 DiscardableMemoryEmulated::DiscardableMemoryEmulated(size_t bytes)
21     : bytes_(bytes),
22       is_locked_(false) {
23   g_manager.Pointer()->Register(this, bytes);
24 }
25
26 DiscardableMemoryEmulated::~DiscardableMemoryEmulated() {
27   if (is_locked_)
28     Unlock();
29   g_manager.Pointer()->Unregister(this);
30 }
31
32 // static
33 void DiscardableMemoryEmulated::RegisterMemoryPressureListeners() {
34   g_manager.Pointer()->RegisterMemoryPressureListener();
35 }
36
37 // static
38 void DiscardableMemoryEmulated::UnregisterMemoryPressureListeners() {
39   g_manager.Pointer()->UnregisterMemoryPressureListener();
40 }
41
42 // static
43 void DiscardableMemoryEmulated::PurgeForTesting() {
44   g_manager.Pointer()->PurgeAll();
45 }
46
47 bool DiscardableMemoryEmulated::Initialize() {
48   return Lock() == DISCARDABLE_MEMORY_LOCK_STATUS_PURGED;
49 }
50
51 DiscardableMemoryLockStatus DiscardableMemoryEmulated::Lock() {
52   DCHECK(!is_locked_);
53
54   bool purged = false;
55   if (!g_manager.Pointer()->AcquireLock(this, &purged))
56     return DISCARDABLE_MEMORY_LOCK_STATUS_FAILED;
57
58   is_locked_ = true;
59   return purged ? DISCARDABLE_MEMORY_LOCK_STATUS_PURGED
60                 : DISCARDABLE_MEMORY_LOCK_STATUS_SUCCESS;
61 }
62
63 void DiscardableMemoryEmulated::Unlock() {
64   DCHECK(is_locked_);
65   g_manager.Pointer()->ReleaseLock(this);
66   is_locked_ = false;
67 }
68
69 void* DiscardableMemoryEmulated::Memory() const {
70   DCHECK(is_locked_);
71   DCHECK(memory_);
72   return memory_.get();
73 }
74
75 bool DiscardableMemoryEmulated::AllocateAndAcquireLock() {
76   if (memory_)
77     return true;
78
79   memory_.reset(new uint8[bytes_]);
80   return false;
81 }
82
83 void DiscardableMemoryEmulated::Purge() {
84   memory_.reset();
85 }
86
87 }  // namespace internal
88 }  // namespace base