KiCad PCB EDA Suite
Loading...
Searching...
No Matches
leak_at_exit.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef KICAD_LEAK_AT_EXIT_H
21#define KICAD_LEAK_AT_EXIT_H
22
23#include <mutex>
24
38
39#ifdef KICAD_SANITIZE_ADDRESS
40#include <sanitizer/lsan_interface.h>
41#define LSAN_IGNORE( ptr ) __lsan_ignore_object( ptr )
42#else
43#define LSAN_IGNORE( ptr ) (void)( ptr )
44#endif
45
46
66template <typename T>
68{
69public:
70 LEAK_AT_EXIT() : m_instance( nullptr ) {}
71
72 // Non-copyable, non-movable
73 LEAK_AT_EXIT( const LEAK_AT_EXIT& ) = delete;
74 LEAK_AT_EXIT& operator=( const LEAK_AT_EXIT& ) = delete;
77
82 T& Get()
83 {
84 std::call_once( m_initFlag, [this]()
85 {
86 m_instance = new T();
88 } );
89
90 return *m_instance;
91 }
92
93 T& operator*() { return Get(); }
94 T* operator->() { return &Get(); }
95
96 // Allow implicit conversion to reference for compatibility
97 operator T&() { return Get(); }
98
99private:
101 std::once_flag m_initFlag;
102};
103
104
105#endif // KICAD_LEAK_AT_EXIT_H
LEAK_AT_EXIT(LEAK_AT_EXIT &&)=delete
LEAK_AT_EXIT & operator=(const LEAK_AT_EXIT &)=delete
LEAK_AT_EXIT(const LEAK_AT_EXIT &)=delete
std::once_flag m_initFlag
LEAK_AT_EXIT & operator=(LEAK_AT_EXIT &&)=delete
T & Get()
Access the underlying object, creating it on first call.
#define LSAN_IGNORE(ptr)