Branch data Line data Source code
1 : : /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2 : : // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
3 : : // SPDX-FileCopyrightText: 2008 litl, LLC
4 : : // SPDX-FileCopyrightText: 2021 Canonical, Ltd
5 : :
6 : : #ifndef GJS_MEM_PRIVATE_H_
7 : : #define GJS_MEM_PRIVATE_H_
8 : :
9 : : #include <config.h>
10 : :
11 : : #include <stddef.h> // for size_t
12 : :
13 : : #include <atomic>
14 : :
15 : : // clang-format off
16 : : #define GJS_FOR_EACH_COUNTER(macro) \
17 : : macro(boxed_instance, 0) \
18 : : macro(boxed_prototype, 1) \
19 : : macro(closure, 2) \
20 : : macro(function, 3) \
21 : : macro(fundamental_instance, 4) \
22 : : macro(fundamental_prototype, 5) \
23 : : macro(gerror_instance, 6) \
24 : : macro(gerror_prototype, 7) \
25 : : macro(interface, 8) \
26 : : macro(module, 9) \
27 : : macro(ns, 10) \
28 : : macro(object_instance, 11) \
29 : : macro(object_prototype, 12) \
30 : : macro(param, 13) \
31 : : macro(union_instance, 14) \
32 : : macro(union_prototype, 15)
33 : : // clang-format on
34 : :
35 : : namespace Gjs {
36 : : namespace Memory {
37 : :
38 : : struct Counter {
39 : 1887 : explicit Counter(const char* n) : name(n) {}
40 : : std::atomic_int64_t value = ATOMIC_VAR_INIT(0);
41 : : const char* name;
42 : : };
43 : :
44 : : namespace Counters {
45 : : #define GJS_DECLARE_COUNTER(name, ix) extern Counter name;
46 : : GJS_DECLARE_COUNTER(everything, -1)
47 : : GJS_FOR_EACH_COUNTER(GJS_DECLARE_COUNTER)
48 : : #undef GJS_DECLARE_COUNTER
49 : :
50 : : template <Counter* counter>
51 : 38845 : constexpr void inc() {
52 : 38845 : everything.value++;
53 : 38845 : counter->value++;
54 : 38845 : }
55 : :
56 : : template <Counter* counter>
57 : 38631 : constexpr void dec() {
58 : 38631 : counter->value--;
59 : 38631 : everything.value--;
60 : 38631 : }
61 : :
62 : : } // namespace Counters
63 : : } // namespace Memory
64 : : } // namespace Gjs
65 : :
66 : : #define COUNT(name, ix) +1
67 : : static constexpr size_t GJS_N_COUNTERS = 0 GJS_FOR_EACH_COUNTER(COUNT);
68 : : #undef COUNT
69 : :
70 : : static constexpr const char GJS_COUNTER_DESCRIPTIONS[GJS_N_COUNTERS][52] = {
71 : : // max length of description string ---------------v
72 : : "Number of boxed type wrapper objects",
73 : : "Number of boxed type prototype objects",
74 : : "Number of signal handlers",
75 : : "Number of introspected functions",
76 : : "Number of fundamental type wrapper objects",
77 : : "Number of fundamental type prototype objects",
78 : : "Number of GError wrapper objects",
79 : : "Number of GError prototype objects",
80 : : "Number of GObject interface objects",
81 : : "Number of modules",
82 : : "Number of GI namespace objects",
83 : : "Number of GObject wrapper objects",
84 : : "Number of GObject prototype objects",
85 : : "Number of GParamSpec wrapper objects",
86 : : "Number of C union wrapper objects",
87 : : "Number of C union prototype objects",
88 : : };
89 : :
90 : : #define GJS_INC_COUNTER(name) \
91 : : (Gjs::Memory::Counters::inc<&Gjs::Memory::Counters::name>());
92 : :
93 : : #define GJS_DEC_COUNTER(name) \
94 : : (Gjs::Memory::Counters::dec<&Gjs::Memory::Counters::name>());
95 : :
96 : : #define GJS_GET_COUNTER(name) (Gjs::Memory::Counters::name.value.load())
97 : :
98 : : #endif // GJS_MEM_PRIVATE_H_
|