test/run_input: add option --chunk-size
This commit is contained in:
parent
962cf32ba7
commit
979a7a1dcc
|
@ -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 {
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue