Commit 979a7a1d authored by Max Kellermann's avatar Max Kellermann

test/run_input: add option --chunk-size

parent 962cf32b
...@@ -49,11 +49,15 @@ ...@@ -49,11 +49,15 @@
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
static constexpr std::size_t MAX_CHUNK_SIZE = 16384;
struct CommandLine { struct CommandLine {
const char *uri = nullptr; const char *uri = nullptr;
FromNarrowPath config_path; FromNarrowPath config_path;
std::size_t chunk_size = MAX_CHUNK_SIZE;
bool verbose = false; bool verbose = false;
bool scan = false; bool scan = false;
...@@ -63,14 +67,27 @@ enum Option { ...@@ -63,14 +67,27 @@ enum Option {
OPTION_CONFIG, OPTION_CONFIG,
OPTION_VERBOSE, OPTION_VERBOSE,
OPTION_SCAN, OPTION_SCAN,
OPTION_CHUNK_SIZE,
}; };
static constexpr OptionDef option_defs[] = { static constexpr OptionDef option_defs[] = {
{"config", 0, true, "Load a MPD configuration file"}, {"config", 0, true, "Load a MPD configuration file"},
{"verbose", 'v', false, "Verbose logging"}, {"verbose", 'v', false, "Verbose logging"},
{"scan", 0, false, "Scan tags instead of reading raw data"}, {"scan", 0, false, "Scan tags instead of reading raw data"},
{"chunk-size", 0, true, "Read this number of bytes at a time"},
}; };
static std::size_t
ParseSize(const char *s)
{
char *endptr;
std::size_t value = std::strtoul(s, &endptr, 10);
if (endptr == s)
throw std::runtime_error("Failed to parse integer");
return value;
}
static CommandLine static CommandLine
ParseCommandLine(int argc, char **argv) ParseCommandLine(int argc, char **argv)
{ {
...@@ -90,6 +107,12 @@ ParseCommandLine(int argc, char **argv) ...@@ -90,6 +107,12 @@ ParseCommandLine(int argc, char **argv)
case OPTION_SCAN: case OPTION_SCAN:
c.scan = true; c.scan = true;
break; break;
case OPTION_CHUNK_SIZE:
c.chunk_size = ParseSize(o.value);
if (c.chunk_size <= 0 || c.chunk_size > MAX_CHUNK_SIZE)
throw std::runtime_error("Invalid chunk size");
break;
} }
} }
...@@ -130,7 +153,7 @@ tag_save(FILE *file, const Tag &tag) ...@@ -130,7 +153,7 @@ tag_save(FILE *file, const Tag &tag)
} }
static int static int
dump_input_stream(InputStream &is, FileDescriptor out) dump_input_stream(InputStream &is, FileDescriptor out, size_t chunk_size)
{ {
const std::lock_guard<Mutex> protect(is.mutex); const std::lock_guard<Mutex> protect(is.mutex);
...@@ -150,8 +173,9 @@ dump_input_stream(InputStream &is, FileDescriptor out) ...@@ -150,8 +173,9 @@ dump_input_stream(InputStream &is, FileDescriptor out)
} }
} }
char buffer[4096]; char buffer[MAX_CHUNK_SIZE];
size_t num_read = is.Read(buffer, sizeof(buffer)); assert(chunk_size <= sizeof(buffer));
size_t num_read = is.Read(buffer, chunk_size);
if (num_read == 0) if (num_read == 0)
break; break;
...@@ -232,7 +256,8 @@ try { ...@@ -232,7 +256,8 @@ try {
Mutex mutex; Mutex mutex;
auto is = InputStream::OpenReady(c.uri, mutex); auto is = InputStream::OpenReady(c.uri, mutex);
return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO)); return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO),
c.chunk_size);
} catch (...) { } catch (...) {
PrintException(std::current_exception()); PrintException(std::current_exception());
return EXIT_FAILURE; return EXIT_FAILURE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment