1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #include "allocator.h" 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker #include <inttypes.h> 20*795d594fSAndroid Build Coastguard Worker #include <stdlib.h> 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h> 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker #include "atomic.h" 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker namespace art { 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker class CallocAllocator final : public Allocator { 29*795d594fSAndroid Build Coastguard Worker public: CallocAllocator()30*795d594fSAndroid Build Coastguard Worker CallocAllocator() {} ~CallocAllocator()31*795d594fSAndroid Build Coastguard Worker ~CallocAllocator() {} 32*795d594fSAndroid Build Coastguard Worker Alloc(size_t size)33*795d594fSAndroid Build Coastguard Worker void* Alloc(size_t size) override { 34*795d594fSAndroid Build Coastguard Worker return calloc(sizeof(uint8_t), size); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker Free(void * p)37*795d594fSAndroid Build Coastguard Worker void Free(void* p) override { 38*795d594fSAndroid Build Coastguard Worker free(p); 39*795d594fSAndroid Build Coastguard Worker } 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker private: 42*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(CallocAllocator); 43*795d594fSAndroid Build Coastguard Worker }; 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker CallocAllocator g_malloc_allocator; 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker class NoopAllocator final : public Allocator { 48*795d594fSAndroid Build Coastguard Worker public: NoopAllocator()49*795d594fSAndroid Build Coastguard Worker NoopAllocator() {} ~NoopAllocator()50*795d594fSAndroid Build Coastguard Worker ~NoopAllocator() {} 51*795d594fSAndroid Build Coastguard Worker Alloc(size_t size)52*795d594fSAndroid Build Coastguard Worker void* Alloc([[maybe_unused]] size_t size) override { 53*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "NoopAllocator::Alloc should not be called"; 54*795d594fSAndroid Build Coastguard Worker UNREACHABLE(); 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker Free(void * p)57*795d594fSAndroid Build Coastguard Worker void Free([[maybe_unused]] void* p) override { 58*795d594fSAndroid Build Coastguard Worker // Noop. 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker private: 62*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(NoopAllocator); 63*795d594fSAndroid Build Coastguard Worker }; 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker NoopAllocator g_noop_allocator; 66*795d594fSAndroid Build Coastguard Worker GetCallocAllocator()67*795d594fSAndroid Build Coastguard WorkerAllocator* Allocator::GetCallocAllocator() { 68*795d594fSAndroid Build Coastguard Worker return &g_malloc_allocator; 69*795d594fSAndroid Build Coastguard Worker } 70*795d594fSAndroid Build Coastguard Worker GetNoopAllocator()71*795d594fSAndroid Build Coastguard WorkerAllocator* Allocator::GetNoopAllocator() { 72*795d594fSAndroid Build Coastguard Worker return &g_noop_allocator; 73*795d594fSAndroid Build Coastguard Worker } 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker namespace TrackedAllocators { 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker // These globals are safe since they don't have any non-trivial destructors. 78*795d594fSAndroid Build Coastguard Worker Atomic<size_t> g_bytes_used[kAllocatorTagCount]; 79*795d594fSAndroid Build Coastguard Worker Atomic<size_t> g_max_bytes_used[kAllocatorTagCount]; 80*795d594fSAndroid Build Coastguard Worker Atomic<uint64_t> g_total_bytes_used[kAllocatorTagCount]; 81*795d594fSAndroid Build Coastguard Worker Dump(std::ostream & os)82*795d594fSAndroid Build Coastguard Workervoid Dump(std::ostream& os) { 83*795d594fSAndroid Build Coastguard Worker if (kEnableTrackingAllocator) { 84*795d594fSAndroid Build Coastguard Worker os << "Dumping native memory usage\n"; 85*795d594fSAndroid Build Coastguard Worker for (size_t i = 0; i < kAllocatorTagCount; ++i) { 86*795d594fSAndroid Build Coastguard Worker uint64_t bytes_used = g_bytes_used[i].load(std::memory_order_relaxed); 87*795d594fSAndroid Build Coastguard Worker uint64_t max_bytes_used = g_max_bytes_used[i].load(std::memory_order_relaxed); 88*795d594fSAndroid Build Coastguard Worker uint64_t total_bytes_used = g_total_bytes_used[i].load(std::memory_order_relaxed); 89*795d594fSAndroid Build Coastguard Worker if (total_bytes_used != 0) { 90*795d594fSAndroid Build Coastguard Worker os << static_cast<AllocatorTag>(i) << " active=" << bytes_used << " max=" 91*795d594fSAndroid Build Coastguard Worker << max_bytes_used << " total=" << total_bytes_used << "\n"; 92*795d594fSAndroid Build Coastguard Worker } 93*795d594fSAndroid Build Coastguard Worker } 94*795d594fSAndroid Build Coastguard Worker } 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker 97*795d594fSAndroid Build Coastguard Worker } // namespace TrackedAllocators 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker } // namespace art 100