Main: allocate ConfigData on the stack
This commit is contained in:
		@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright 2003-2017 The Music Player Daemon Project
 | 
					 * Copyright 2003-2018 The Music Player Daemon Project
 | 
				
			||||||
 * http://www.musicpd.org
 | 
					 * http://www.musicpd.org
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
@@ -22,7 +22,7 @@
 | 
				
			|||||||
#include "ls.hxx"
 | 
					#include "ls.hxx"
 | 
				
			||||||
#include "LogInit.hxx"
 | 
					#include "LogInit.hxx"
 | 
				
			||||||
#include "Log.hxx"
 | 
					#include "Log.hxx"
 | 
				
			||||||
#include "config/Global.hxx"
 | 
					#include "config/File.hxx"
 | 
				
			||||||
#include "decoder/DecoderList.hxx"
 | 
					#include "decoder/DecoderList.hxx"
 | 
				
			||||||
#include "decoder/DecoderPlugin.hxx"
 | 
					#include "decoder/DecoderPlugin.hxx"
 | 
				
			||||||
#include "output/Registry.hxx"
 | 
					#include "output/Registry.hxx"
 | 
				
			||||||
@@ -292,7 +292,12 @@ static void help(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ConfigLoader
 | 
					class ConfigLoader
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						ConfigData &config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
						explicit ConfigLoader(ConfigData &_config) noexcept
 | 
				
			||||||
 | 
							:config(_config) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool TryFile(const Path path);
 | 
						bool TryFile(const Path path);
 | 
				
			||||||
	bool TryFile(const AllocatedPath &base_path, Path path);
 | 
						bool TryFile(const AllocatedPath &base_path, Path path);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -300,7 +305,7 @@ public:
 | 
				
			|||||||
bool ConfigLoader::TryFile(Path path)
 | 
					bool ConfigLoader::TryFile(Path path)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (FileExists(path)) {
 | 
						if (FileExists(path)) {
 | 
				
			||||||
		ReadConfigFile(path);
 | 
							ReadConfigFile(config, path);
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
@@ -315,7 +320,8 @@ bool ConfigLoader::TryFile(const AllocatedPath &base_path, Path path)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
ParseCommandLine(int argc, char **argv, struct options &options)
 | 
					ParseCommandLine(int argc, char **argv, struct options &options,
 | 
				
			||||||
 | 
							 ConfigData &config)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool use_config_file = true;
 | 
						bool use_config_file = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -383,16 +389,16 @@ ParseCommandLine(int argc, char **argv, struct options &options)
 | 
				
			|||||||
		if (result <= 0)
 | 
							if (result <= 0)
 | 
				
			||||||
			throw MakeLastError("MultiByteToWideChar() failed");
 | 
								throw MakeLastError("MultiByteToWideChar() failed");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ReadConfigFile(Path::FromFS(buffer));
 | 
							ReadConfigFile(config, Path::FromFS(buffer));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
		ReadConfigFile(Path::FromFS(config_file));
 | 
							ReadConfigFile(config, Path::FromFS(config_file));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* use default configuration file path */
 | 
						/* use default configuration file path */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ConfigLoader loader;
 | 
						ConfigLoader loader(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool found =
 | 
						bool found =
 | 
				
			||||||
#ifdef _WIN32
 | 
					#ifdef _WIN32
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright 2003-2017 The Music Player Daemon Project
 | 
					 * Copyright 2003-2018 The Music Player Daemon Project
 | 
				
			||||||
 * http://www.musicpd.org
 | 
					 * http://www.musicpd.org
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or modify
 | 
					 * This program is free software; you can redistribute it and/or modify
 | 
				
			||||||
@@ -20,6 +20,8 @@
 | 
				
			|||||||
#ifndef MPD_COMMAND_LINE_HXX
 | 
					#ifndef MPD_COMMAND_LINE_HXX
 | 
				
			||||||
#define MPD_COMMAND_LINE_HXX
 | 
					#define MPD_COMMAND_LINE_HXX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ConfigData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct options {
 | 
					struct options {
 | 
				
			||||||
	bool kill = false;
 | 
						bool kill = false;
 | 
				
			||||||
	bool daemon = true;
 | 
						bool daemon = true;
 | 
				
			||||||
@@ -28,6 +30,7 @@ struct options {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
ParseCommandLine(int argc, char **argv, struct options &options);
 | 
					ParseCommandLine(int argc, char **argv, struct options &options,
 | 
				
			||||||
 | 
							 ConfigData &config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/Main.cxx
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/Main.cxx
									
									
									
									
									
								
							@@ -52,7 +52,7 @@
 | 
				
			|||||||
#include "thread/Slack.hxx"
 | 
					#include "thread/Slack.hxx"
 | 
				
			||||||
#include "net/Init.hxx"
 | 
					#include "net/Init.hxx"
 | 
				
			||||||
#include "lib/icu/Init.hxx"
 | 
					#include "lib/icu/Init.hxx"
 | 
				
			||||||
#include "config/Global.hxx"
 | 
					#include "config/File.hxx"
 | 
				
			||||||
#include "config/Check.hxx"
 | 
					#include "config/Check.hxx"
 | 
				
			||||||
#include "config/Data.hxx"
 | 
					#include "config/Data.hxx"
 | 
				
			||||||
#include "config/Param.hxx"
 | 
					#include "config/Param.hxx"
 | 
				
			||||||
@@ -475,7 +475,7 @@ MainOrThrow(int argc, char *argv[])
 | 
				
			|||||||
	const ODBus::ScopeInit dbus_init;
 | 
						const ODBus::ScopeInit dbus_init;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config_global_init();
 | 
						ConfigData raw_config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ANDROID
 | 
					#ifdef ANDROID
 | 
				
			||||||
	(void)argc;
 | 
						(void)argc;
 | 
				
			||||||
@@ -486,13 +486,12 @@ MainOrThrow(int argc, char *argv[])
 | 
				
			|||||||
		const auto config_path =
 | 
							const auto config_path =
 | 
				
			||||||
			sdcard / Path::FromFS("mpd.conf");
 | 
								sdcard / Path::FromFS("mpd.conf");
 | 
				
			||||||
		if (FileExists(config_path))
 | 
							if (FileExists(config_path))
 | 
				
			||||||
			ReadConfigFile(config_path);
 | 
								ReadConfigFile(raw_config, config_path);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	ParseCommandLine(argc, argv, options);
 | 
						ParseCommandLine(argc, argv, options, raw_config);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const auto &raw_config = GetGlobalConfig();
 | 
					 | 
				
			||||||
	InitPathParser(raw_config);
 | 
						InitPathParser(raw_config);
 | 
				
			||||||
	const auto config = LoadConfig(raw_config);
 | 
						const auto config = LoadConfig(raw_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -714,7 +713,6 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
 | 
				
			|||||||
#ifdef ENABLE_ARCHIVE
 | 
					#ifdef ENABLE_ARCHIVE
 | 
				
			||||||
	archive_plugin_deinit_all();
 | 
						archive_plugin_deinit_all();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	config_global_finish();
 | 
					 | 
				
			||||||
	instance->rtio_thread.Stop();
 | 
						instance->rtio_thread.Stop();
 | 
				
			||||||
	instance->io_thread.Stop();
 | 
						instance->io_thread.Stop();
 | 
				
			||||||
#ifndef ANDROID
 | 
					#ifndef ANDROID
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user