1 /* 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 22 #include "atomic.h" 23 #include "base/logging.h" 24 25 namespace art { 26 27 class MallocAllocator FINAL : public Allocator { 28 public: MallocAllocator()29 explicit MallocAllocator() {} ~MallocAllocator()30 ~MallocAllocator() {} 31 Alloc(size_t size)32 void* Alloc(size_t size) { 33 return calloc(sizeof(uint8_t), size); 34 } 35 Free(void * p)36 void Free(void* p) { 37 free(p); 38 } 39 40 private: 41 DISALLOW_COPY_AND_ASSIGN(MallocAllocator); 42 }; 43 44 MallocAllocator g_malloc_allocator; 45 46 class NoopAllocator FINAL : public Allocator { 47 public: NoopAllocator()48 explicit NoopAllocator() {} ~NoopAllocator()49 ~NoopAllocator() {} 50 Alloc(size_t size ATTRIBUTE_UNUSED)51 void* Alloc(size_t size ATTRIBUTE_UNUSED) { 52 LOG(FATAL) << "NoopAllocator::Alloc should not be called"; 53 UNREACHABLE(); 54 } 55 Free(void * p ATTRIBUTE_UNUSED)56 void Free(void* p ATTRIBUTE_UNUSED) { 57 // Noop. 58 } 59 60 private: 61 DISALLOW_COPY_AND_ASSIGN(NoopAllocator); 62 }; 63 64 NoopAllocator g_noop_allocator; 65 GetMallocAllocator()66Allocator* Allocator::GetMallocAllocator() { 67 return &g_malloc_allocator; 68 } 69 GetNoopAllocator()70Allocator* Allocator::GetNoopAllocator() { 71 return &g_noop_allocator; 72 } 73 74 namespace TrackedAllocators { 75 76 // These globals are safe since they don't have any non-trivial destructors. 77 Atomic<size_t> g_bytes_used[kAllocatorTagCount]; 78 volatile size_t g_max_bytes_used[kAllocatorTagCount]; 79 Atomic<uint64_t> g_total_bytes_used[kAllocatorTagCount]; 80 Dump(std::ostream & os)81void Dump(std::ostream& os) { 82 if (kEnableTrackingAllocator) { 83 os << "Dumping native memory usage\n"; 84 for (size_t i = 0; i < kAllocatorTagCount; ++i) { 85 uint64_t bytes_used = g_bytes_used[i].LoadRelaxed(); 86 uint64_t max_bytes_used = g_max_bytes_used[i]; 87 uint64_t total_bytes_used = g_total_bytes_used[i].LoadRelaxed(); 88 if (total_bytes_used != 0) { 89 os << static_cast<AllocatorTag>(i) << " active=" << bytes_used << " max=" 90 << max_bytes_used << " total=" << total_bytes_used << "\n"; 91 } 92 } 93 } 94 } 95 96 } // namespace TrackedAllocators 97 98 } // namespace art 99