1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_SCOPED_PDH_QUERY_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_SCOPED_PDH_QUERY_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <pdh.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/scoped_generic.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base::win { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace internal { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker struct ScopedPdhQueryTraits { InvalidValueScopedPdhQueryTraits18*6777b538SAndroid Build Coastguard Worker static PDH_HQUERY InvalidValue() { return nullptr; } FreeScopedPdhQueryTraits19*6777b538SAndroid Build Coastguard Worker static void Free(PDH_HQUERY query) { ::PdhCloseQuery(query); } 20*6777b538SAndroid Build Coastguard Worker }; 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker } // namespace internal 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker // ScopedPdhQuery is a wrapper around a PDH_HQUERY, the handle used by 25*6777b538SAndroid Build Coastguard Worker // Performance Counters functions (see 26*6777b538SAndroid Build Coastguard Worker // https://learn.microsoft.com/en-us/windows/win32/api/_perf/.) Prefer this to 27*6777b538SAndroid Build Coastguard Worker // using PDH_HQUERY directly to make sure that handles are always closed when 28*6777b538SAndroid Build Coastguard Worker // going out of scope. 29*6777b538SAndroid Build Coastguard Worker // 30*6777b538SAndroid Build Coastguard Worker // Example use: 31*6777b538SAndroid Build Coastguard Worker // 32*6777b538SAndroid Build Coastguard Worker // ScopedPdhQuery pdh_query = ScopedPdhQuery::Create(); 33*6777b538SAndroid Build Coastguard Worker // if (pdh_query.is_valid()) { 34*6777b538SAndroid Build Coastguard Worker // ::PdhCollectQueryData(pdh_query.get(), ...); 35*6777b538SAndroid Build Coastguard Worker // } 36*6777b538SAndroid Build Coastguard Worker // 37*6777b538SAndroid Build Coastguard Worker // To adopt an already-open handle: 38*6777b538SAndroid Build Coastguard Worker // 39*6777b538SAndroid Build Coastguard Worker // PDH_HQUERY pdh_handle; 40*6777b538SAndroid Build Coastguard Worker // PDH_STATUS status = ::PdhOpenQuery(..., &pdh_handle); 41*6777b538SAndroid Build Coastguard Worker // if (status == ERROR_SUCCESS) { 42*6777b538SAndroid Build Coastguard Worker // ScopedPdhQuery pdh_query(pdh_handle); 43*6777b538SAndroid Build Coastguard Worker // ::PdhCollectCollectQueryData(pdh_query.get(), ...); 44*6777b538SAndroid Build Coastguard Worker // } 45*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedPdhQuery 46*6777b538SAndroid Build Coastguard Worker : public ScopedGeneric<PDH_HQUERY, internal::ScopedPdhQueryTraits> { 47*6777b538SAndroid Build Coastguard Worker public: 48*6777b538SAndroid Build Coastguard Worker // Constructs a ScopedPdhQuery from a PDH_HQUERY, and takes ownership of 49*6777b538SAndroid Build Coastguard Worker // `pdh_query` if it is not null. 50*6777b538SAndroid Build Coastguard Worker explicit ScopedPdhQuery(PDH_HQUERY pdh_query = nullptr) ScopedGeneric(pdh_query)51*6777b538SAndroid Build Coastguard Worker : ScopedGeneric(pdh_query) {} 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Returns a ScopedPdhQuery to the default real-time data source. Equivalent 54*6777b538SAndroid Build Coastguard Worker // to ::PdhOpenQuery(nullptr, nullptr, &pdh_query). 55*6777b538SAndroid Build Coastguard Worker static ScopedPdhQuery Create(); 56*6777b538SAndroid Build Coastguard Worker }; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker } // namespace base::win 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_SCOPED_PDH_QUERY_H_ 61