Skip to content

Commit f53dd66

Browse files
vkconfig: Fix macOS exit crash
1 parent fd549c3 commit f53dd66

File tree

8 files changed

+51
-25
lines changed

8 files changed

+51
-25
lines changed

vkconfig_cmd/main_doc.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,17 @@ int run_doc(const CommandLine& command_line) {
8181
assert(command_line.command == COMMAND_DOC);
8282
assert(command_line.error == ERROR_NONE);
8383

84-
Configurator& configurator = Configurator::Get();
85-
configurator.Init(CONFIGURATOR_MODE_CMD);
84+
ConfiguratorGuard configurator_guard(CONFIGURATOR_MODE_CMD);
8685

8786
switch (command_line.command_doc_arg) {
8887
case COMMAND_DOC_HTML: {
89-
return run_doc_html(configurator, command_line);
88+
return run_doc_html(configurator_guard.Get(), command_line);
9089
}
9190
case COMMAND_DOC_MARKDOWN: {
92-
return run_doc_markdown(configurator, command_line);
91+
return run_doc_markdown(configurator_guard.Get(), command_line);
9392
}
9493
case COMMAND_DOC_SETTINGS: {
95-
return run_doc_settings(configurator, command_line);
94+
return run_doc_settings(configurator_guard.Get(), command_line);
9695
}
9796
default: {
9897
assert(0);

vkconfig_cmd/main_layers.cpp

+6-7
Original file line numberDiff line numberDiff line change
@@ -123,24 +123,23 @@ int run_layers(const CommandLine& command_line) {
123123
assert(command_line.command == COMMAND_LAYERS);
124124
assert(command_line.error == ERROR_NONE);
125125

126-
Configurator& configurator = Configurator::Get();
127-
configurator.Init(CONFIGURATOR_MODE_CMD);
126+
ConfiguratorGuard configurator_guard(CONFIGURATOR_MODE_CMD);
128127

129128
switch (command_line.command_layers_arg) {
130129
case COMMAND_LAYERS_OVERRIDE: {
131-
return RunLayersOverride(configurator, command_line);
130+
return RunLayersOverride(configurator_guard.Get(), command_line);
132131
}
133132
case COMMAND_LAYERS_SURRENDER: {
134-
return RunLayersSurrender(configurator, command_line);
133+
return RunLayersSurrender(configurator_guard.Get(), command_line);
135134
}
136135
case COMMAND_LAYERS_PATH: {
137-
return RunLayersPath(configurator, command_line);
136+
return RunLayersPath(configurator_guard.Get(), command_line);
138137
}
139138
case COMMAND_LAYERS_LIST: {
140-
return RunLayersList(configurator, command_line);
139+
return RunLayersList(configurator_guard.Get(), command_line);
141140
}
142141
case COMMAND_LAYERS_VERBOSE: {
143-
return RunLayersVerbose(configurator, command_line);
142+
return RunLayersVerbose(configurator_guard.Get(), command_line);
144143
}
145144
default: {
146145
assert(0);

vkconfig_cmd/main_loader.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -206,27 +206,26 @@ int run_loader(const CommandLine& command_line) {
206206
assert(command_line.command == COMMAND_LOADER);
207207
assert(command_line.error == ERROR_NONE);
208208

209-
Configurator& configurator = Configurator::Get();
210-
configurator.Init(CONFIGURATOR_MODE_CMD);
209+
ConfiguratorGuard configurator_guard(CONFIGURATOR_MODE_CMD);
211210

212211
switch (command_line.command_loader_arg) {
213212
case COMMAND_LOADER_OVERRIDE: {
214-
return RunLoaderOverride(configurator, command_line);
213+
return RunLoaderOverride(configurator_guard.Get(), command_line);
215214
}
216215
case COMMAND_LOADER_SURRENDER: {
217-
return RunLoaderSurrender(configurator, command_line);
216+
return RunLoaderSurrender(configurator_guard.Get(), command_line);
218217
}
219218
case COMMAND_LOADER_LIST: {
220-
return RunLoaderList(configurator, command_line);
219+
return RunLoaderList(configurator_guard.Get(), command_line);
221220
}
222221
case COMMAND_LOADER_IMPORT: {
223-
return RunLoaderImport(configurator, command_line);
222+
return RunLoaderImport(configurator_guard.Get(), command_line);
224223
}
225224
case COMMAND_LOADER_EXPORT: {
226-
return RunLoaderExport(configurator, command_line);
225+
return RunLoaderExport(configurator_guard.Get(), command_line);
227226
}
228227
case COMMAND_LOADER_DELETE: {
229-
return RunLoaderDelete(configurator, command_line);
228+
return RunLoaderDelete(configurator_guard.Get(), command_line);
230229
}
231230
default: {
232231
assert(0);

vkconfig_cmd/main_reset.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
#include <cassert>
2626

2727
static int RunReset(int argc, char* argv[], bool hard) {
28-
Configurator& configurator = Configurator::Get();
29-
configurator.Init(CONFIGURATOR_MODE_CMD);
28+
ConfiguratorGuard configurator_guard(CONFIGURATOR_MODE_CMD);
29+
30+
Configurator& configurator = configurator_guard.Get();
3031
configurator.Reset(hard);
3132

3233
return 0;

vkconfig_core/configurator.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,27 @@
3939
#include <cstdio>
4040
#include <algorithm>
4141

42+
ConfiguratorGuard::ConfiguratorGuard(ConfiguratorMode mode) {
43+
Configurator& configurator = Configurator::Get();
44+
configurator.Init(mode);
45+
}
46+
47+
ConfiguratorGuard::~ConfiguratorGuard() { Configurator::Release(); }
48+
49+
Configurator& ConfiguratorGuard::Get() { return Configurator::Get(); }
50+
51+
static std::unique_ptr<Configurator> configurator = nullptr;
52+
4253
Configurator& Configurator::Get() {
43-
static Configurator configurator;
44-
return configurator;
54+
if (::configurator == nullptr) {
55+
::configurator.reset(new Configurator);
56+
}
57+
58+
return *::configurator;
4559
}
4660

61+
void Configurator::Release() { ::configurator.reset(); }
62+
4763
Configurator::Configurator() : mode(init_mode) {}
4864

4965
Configurator::~Configurator() {

vkconfig_core/configurator.h

+8
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class Configurator {
6767
};
6868

6969
static Configurator& Get();
70+
static void Release();
7071
bool Init(ConfiguratorMode mode);
7172

7273
public:
@@ -160,3 +161,10 @@ class Configurator {
160161
ExecutableScope executable_scope = EXECUTABLE_ANY;
161162
std::string selected_global_configuration = "Validation";
162163
};
164+
165+
struct ConfiguratorGuard {
166+
ConfiguratorGuard(ConfiguratorMode mode);
167+
~ConfiguratorGuard();
168+
169+
Configurator& Get();
170+
};

vkconfig_gui/main.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,13 @@ int main(int argc, char* argv[]) {
153153
configurator.Surrender(OVERRIDE_AREA_ALL);
154154

155155
if (configurator.reset_hard) {
156+
configurator.Release();
157+
156158
singleton.Release();
157159

158160
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
161+
} else {
162+
configurator.Release();
159163
}
160164

161165
return result;

vkconfig_gui/mainwindow.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void MainWindow::commitDataRequest(QSessionManager &manager) {
9090
Configurator &configurator = Configurator::Get();
9191
configurator.Surrender(OVERRIDE_AREA_ALL);
9292

93-
configurator.~Configurator();
93+
Configurator::Release();
9494
}
9595

9696
void MainWindow::UpdateUI(UpdateUIMode mode) {

0 commit comments

Comments
 (0)