xref: /aosp_15_r20/external/cronet/base/win/scoped_pdh_query.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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