/* * Copyright (C) 2018 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 SRC_PROFILING_MEMORY_SYSTEM_PROPERTY_H_ #define SRC_PROFILING_MEMORY_SYSTEM_PROPERTY_H_ #include <map> #include <string> namespace perfetto { namespace profiling { // SystemProperties allows to set properties in a reference counted fashion. // SetAll() is used to enable startup profiling for all programs, SetProperty // can be used to enable startup profiling for a specific program name. // Both of those return opaque Handles that need to be held on to as long as // startup profiling should be enabled. // // This automatically manages the heappprofd.enable flag, which is first // checked to determine whether to check the program name specific flag. // Once the last Handle for a given program name goes away, the flag for the // program name is unset. Once the last of all Handles goes away, the // heapprofd.enable flag is unset. // See // https://android.googlesource.com/platform/bionic/+/0dbe6d1aec12d2f30f0331dcfea6dc8e8c55cf97/libc/bionic/malloc_common.cpp#473 class SystemProperties { public: class Handle { public: friend void swap(SystemProperties::Handle&, SystemProperties::Handle&); Handle(const Handle&) = delete; Handle& operator=(const Handle&) = delete; Handle(Handle&&); Handle& operator=(Handle&&); friend class SystemProperties; ~Handle(); operator bool(); private: explicit Handle(SystemProperties* system_properties, std::string property); explicit Handle(SystemProperties* system_properties); SystemProperties* system_properties_; std::string property_; bool all_ = false; }; Handle SetProperty(std::string name); Handle SetAll(); static void ResetHeapprofdProperties(); virtual ~SystemProperties(); protected: // virtual for testing. virtual bool SetAndroidProperty(const std::string& name, const std::string& value); private: void UnsetProperty(const std::string& name); void UnsetAll(); size_t alls_ = 0; std::map<std::string, size_t> properties_; }; void swap(SystemProperties::Handle& a, SystemProperties::Handle& b); } // namespace profiling } // namespace perfetto #endif // SRC_PROFILING_MEMORY_SYSTEM_PROPERTY_H_