From d0fbf6db592eb445c9741fc7544b7bee739fcdfa Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 22 Jun 2018 19:37:18 +0200 Subject: input/Stream: remove attribute "cond", replace with handler interface This adds a bit of overhead, but also adds flexibility to the API, because arbitrary triggers may be invoked from that virtual method implementation, not just Cond::signal(). The motivation for this is to make the handlers more dynamic, for the upcoming buffering class utilizing ProxyInputStream. --- src/playlist/PlaylistAny.cxx | 6 +++--- src/playlist/PlaylistAny.hxx | 3 +-- src/playlist/PlaylistMapper.cxx | 19 ++++++++----------- src/playlist/PlaylistMapper.hxx | 3 +-- src/playlist/PlaylistPlugin.hxx | 3 +-- src/playlist/PlaylistQueue.cxx | 4 +--- src/playlist/PlaylistRegistry.cxx | 14 +++++++------- src/playlist/PlaylistRegistry.hxx | 3 +-- src/playlist/PlaylistStream.cxx | 16 ++++++++-------- src/playlist/PlaylistStream.hxx | 5 ++--- src/playlist/Print.cxx | 4 +--- src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx | 3 +-- src/playlist/plugins/FlacPlaylistPlugin.cxx | 2 +- src/playlist/plugins/SoundCloudPlaylistPlugin.cxx | 8 ++++---- 14 files changed, 40 insertions(+), 53 deletions(-) (limited to 'src/playlist') diff --git a/src/playlist/PlaylistAny.cxx b/src/playlist/PlaylistAny.cxx index 6c1c6367d..993c09e46 100644 --- a/src/playlist/PlaylistAny.cxx +++ b/src/playlist/PlaylistAny.cxx @@ -29,13 +29,13 @@ playlist_open_any(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, #endif - Mutex &mutex, Cond &cond) + Mutex &mutex) { return uri_has_scheme(uri) - ? playlist_open_remote(uri, mutex, cond) + ? playlist_open_remote(uri, mutex) : playlist_mapper_open(uri, #ifdef ENABLE_DATABASE storage, #endif - mutex, cond); + mutex); } diff --git a/src/playlist/PlaylistAny.hxx b/src/playlist/PlaylistAny.hxx index f2f3fb4a0..d021d20d5 100644 --- a/src/playlist/PlaylistAny.hxx +++ b/src/playlist/PlaylistAny.hxx @@ -23,7 +23,6 @@ #include class Mutex; -class Cond; class SongEnumerator; class Storage; @@ -37,6 +36,6 @@ playlist_open_any(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, #endif - Mutex &mutex, Cond &cond); + Mutex &mutex); #endif diff --git a/src/playlist/PlaylistMapper.cxx b/src/playlist/PlaylistMapper.cxx index aa79febc9..9fdc237a4 100644 --- a/src/playlist/PlaylistMapper.cxx +++ b/src/playlist/PlaylistMapper.cxx @@ -33,7 +33,7 @@ * Load a playlist from the configured playlist directory. */ static std::unique_ptr -playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond) +playlist_open_in_playlist_dir(const char *uri, Mutex &mutex) { assert(spl_valid_name(uri)); @@ -41,7 +41,7 @@ playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond) if (path_fs.IsNull()) return nullptr; - return playlist_open_path(path_fs, mutex, cond); + return playlist_open_path(path_fs, mutex); } #ifdef ENABLE_DATABASE @@ -50,8 +50,7 @@ playlist_open_in_playlist_dir(const char *uri, Mutex &mutex, Cond &cond) * Load a playlist from the configured music directory. */ static std::unique_ptr -playlist_open_in_storage(const char *uri, const Storage *storage, - Mutex &mutex, Cond &cond) +playlist_open_in_storage(const char *uri, const Storage *storage, Mutex &mutex) { assert(uri_safe_local(uri)); @@ -61,11 +60,11 @@ playlist_open_in_storage(const char *uri, const Storage *storage, { const auto path = storage->MapFS(uri); if (!path.IsNull()) - return playlist_open_path(path, mutex, cond); + return playlist_open_path(path, mutex); } const auto uri2 = storage->MapUTF8(uri); - return playlist_open_remote(uri2.c_str(), mutex, cond); + return playlist_open_remote(uri2.c_str(), mutex); } #endif @@ -75,19 +74,17 @@ playlist_mapper_open(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, #endif - Mutex &mutex, Cond &cond) + Mutex &mutex) { if (spl_valid_name(uri)) { - auto playlist = playlist_open_in_playlist_dir(uri, - mutex, cond); + auto playlist = playlist_open_in_playlist_dir(uri, mutex); if (playlist != nullptr) return playlist; } #ifdef ENABLE_DATABASE if (uri_safe_local(uri)) { - auto playlist = playlist_open_in_storage(uri, storage, - mutex, cond); + auto playlist = playlist_open_in_storage(uri, storage, mutex); if (playlist != nullptr) return playlist; } diff --git a/src/playlist/PlaylistMapper.hxx b/src/playlist/PlaylistMapper.hxx index 116faa46e..bc3345c84 100644 --- a/src/playlist/PlaylistMapper.hxx +++ b/src/playlist/PlaylistMapper.hxx @@ -25,7 +25,6 @@ #include class Mutex; -class Cond; class SongEnumerator; class Storage; @@ -38,6 +37,6 @@ playlist_mapper_open(const char *uri, #ifdef ENABLE_DATABASE const Storage *storage, #endif - Mutex &mutex, Cond &cond); + Mutex &mutex); #endif diff --git a/src/playlist/PlaylistPlugin.hxx b/src/playlist/PlaylistPlugin.hxx index a3f2eb8a1..acd4d67ee 100644 --- a/src/playlist/PlaylistPlugin.hxx +++ b/src/playlist/PlaylistPlugin.hxx @@ -25,7 +25,6 @@ struct ConfigBlock; struct Tag; class Mutex; -class Cond; class SongEnumerator; struct playlist_plugin { @@ -52,7 +51,7 @@ struct playlist_plugin { * either matched one of the schemes or one of the suffixes. */ std::unique_ptr (*open_uri)(const char *uri, - Mutex &mutex, Cond &cond); + Mutex &mutex); /** * Opens the playlist in the specified input stream. It has diff --git a/src/playlist/PlaylistQueue.cxx b/src/playlist/PlaylistQueue.cxx index 77edb7249..ca01d7267 100644 --- a/src/playlist/PlaylistQueue.cxx +++ b/src/playlist/PlaylistQueue.cxx @@ -26,7 +26,6 @@ #include "SongEnumerator.hxx" #include "DetachedSong.hxx" #include "thread/Mutex.hxx" -#include "thread/Cond.hxx" #include "fs/Traits.hxx" #ifdef ENABLE_DATABASE @@ -70,13 +69,12 @@ playlist_open_into_queue(const char *uri, const SongLoader &loader) { Mutex mutex; - Cond cond; auto playlist = playlist_open_any(uri, #ifdef ENABLE_DATABASE loader.GetStorage(), #endif - mutex, cond); + mutex); if (playlist == nullptr) throw PlaylistError::NoSuchList(); diff --git a/src/playlist/PlaylistRegistry.cxx b/src/playlist/PlaylistRegistry.cxx index be8b536f1..01151c83a 100644 --- a/src/playlist/PlaylistRegistry.cxx +++ b/src/playlist/PlaylistRegistry.cxx @@ -103,7 +103,7 @@ playlist_list_global_finish() noexcept } static std::unique_ptr -playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond, +playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, bool *tried) { assert(uri != nullptr); @@ -120,7 +120,7 @@ playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond, if (playlist_plugins_enabled[i] && plugin->open_uri != nullptr && plugin->schemes != nullptr && StringArrayContainsCase(plugin->schemes, scheme.c_str())) { - auto playlist = plugin->open_uri(uri, mutex, cond); + auto playlist = plugin->open_uri(uri, mutex); if (playlist) return playlist; @@ -132,7 +132,7 @@ playlist_list_open_uri_scheme(const char *uri, Mutex &mutex, Cond &cond, } static std::unique_ptr -playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond, +playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, const bool *tried) { assert(uri != nullptr); @@ -148,7 +148,7 @@ playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond, if (playlist_plugins_enabled[i] && !tried[i] && plugin->open_uri != nullptr && plugin->suffixes != nullptr && StringArrayContainsCase(plugin->suffixes, suffix)) { - auto playlist = plugin->open_uri(uri, mutex, cond); + auto playlist = plugin->open_uri(uri, mutex); if (playlist != nullptr) return playlist; } @@ -158,7 +158,7 @@ playlist_list_open_uri_suffix(const char *uri, Mutex &mutex, Cond &cond, } std::unique_ptr -playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond) +playlist_list_open_uri(const char *uri, Mutex &mutex) { /** this array tracks which plugins have already been tried by playlist_list_open_uri_scheme() */ @@ -168,9 +168,9 @@ playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond) memset(tried, false, sizeof(tried)); - auto playlist = playlist_list_open_uri_scheme(uri, mutex, cond, tried); + auto playlist = playlist_list_open_uri_scheme(uri, mutex, tried); if (playlist == nullptr) - playlist = playlist_list_open_uri_suffix(uri, mutex, cond, + playlist = playlist_list_open_uri_suffix(uri, mutex, tried); return playlist; diff --git a/src/playlist/PlaylistRegistry.hxx b/src/playlist/PlaylistRegistry.hxx index 877d6fc84..a651818f6 100644 --- a/src/playlist/PlaylistRegistry.hxx +++ b/src/playlist/PlaylistRegistry.hxx @@ -24,7 +24,6 @@ #include "Compiler.h" class Mutex; -class Cond; class SongEnumerator; extern const struct playlist_plugin *const playlist_plugins[]; @@ -51,7 +50,7 @@ playlist_list_global_finish() noexcept; * Opens a playlist by its URI. */ std::unique_ptr -playlist_list_open_uri(const char *uri, Mutex &mutex, Cond &cond); +playlist_list_open_uri(const char *uri, Mutex &mutex); std::unique_ptr playlist_list_open_stream_suffix(InputStreamPtr &&is, const char *suffix); diff --git a/src/playlist/PlaylistStream.cxx b/src/playlist/PlaylistStream.cxx index e16162680..5c2403a8f 100644 --- a/src/playlist/PlaylistStream.cxx +++ b/src/playlist/PlaylistStream.cxx @@ -32,7 +32,7 @@ #include static std::unique_ptr -playlist_open_path_suffix(Path path, Mutex &mutex, Cond &cond) +playlist_open_path_suffix(Path path, Mutex &mutex) try { assert(!path.IsNull()); @@ -44,7 +44,7 @@ try { if (!playlist_suffix_supported(suffix_utf8.c_str())) return nullptr; - auto is = OpenLocalInputStream(path, mutex, cond); + auto is = OpenLocalInputStream(path, mutex); return playlist_list_open_stream_suffix(std::move(is), suffix_utf8.c_str()); } catch (...) { @@ -53,16 +53,16 @@ try { } std::unique_ptr -playlist_open_path(Path path, Mutex &mutex, Cond &cond) +playlist_open_path(Path path, Mutex &mutex) try { assert(!path.IsNull()); const std::string uri_utf8 = path.ToUTF8(); auto playlist = !uri_utf8.empty() - ? playlist_list_open_uri(uri_utf8.c_str(), mutex, cond) + ? playlist_list_open_uri(uri_utf8.c_str(), mutex) : nullptr; if (playlist == nullptr) - playlist = playlist_open_path_suffix(path, mutex, cond); + playlist = playlist_open_path_suffix(path, mutex); return playlist; } catch (...) { @@ -71,15 +71,15 @@ try { } std::unique_ptr -playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond) +playlist_open_remote(const char *uri, Mutex &mutex) try { assert(uri_has_scheme(uri)); - auto playlist = playlist_list_open_uri(uri, mutex, cond); + auto playlist = playlist_list_open_uri(uri, mutex); if (playlist != nullptr) return playlist; - auto is = InputStream::OpenReady(uri, mutex, cond); + auto is = InputStream::OpenReady(uri, mutex); return playlist_list_open_stream(std::move(is), uri); } catch (...) { LogError(std::current_exception()); diff --git a/src/playlist/PlaylistStream.hxx b/src/playlist/PlaylistStream.hxx index c53b9f8b0..46742e970 100644 --- a/src/playlist/PlaylistStream.hxx +++ b/src/playlist/PlaylistStream.hxx @@ -25,7 +25,6 @@ #include class Mutex; -class Cond; class SongEnumerator; class Path; @@ -37,10 +36,10 @@ class Path; */ gcc_nonnull_all std::unique_ptr -playlist_open_path(Path path, Mutex &mutex, Cond &cond); +playlist_open_path(Path path, Mutex &mutex); gcc_nonnull_all std::unique_ptr -playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond); +playlist_open_remote(const char *uri, Mutex &mutex); #endif diff --git a/src/playlist/Print.cxx b/src/playlist/Print.cxx index bc3c96fa2..95b8ad66b 100644 --- a/src/playlist/Print.cxx +++ b/src/playlist/Print.cxx @@ -26,7 +26,6 @@ #include "DetachedSong.hxx" #include "fs/Traits.hxx" #include "thread/Mutex.hxx" -#include "thread/Cond.hxx" #include "Partition.hxx" #include "Instance.hxx" @@ -59,7 +58,6 @@ playlist_file_print(Response &r, Partition &partition, const char *uri, bool detail) { Mutex mutex; - Cond cond; #ifndef ENABLE_DATABASE (void)partition; @@ -69,7 +67,7 @@ playlist_file_print(Response &r, Partition &partition, #ifdef ENABLE_DATABASE partition.instance.storage, #endif - mutex, cond); + mutex); if (playlist == nullptr) return false; diff --git a/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx b/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx index ef99428bd..afbf6a55c 100644 --- a/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx +++ b/src/playlist/plugins/EmbeddedCuePlaylistPlugin.cxx @@ -89,8 +89,7 @@ static constexpr TagHandler embcue_tag_handler = { static std::unique_ptr embcue_playlist_open_uri(const char *uri, - gcc_unused Mutex &mutex, - gcc_unused Cond &cond) + gcc_unused Mutex &mutex) { if (!PathTraitsUTF8::IsAbsolute(uri)) /* only local files supported */ diff --git a/src/playlist/plugins/FlacPlaylistPlugin.cxx b/src/playlist/plugins/FlacPlaylistPlugin.cxx index 58e5c9641..330c3b332 100644 --- a/src/playlist/plugins/FlacPlaylistPlugin.cxx +++ b/src/playlist/plugins/FlacPlaylistPlugin.cxx @@ -88,7 +88,7 @@ FlacPlaylist::NextSong() static std::unique_ptr flac_playlist_open_uri(const char *uri, - gcc_unused Mutex &mutex, gcc_unused Cond &cond) + gcc_unused Mutex &mutex) { if (!PathTraitsUTF8::IsAbsolute(uri)) /* only local files supported */ diff --git a/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx b/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx index fdaffb6c9..3a5df3946 100644 --- a/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx +++ b/src/playlist/plugins/SoundCloudPlaylistPlugin.cxx @@ -221,9 +221,9 @@ static constexpr yajl_callbacks parse_callbacks = { */ static void soundcloud_parse_json(const char *url, Yajl::Handle &handle, - Mutex &mutex, Cond &cond) + Mutex &mutex) { - auto input_stream = InputStream::OpenReady(url, mutex, cond); + auto input_stream = InputStream::OpenReady(url, mutex); Yajl::ParseInputStream(handle, *input_stream); } @@ -235,7 +235,7 @@ soundcloud_parse_json(const char *url, Yajl::Handle &handle, * soundcloud://url/ */ static std::unique_ptr -soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond) +soundcloud_open_uri(const char *uri, Mutex &mutex) { assert(strncmp(uri, "soundcloud://", 13) == 0); uri += 13; @@ -277,7 +277,7 @@ soundcloud_open_uri(const char *uri, Mutex &mutex, Cond &cond) SoundCloudJsonData data; Yajl::Handle handle(&parse_callbacks, nullptr, &data); - soundcloud_parse_json(u, handle, mutex, cond); + soundcloud_parse_json(u, handle, mutex); data.songs.reverse(); return std::make_unique(std::move(data.songs)); -- cgit v1.2.3