/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef LIBMEMUNREACHABLE_LEAK_FOLDING_H_ #define LIBMEMUNREACHABLE_LEAK_FOLDING_H_ #include "HeapWalker.h" class LeakFolding { public: LeakFolding(Allocator allocator, HeapWalker& heap_walker) : allocator_(allocator), heap_walker_(heap_walker), leak_map_(allocator), leak_graph_(allocator), leak_scc_(allocator) {} bool FoldLeaks(); struct Leak { const Range range; size_t referenced_count; size_t referenced_size; }; bool Leaked(allocator::vector& leaked, size_t* num_leaks_out, size_t* leak_bytes_out); private: DISALLOW_COPY_AND_ASSIGN(LeakFolding); Allocator allocator_; HeapWalker& heap_walker_; struct SCCInfo { public: Node node; size_t count; size_t size; size_t cuumulative_count; size_t cuumulative_size; bool dominator; SCCInfo* accumulator; explicit SCCInfo(Allocator allocator) : node(this, allocator), count(0), size(0), cuumulative_count(0), cuumulative_size(0), dominator(false), accumulator(nullptr) {} private: SCCInfo(SCCInfo&&) = delete; DISALLOW_COPY_AND_ASSIGN(SCCInfo); }; struct LeakInfo { public: Node node; const Range range; SCCInfo* scc; LeakInfo(const Range& range, Allocator allocator) : node(this, allocator), range(range), scc(nullptr) {} private: DISALLOW_COPY_AND_ASSIGN(LeakInfo); }; void ComputeDAG(); void AccumulateLeaks(SCCInfo* dominator); allocator::map leak_map_; Graph leak_graph_; allocator::vector::unique_ptr> leak_scc_; }; #endif // LIBMEMUNREACHABLE_LEAK_FOLDING_H_