aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/InputStream.cxx22
-rw-r--r--src/InputStream.hxx9
-rw-r--r--src/PlaylistAny.cxx2
-rw-r--r--src/PlaylistRegistry.cxx10
-rw-r--r--src/TagFile.cxx6
-rw-r--r--src/archive/Bzip2ArchivePlugin.cxx2
-rw-r--r--src/playlist/SoundCloudPlaylistPlugin.cxx5
-rw-r--r--test/dump_playlist.cxx4
-rw-r--r--test/dump_text_file.cxx20
-rw-r--r--test/read_tags.cxx17
-rw-r--r--test/run_input.cxx12
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
@@ -119,6 +119,15 @@ struct InputStream {
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.
*
* The caller must not lock the mutex.
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();