From aeb2baa495776d9fc06e63f91167c40c334303c8 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 29 Dec 2013 18:08:49 +0100 Subject: [PATCH] InputStream: add static method OpenReady() Merge some duplicate code. --- src/InputStream.cxx | 22 ++++++++++++++++++++++ src/InputStream.hxx | 9 +++++++++ src/PlaylistAny.cxx | 2 +- src/PlaylistRegistry.cxx | 10 +++------- src/TagFile.cxx | 6 +++--- src/archive/Bzip2ArchivePlugin.cxx | 2 +- src/playlist/SoundCloudPlaylistPlugin.cxx | 5 ++--- test/dump_playlist.cxx | 4 +--- test/dump_text_file.cxx | 20 ++------------------ test/read_tags.cxx | 17 ++--------------- test/run_input.cxx | 12 +----------- 11 files changed, 47 insertions(+), 62 deletions(-) diff --git a/src/InputStream.cxx b/src/InputStream.cxx index 28a0aad1a..7d3ebe615 100644 --- a/src/InputStream.cxx +++ b/src/InputStream.cxx @@ -57,6 +57,28 @@ InputStream::Open(const char *url, return nullptr; } +InputStream * +InputStream::OpenReady(const char *uri, + Mutex &mutex, Cond &cond, + Error &error) +{ + InputStream *is = Open(uri, mutex, cond, error); + if (is == nullptr) + return nullptr; + + mutex.lock(); + is->WaitReady(); + bool success = is->Check(error); + mutex.unlock(); + + if (!success) { + is->Close(); + is = nullptr; + } + + return is; +} + bool InputStream::Check(Error &error) { diff --git a/src/InputStream.hxx b/src/InputStream.hxx index b1bc9c4ab..5ac3bdcae 100644 --- a/src/InputStream.hxx +++ b/src/InputStream.hxx @@ -118,6 +118,15 @@ struct InputStream { static InputStream *Open(const char *uri, Mutex &mutex, Cond &cond, Error &error); + /** + * Just like Open(), but waits for the stream to become ready. + * It is a wrapper for Open(), WaitReady() and Check(). + */ + gcc_malloc gcc_nonnull_all + static InputStream *OpenReady(const char *uri, + Mutex &mutex, Cond &cond, + Error &error); + /** * Close the input stream and free resources. * diff --git a/src/PlaylistAny.cxx b/src/PlaylistAny.cxx index dfe3bfdff..083b9a230 100644 --- a/src/PlaylistAny.cxx +++ b/src/PlaylistAny.cxx @@ -41,7 +41,7 @@ playlist_open_remote(const char *uri, Mutex &mutex, Cond &cond, } Error error; - InputStream *is = InputStream::Open(uri, mutex, cond, error); + InputStream *is = InputStream::OpenReady(uri, mutex, cond, error); if (is == nullptr) { if (error.IsDefined()) FormatError(error, "Failed to open %s", uri); diff --git a/src/PlaylistRegistry.cxx b/src/PlaylistRegistry.cxx index 65f55e6ff..17cad3db5 100644 --- a/src/PlaylistRegistry.cxx +++ b/src/PlaylistRegistry.cxx @@ -269,9 +269,7 @@ playlist_list_open_stream_suffix(InputStream &is, const char *suffix) SongEnumerator * playlist_list_open_stream(InputStream &is, const char *uri) { - const char *suffix; - - is.LockWaitReady(); + assert(is.ready); const char *const mime = is.GetMimeType(); if (mime != nullptr) { @@ -280,7 +278,7 @@ playlist_list_open_stream(InputStream &is, const char *uri) return playlist; } - suffix = uri != nullptr ? uri_get_suffix(uri) : nullptr; + const char *suffix = uri != nullptr ? uri_get_suffix(uri) : nullptr; if (suffix != nullptr) { auto playlist = playlist_list_open_stream_suffix(is, suffix); if (playlist != nullptr) @@ -317,7 +315,7 @@ playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond, return nullptr; Error error; - InputStream *is = InputStream::Open(path_fs, mutex, cond, error); + InputStream *is = InputStream::OpenReady(path_fs, mutex, cond, error); if (is == nullptr) { if (error.IsDefined()) LogError(error); @@ -325,8 +323,6 @@ playlist_list_open_path(const char *path_fs, Mutex &mutex, Cond &cond, return nullptr; } - is->LockWaitReady(); - auto playlist = playlist_list_open_stream_suffix(*is, suffix); if (playlist != nullptr) *is_r = is; diff --git a/src/TagFile.cxx b/src/TagFile.cxx index 8d29d5ebe..3a6756008 100644 --- a/src/TagFile.cxx +++ b/src/TagFile.cxx @@ -62,9 +62,9 @@ public: /* open the InputStream (if not already open) */ if (is == nullptr) { - is = InputStream::Open(path_fs.c_str(), - mutex, cond, - IgnoreError()); + is = InputStream::OpenReady(path_fs.c_str(), + mutex, cond, + IgnoreError()); if (is == nullptr) return false; } else diff --git a/src/archive/Bzip2ArchivePlugin.cxx b/src/archive/Bzip2ArchivePlugin.cxx index c2d312cd1..7734d3f4b 100644 --- a/src/archive/Bzip2ArchivePlugin.cxx +++ b/src/archive/Bzip2ArchivePlugin.cxx @@ -146,7 +146,7 @@ bz2_open(const char *pathname, Error &error) { static Mutex mutex; static Cond cond; - InputStream *is = InputStream::Open(pathname, mutex, cond, error); + InputStream *is = InputStream::OpenReady(pathname, mutex, cond, error); if (is == nullptr) return nullptr; diff --git a/src/playlist/SoundCloudPlaylistPlugin.cxx b/src/playlist/SoundCloudPlaylistPlugin.cxx index 0ab250b22..afcbaef23 100644 --- a/src/playlist/SoundCloudPlaylistPlugin.cxx +++ b/src/playlist/SoundCloudPlaylistPlugin.cxx @@ -254,8 +254,8 @@ soundcloud_parse_json(const char *url, yajl_handle hand, Mutex &mutex, Cond &cond) { Error error; - InputStream *input_stream = InputStream::Open(url, mutex, cond, - error); + InputStream *input_stream = InputStream::OpenReady(url, mutex, cond, + error); if (input_stream == nullptr) { if (error.IsDefined()) LogError(error); @@ -263,7 +263,6 @@ soundcloud_parse_json(const char *url, yajl_handle hand, } mutex.lock(); - input_stream->WaitReady(); yajl_status stat; int done = 0; diff --git a/test/dump_playlist.cxx b/test/dump_playlist.cxx index f0401249e..2ac855a84 100644 --- a/test/dump_playlist.cxx +++ b/test/dump_playlist.cxx @@ -92,7 +92,7 @@ int main(int argc, char **argv) if (playlist == NULL) { /* open the stream and wait until it becomes ready */ - is = InputStream::Open(uri, mutex, cond, error); + is = InputStream::OpenReady(uri, mutex, cond, error); if (is == NULL) { if (error.IsDefined()) LogError(error); @@ -102,8 +102,6 @@ int main(int argc, char **argv) return 2; } - is->LockWaitReady(); - /* open the playlist */ playlist = playlist_list_open_stream(*is, uri); diff --git a/test/dump_text_file.cxx b/test/dump_text_file.cxx index 3da965f03..764d3f24b 100644 --- a/test/dump_text_file.cxx +++ b/test/dump_text_file.cxx @@ -49,23 +49,6 @@ dump_text_file(TextInputStream &is) static int dump_input_stream(InputStream &is) { - Error error; - - is.Lock(); - - /* wait until the stream becomes ready */ - - is.WaitReady(); - - if (!is.Check(error)) { - LogError(error); - is.Unlock(); - return EXIT_FAILURE; - } - - /* read data and tags from the stream */ - - is.Unlock(); { TextInputStream tis(is); dump_text_file(tis); @@ -73,6 +56,7 @@ dump_input_stream(InputStream &is) is.Lock(); + Error error; if (!is.Check(error)) { LogError(error); is.Unlock(); @@ -121,7 +105,7 @@ int main(int argc, char **argv) Mutex mutex; Cond cond; - InputStream *is = InputStream::Open(argv[1], mutex, cond, error); + InputStream *is = InputStream::OpenReady(argv[1], mutex, cond, error); if (is != NULL) { ret = dump_input_stream(*is); is->Close(); diff --git a/test/read_tags.cxx b/test/read_tags.cxx index dac9aba00..d2cd162d2 100644 --- a/test/read_tags.cxx +++ b/test/read_tags.cxx @@ -113,26 +113,13 @@ int main(int argc, char **argv) Mutex mutex; Cond cond; - InputStream *is = InputStream::Open(path, mutex, cond, - error); + InputStream *is = InputStream::OpenReady(path, mutex, cond, + error); if (is == NULL) { FormatError(error, "Failed to open %s", path); return EXIT_FAILURE; } - mutex.lock(); - - is->WaitReady(); - - if (!is->Check(error)) { - mutex.unlock(); - - FormatError(error, "Failed to read %s", path); - return EXIT_FAILURE; - } - - mutex.unlock(); - success = plugin->ScanStream(*is, print_handler, nullptr); is->Close(); } diff --git a/test/run_input.cxx b/test/run_input.cxx index fcf4107c4..0c1ba1d36 100644 --- a/test/run_input.cxx +++ b/test/run_input.cxx @@ -50,16 +50,6 @@ dump_input_stream(InputStream *is) is->Lock(); - /* wait until the stream becomes ready */ - - is->WaitReady(); - - if (!is->Check(error)) { - LogError(error); - is->Unlock(); - return EXIT_FAILURE; - } - /* print meta data */ if (!is->mime.empty()) @@ -139,7 +129,7 @@ int main(int argc, char **argv) Mutex mutex; Cond cond; - is = InputStream::Open(argv[1], mutex, cond, error); + is = InputStream::OpenReady(argv[1], mutex, cond, error); if (is != NULL) { ret = dump_input_stream(is); is->Close();