Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
71a5c8b8
Commit
71a5c8b8
authored
5 years ago
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Main: allocate Instance on the stack
parent
620a39af
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
89 additions
and
86 deletions
+89
-86
Idle.cxx
src/Idle.cxx
+1
-1
Main.cxx
src/Main.cxx
+81
-78
Main.hxx
src/Main.hxx
+1
-1
Mapper.cxx
src/Mapper.cxx
+4
-4
Win32Main.cxx
src/win32/Win32Main.cxx
+2
-2
No files found.
src/Idle.cxx
View file @
71a5c8b8
...
...
@@ -33,5 +33,5 @@ idle_add(unsigned flags)
{
assert
(
flags
!=
0
);
instance
->
EmitIdle
(
flags
);
global_
instance
->
EmitIdle
(
flags
);
}
This diff is collapsed.
Click to expand it.
src/Main.cxx
View file @
71a5c8b8
...
...
@@ -129,7 +129,7 @@ Context *context;
LogListener
*
logListener
;
#endif
Instance
*
instance
;
Instance
*
global_
instance
;
struct
Config
{
ReplayGainConfig
replay_gain
;
...
...
@@ -166,14 +166,15 @@ glue_mapper_init(const ConfigData &config)
#ifdef ENABLE_DATABASE
static
void
InitStorage
(
const
ConfigData
&
config
,
EventLoop
&
event_loop
)
InitStorage
(
Instance
&
instance
,
EventLoop
&
event_loop
,
const
ConfigData
&
config
)
{
auto
storage
=
CreateConfiguredStorage
(
config
,
event_loop
);
if
(
storage
==
nullptr
)
return
;
CompositeStorage
*
composite
=
new
CompositeStorage
();
instance
->
storage
=
composite
;
instance
.
storage
=
composite
;
composite
->
Mount
(
""
,
std
::
move
(
storage
));
}
...
...
@@ -183,18 +184,19 @@ InitStorage(const ConfigData &config, EventLoop &event_loop)
* process has been daemonized.
*/
static
bool
glue_db_init_and_load
(
const
ConfigData
&
config
)
glue_db_init_and_load
(
Instance
&
instance
,
const
ConfigData
&
config
)
{
auto
db
=
CreateConfiguredDatabase
(
config
,
instance
->
event_loop
,
instance
->
io_thread
.
GetEventLoop
(),
*
instance
);
auto
db
=
CreateConfiguredDatabase
(
config
,
instance
.
event_loop
,
instance
.
io_thread
.
GetEventLoop
(),
instance
);
if
(
!
db
)
return
true
;
if
(
db
->
GetPlugin
().
RequireStorage
())
{
InitStorage
(
config
,
instance
->
io_thread
.
GetEventLoop
());
InitStorage
(
instance
,
instance
.
io_thread
.
GetEventLoop
(),
config
);
if
(
instance
->
storage
==
nullptr
)
{
if
(
instance
.
storage
==
nullptr
)
{
LogDefault
(
config_domain
,
"Found database setting without "
"music_directory - disabling database"
);
...
...
@@ -213,25 +215,25 @@ glue_db_init_and_load(const ConfigData &config)
std
::
throw_with_nested
(
std
::
runtime_error
(
"Failed to open database plugin"
));
}
instance
->
database
=
std
::
move
(
db
);
instance
.
database
=
std
::
move
(
db
);
auto
*
sdb
=
dynamic_cast
<
SimpleDatabase
*>
(
instance
->
database
.
get
());
auto
*
sdb
=
dynamic_cast
<
SimpleDatabase
*>
(
instance
.
database
.
get
());
if
(
sdb
==
nullptr
)
return
true
;
instance
->
update
=
new
UpdateService
(
config
,
instance
->
event_loop
,
*
sdb
,
static_cast
<
CompositeStorage
&>
(
*
instance
->
storage
),
*
instance
);
instance
.
update
=
new
UpdateService
(
config
,
instance
.
event_loop
,
*
sdb
,
static_cast
<
CompositeStorage
&>
(
*
instance
.
storage
),
instance
);
/* run database update after daemonization? */
return
sdb
->
FileExists
();
}
static
bool
InitDatabaseAndStorage
(
const
ConfigData
&
config
)
InitDatabaseAndStorage
(
Instance
&
instance
,
const
ConfigData
&
config
)
{
const
bool
create_db
=
!
glue_db_init_and_load
(
config
);
const
bool
create_db
=
!
glue_db_init_and_load
(
instance
,
config
);
return
create_db
;
}
...
...
@@ -255,23 +257,24 @@ LoadStickerDatabase(const ConfigData &config)
#endif
static
void
glue_state_file_init
(
const
ConfigData
&
raw_config
)
glue_state_file_init
(
Instance
&
instance
,
const
ConfigData
&
raw_config
)
{
StateFileConfig
config
(
raw_config
);
if
(
!
config
.
IsEnabled
())
return
;
instance
->
state_file
=
new
StateFile
(
std
::
move
(
config
),
instance
->
partitions
.
front
(),
instance
->
event_loop
);
instance
->
state_file
->
Read
();
instance
.
state_file
=
new
StateFile
(
std
::
move
(
config
),
instance
.
partitions
.
front
(),
instance
.
event_loop
);
instance
.
state_file
->
Read
();
}
/**
* Initialize the decoder and player core, including the music pipe.
*/
static
void
initialize_decoder_and_player
(
const
ConfigData
&
config
,
initialize_decoder_and_player
(
Instance
&
instance
,
const
ConfigData
&
config
,
const
ReplayGainConfig
&
replay_gain_config
)
{
const
ConfigParam
*
param
;
...
...
@@ -318,13 +321,13 @@ initialize_decoder_and_player(const ConfigData &config,
}
}
instance
->
partitions
.
emplace_back
(
*
instance
,
"default"
,
max_length
,
buffered_chunks
,
configured_audio_format
,
replay_gain_config
);
auto
&
partition
=
instance
->
partitions
.
back
();
instance
.
partitions
.
emplace_back
(
instance
,
"default"
,
max_length
,
buffered_chunks
,
configured_audio_format
,
replay_gain_config
);
auto
&
partition
=
instance
.
partitions
.
back
();
try
{
param
=
config
.
GetParam
(
ConfigOption
::
REPLAYGAIN
);
...
...
@@ -386,7 +389,8 @@ main(int argc, char *argv[]) noexcept
#endif
static
void
mpd_main_after_fork
(
const
ConfigData
&
raw_config
,
mpd_main_after_fork
(
Instance
&
instance
,
const
ConfigData
&
raw_config
,
const
Config
&
config
);
static
inline
void
...
...
@@ -422,29 +426,27 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
log_init
(
raw_config
,
options
.
verbose
,
options
.
log_stderr
);
instance
=
new
Instance
();
AtScopeExit
()
{
delete
instance
;
instance
=
nullptr
;
};
Instance
instance
;
global_instance
=
&
instance
;
#ifdef ENABLE_NEIGHBOR_PLUGINS
instance
->
neighbors
=
std
::
make_unique
<
NeighborGlue
>
();
instance
->
neighbors
->
Init
(
raw_config
,
instance
->
io_thread
.
GetEventLoop
(),
*
instance
);
instance
.
neighbors
=
std
::
make_unique
<
NeighborGlue
>
();
instance
.
neighbors
->
Init
(
raw_config
,
instance
.
io_thread
.
GetEventLoop
(),
instance
);
if
(
instance
->
neighbors
->
IsEmpty
())
instance
->
neighbors
.
reset
();
if
(
instance
.
neighbors
->
IsEmpty
())
instance
.
neighbors
.
reset
();
#endif
const
unsigned
max_clients
=
raw_config
.
GetPositive
(
ConfigOption
::
MAX_CONN
,
10
);
instance
->
client_list
=
new
ClientList
(
max_clients
);
instance
.
client_list
=
new
ClientList
(
max_clients
);
initialize_decoder_and_player
(
raw_config
,
config
.
replay_gain
);
initialize_decoder_and_player
(
instance
,
raw_config
,
config
.
replay_gain
);
listen_global_init
(
raw_config
,
*
instance
->
partitions
.
front
().
listener
);
listen_global_init
(
raw_config
,
*
instance
.
partitions
.
front
().
listener
);
#ifdef ENABLE_DAEMON
daemonize_set_user
();
...
...
@@ -452,7 +454,7 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
AtScopeExit
()
{
daemonize_finish
();
};
#endif
mpd_main_after_fork
(
raw_config
,
config
);
mpd_main_after_fork
(
instance
,
raw_config
,
config
);
}
#ifndef ANDROID
...
...
@@ -484,7 +486,8 @@ int mpd_main(int argc, char *argv[]) noexcept
#endif
/* !ANDROID */
static
void
mpd_main_after_fork
(
const
ConfigData
&
raw_config
,
const
Config
&
config
)
mpd_main_after_fork
(
Instance
&
instance
,
const
ConfigData
&
raw_config
,
const
Config
&
config
)
{
ConfigureFS
(
raw_config
);
AtScopeExit
()
{
DeinitFS
();
};
...
...
@@ -502,17 +505,17 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
const
ScopeDecoderPluginsInit
decoder_plugins_init
(
raw_config
);
#ifdef ENABLE_DATABASE
const
bool
create_db
=
InitDatabaseAndStorage
(
raw_config
);
const
bool
create_db
=
InitDatabaseAndStorage
(
instance
,
raw_config
);
#endif
#ifdef ENABLE_SQLITE
instance
->
sticker_database
=
LoadStickerDatabase
(
raw_config
);
instance
.
sticker_database
=
LoadStickerDatabase
(
raw_config
);
#endif
command_init
();
for
(
auto
&
partition
:
instance
->
partitions
)
{
partition
.
outputs
.
Configure
(
instance
->
rtio_thread
.
GetEventLoop
(),
for
(
auto
&
partition
:
instance
.
partitions
)
{
partition
.
outputs
.
Configure
(
instance
.
rtio_thread
.
GetEventLoop
(),
raw_config
,
config
.
replay_gain
,
partition
.
pc
);
...
...
@@ -521,7 +524,7 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
client_manager_init
(
raw_config
);
const
ScopeInputPluginsInit
input_plugins_init
(
raw_config
,
instance
->
io_thread
.
GetEventLoop
());
instance
.
io_thread
.
GetEventLoop
());
const
ScopePlaylistPluginsInit
playlist_plugins_init
(
raw_config
);
#ifdef ENABLE_DAEMON
...
...
@@ -531,42 +534,42 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
#ifndef ANDROID
setup_log_output
();
const
ScopeSignalHandlersInit
signal_handlers_init
(
instance
->
event_loop
);
const
ScopeSignalHandlersInit
signal_handlers_init
(
instance
.
event_loop
);
#endif
instance
->
io_thread
.
Start
();
instance
->
rtio_thread
.
Start
();
instance
.
io_thread
.
Start
();
instance
.
rtio_thread
.
Start
();
#ifdef ENABLE_NEIGHBOR_PLUGINS
if
(
instance
->
neighbors
!=
nullptr
)
instance
->
neighbors
->
Open
();
if
(
instance
.
neighbors
!=
nullptr
)
instance
.
neighbors
->
Open
();
AtScopeExit
()
{
if
(
instance
->
neighbors
!=
nullptr
)
instance
->
neighbors
->
Close
();
AtScopeExit
(
&
instance
)
{
if
(
instance
.
neighbors
!=
nullptr
)
instance
.
neighbors
->
Close
();
};
#endif
ZeroconfInit
(
raw_config
,
instance
->
event_loop
);
ZeroconfInit
(
raw_config
,
instance
.
event_loop
);
#ifdef ENABLE_DATABASE
if
(
create_db
)
{
/* the database failed to load: recreate the
database */
instance
->
update
->
Enqueue
(
""
,
true
);
instance
.
update
->
Enqueue
(
""
,
true
);
}
#endif
glue_state_file_init
(
raw_config
);
glue_state_file_init
(
instance
,
raw_config
);
#ifdef ENABLE_DATABASE
if
(
raw_config
.
GetBool
(
ConfigOption
::
AUTO_UPDATE
,
false
))
{
#ifdef ENABLE_INOTIFY
if
(
instance
->
storage
!=
nullptr
&&
instance
->
update
!=
nullptr
)
mpd_inotify_init
(
instance
->
event_loop
,
*
instance
->
storage
,
*
instance
->
update
,
if
(
instance
.
storage
!=
nullptr
&&
instance
.
update
!=
nullptr
)
mpd_inotify_init
(
instance
.
event_loop
,
*
instance
.
storage
,
*
instance
.
update
,
raw_config
.
GetUnsigned
(
ConfigOption
::
AUTO_UPDATE_DEPTH
,
INT_MAX
));
#else
...
...
@@ -580,7 +583,7 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
/* enable all audio outputs (if not already done by
playlist_state_restore() */
for
(
auto
&
partition
:
instance
->
partitions
)
for
(
auto
&
partition
:
instance
.
partitions
)
partition
.
pc
.
LockUpdateAudio
();
#ifdef _WIN32
...
...
@@ -596,7 +599,7 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
#endif
/* run the main loop */
instance
->
event_loop
.
Run
();
instance
.
event_loop
.
Run
();
#ifdef _WIN32
win32_app_stopping
();
...
...
@@ -604,18 +607,18 @@ mpd_main_after_fork(const ConfigData &raw_config, const Config &config)
/* cleanup */
instance
->
BeginShutdownUpdate
();
instance
.
BeginShutdownUpdate
();
if
(
instance
->
state_file
!=
nullptr
)
{
instance
->
state_file
->
Write
();
delete
instance
->
state_file
;
if
(
instance
.
state_file
!=
nullptr
)
{
instance
.
state_file
->
Write
();
delete
instance
.
state_file
;
}
ZeroconfDeinit
();
instance
->
BeginShutdownPartitions
();
instance
.
BeginShutdownPartitions
();
delete
instance
->
client_list
;
delete
instance
.
client_list
;
}
#ifdef ANDROID
...
...
@@ -665,8 +668,8 @@ gcc_visibility_default
JNIEXPORT
void
JNICALL
Java_org_musicpd_Bridge_shutdown
(
JNIEnv
*
,
jclass
)
{
if
(
instance
!=
nullptr
)
instance
->
Break
();
if
(
global_
instance
!=
nullptr
)
global_
instance
->
Break
();
}
#endif
This diff is collapsed.
Click to expand it.
src/Main.hxx
View file @
71a5c8b8
...
...
@@ -31,7 +31,7 @@ extern Context *context;
extern
LogListener
*
logListener
;
#endif
extern
Instance
*
instance
;
extern
Instance
*
global_
instance
;
#ifndef ANDROID
...
...
This diff is collapsed.
Click to expand it.
src/Mapper.cxx
View file @
71a5c8b8
...
...
@@ -66,10 +66,10 @@ map_uri_fs(const char *uri) noexcept
assert
(
uri
!=
nullptr
);
assert
(
*
uri
!=
'/'
);
if
(
instance
->
storage
==
nullptr
)
if
(
global_
instance
->
storage
==
nullptr
)
return
nullptr
;
const
auto
music_dir_fs
=
instance
->
storage
->
MapFS
(
""
);
const
auto
music_dir_fs
=
global_
instance
->
storage
->
MapFS
(
""
);
if
(
music_dir_fs
.
IsNull
())
return
nullptr
;
...
...
@@ -84,10 +84,10 @@ std::string
map_fs_to_utf8
(
Path
path_fs
)
noexcept
{
if
(
path_fs
.
IsAbsolute
())
{
if
(
instance
->
storage
==
nullptr
)
if
(
global_
instance
->
storage
==
nullptr
)
return
std
::
string
();
const
auto
music_dir_fs
=
instance
->
storage
->
MapFS
(
""
);
const
auto
music_dir_fs
=
global_
instance
->
storage
->
MapFS
(
""
);
if
(
music_dir_fs
.
IsNull
())
return
std
::
string
();
...
...
This diff is collapsed.
Click to expand it.
src/win32/Win32Main.cxx
View file @
71a5c8b8
...
...
@@ -70,7 +70,7 @@ service_dispatcher(gcc_unused DWORD control, gcc_unused DWORD event_type,
switch
(
control
)
{
case
SERVICE_CONTROL_SHUTDOWN
:
case
SERVICE_CONTROL_STOP
:
instance
->
Break
();
global_
instance
->
Break
();
return
NO_ERROR
;
default:
return
NO_ERROR
;
...
...
@@ -106,7 +106,7 @@ console_handler(DWORD event)
// regardless our thread is still active.
// If this did not happen within 3 seconds
// let's shutdown anyway.
instance
->
Break
();
global_
instance
->
Break
();
// Under debugger it's better to wait indefinitely
// to allow debugging of shutdown code.
Sleep
(
IsDebuggerPresent
()
?
INFINITE
:
3000
);
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment