blob: f1d0a5fbffb54dd7e0746483603f1a5db1b45ef9 [file] [log] [blame]
Brian Carlstrom413e89f2013-10-21 23:53:49 -07001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "allocator.h"
18
19#include <inttypes.h>
20#include <stdlib.h>
21
Mathieu Chartierbad02672014-08-25 13:08:22 -070022#include "atomic.h"
Brian Carlstrom413e89f2013-10-21 23:53:49 -070023#include "base/logging.h"
Mathieu Chartierbad02672014-08-25 13:08:22 -070024#include "thread-inl.h"
Brian Carlstrom413e89f2013-10-21 23:53:49 -070025
26namespace art {
27
Ian Rogerse77493c2014-08-20 15:08:45 -070028class MallocAllocator FINAL : public Allocator {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070029 public:
30 explicit MallocAllocator() {}
31 ~MallocAllocator() {}
32
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070033 void* Alloc(size_t size) {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070034 return calloc(sizeof(uint8_t), size);
35 }
36
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070037 void Free(void* p) {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070038 free(p);
39 }
40
41 private:
42 DISALLOW_COPY_AND_ASSIGN(MallocAllocator);
43};
44
45MallocAllocator g_malloc_allocator;
46
Ian Rogerse77493c2014-08-20 15:08:45 -070047class NoopAllocator FINAL : public Allocator {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070048 public:
49 explicit NoopAllocator() {}
50 ~NoopAllocator() {}
51
Roland Levillain4b8f1ec2015-08-26 18:34:03 +010052 void* Alloc(size_t size ATTRIBUTE_UNUSED) {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070053 LOG(FATAL) << "NoopAllocator::Alloc should not be called";
Ian Rogers6a3c1fc2014-10-31 00:33:20 -070054 UNREACHABLE();
Brian Carlstrom413e89f2013-10-21 23:53:49 -070055 }
56
Roland Levillain4b8f1ec2015-08-26 18:34:03 +010057 void Free(void* p ATTRIBUTE_UNUSED) {
Brian Carlstrom413e89f2013-10-21 23:53:49 -070058 // Noop.
59 }
60
61 private:
62 DISALLOW_COPY_AND_ASSIGN(NoopAllocator);
63};
64
65NoopAllocator g_noop_allocator;
66
67Allocator* Allocator::GetMallocAllocator() {
68 return &g_malloc_allocator;
69}
70
71Allocator* Allocator::GetNoopAllocator() {
72 return &g_noop_allocator;
73}
74
Ian Rogers7e70b002014-10-08 11:47:24 -070075namespace TrackedAllocators {
76
Mathieu Chartier6e88ef62014-10-14 15:01:24 -070077// These globals are safe since they don't have any non-trivial destructors.
Ian Rogers7e70b002014-10-08 11:47:24 -070078Atomic<size_t> g_bytes_used[kAllocatorTagCount];
79volatile size_t g_max_bytes_used[kAllocatorTagCount];
80Atomic<uint64_t> g_total_bytes_used[kAllocatorTagCount];
81
82void Dump(std::ostream& os) {
Mathieu Chartierbad02672014-08-25 13:08:22 -070083 if (kEnableTrackingAllocator) {
84 os << "Dumping native memory usage\n";
85 for (size_t i = 0; i < kAllocatorTagCount; ++i) {
Ian Rogers7e70b002014-10-08 11:47:24 -070086 uint64_t bytes_used = g_bytes_used[i].LoadRelaxed();
87 uint64_t max_bytes_used = g_max_bytes_used[i];
88 uint64_t total_bytes_used = g_total_bytes_used[i].LoadRelaxed();
Mathieu Chartierbad02672014-08-25 13:08:22 -070089 if (total_bytes_used != 0) {
90 os << static_cast<AllocatorTag>(i) << " active=" << bytes_used << " max="
91 << max_bytes_used << " total=" << total_bytes_used << "\n";
92 }
93 }
94 }
95}
Brian Carlstrom413e89f2013-10-21 23:53:49 -070096
Ian Rogers7e70b002014-10-08 11:47:24 -070097} // namespace TrackedAllocators
98
Brian Carlstrom413e89f2013-10-21 23:53:49 -070099} // namespace art