| Index: bench/nanobench.cpp | 
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp | 
| index fedc9ea29f45ce4e695469229c4037393da610df..6968d6dac21deb835f11063a4731b3077673398e 100644 | 
| --- a/bench/nanobench.cpp | 
| +++ b/bench/nanobench.cpp | 
| @@ -64,11 +64,10 @@ DEFINE_string(outResultsFile, "", "If given, write results here as JSON."); | 
| DEFINE_int32(maxCalibrationAttempts, 3, | 
| "Try up to this many times to guess loops for a bench, or skip the bench."); | 
| DEFINE_int32(maxLoops, 1000000, "Never run a bench more times than this."); | 
| +DEFINE_string(properties, "", | 
| +              "Space-separated key/value pairs to add to JSON identifying this nanobench run."); | 
| DEFINE_string(key, "", | 
| "Space-separated key/value pairs to add to JSON identifying this bench config."); | 
| -DEFINE_string(options, "", | 
| -              "Space-separated option/value pairs to add to JSON, logging extra info."); | 
| -DEFINE_string(gitHash, "", "Git hash to add to JSON."); | 
|  | 
| DEFINE_string(clip, "0,0,1000,1000", "Clip for SKPs."); | 
| DEFINE_string(scales, "1.0", "Space-separated scales for SKPs."); | 
| @@ -392,20 +391,6 @@ static void create_targets(SkTDArray<Target*>* targets, Benchmark* b, | 
| } | 
| } | 
|  | 
| -static void fill_static_options(ResultsWriter* log) { | 
| -#if defined(SK_BUILD_FOR_WIN32) | 
| -    log->option("system", "WIN32"); | 
| -#elif defined(SK_BUILD_FOR_MAC) | 
| -    log->option("system", "MAC"); | 
| -#elif defined(SK_BUILD_FOR_ANDROID) | 
| -    log->option("system", "ANDROID"); | 
| -#elif defined(SK_BUILD_FOR_UNIX) | 
| -    log->option("system", "UNIX"); | 
| -#else | 
| -    log->option("system", "other"); | 
| -#endif | 
| -} | 
| - | 
| #if SK_SUPPORT_GPU | 
| static void fill_gpu_options(ResultsWriter* log, SkGLContextHelper* ctx) { | 
| const GrGLubyte* version; | 
| @@ -553,30 +538,25 @@ int nanobench_main() { | 
| } | 
| } | 
|  | 
| -    MultiResultsWriter log; | 
| -    SkAutoTDelete<NanoJSONResultsWriter> json; | 
| +    SkAutoTDelete<ResultsWriter> log(SkNEW(ResultsWriter)); | 
| if (!FLAGS_outResultsFile.isEmpty()) { | 
| -        const char* gitHash = FLAGS_gitHash.isEmpty() ? "unknown-revision" : FLAGS_gitHash[0]; | 
| -        json.reset(SkNEW(NanoJSONResultsWriter(FLAGS_outResultsFile[0], gitHash))); | 
| -        log.add(json.get()); | 
| +        log.reset(SkNEW(NanoJSONResultsWriter(FLAGS_outResultsFile[0]))); | 
| } | 
| -    CallEnd<MultiResultsWriter> ender(log); | 
|  | 
| -    if (1 == FLAGS_key.count() % 2) { | 
| -        SkDebugf("ERROR: --key must be passed with an even number of arguments.\n"); | 
| +    if (1 == FLAGS_properties.count() % 2) { | 
| +        SkDebugf("ERROR: --properties must be passed with an even number of arguments.\n"); | 
| return 1; | 
| } | 
| -    for (int i = 1; i < FLAGS_key.count(); i += 2) { | 
| -        log.key(FLAGS_key[i-1], FLAGS_key[i]); | 
| +    for (int i = 1; i < FLAGS_properties.count(); i += 2) { | 
| +        log->property(FLAGS_properties[i-1], FLAGS_properties[i]); | 
| } | 
|  | 
| -    fill_static_options(&log); | 
| -    if (1 == FLAGS_options.count() % 2) { | 
| -        SkDebugf("ERROR: --options must be passed with an even number of arguments.\n"); | 
| +    if (1 == FLAGS_key.count() % 2) { | 
| +        SkDebugf("ERROR: --key must be passed with an even number of arguments.\n"); | 
| return 1; | 
| } | 
| -    for (int i = 1; i < FLAGS_options.count(); i += 2) { | 
| -        log.option(FLAGS_options[i-1], FLAGS_options[i]); | 
| +    for (int i = 1; i < FLAGS_key.count(); i += 2) { | 
| +        log->key(FLAGS_key[i-1], FLAGS_key[i]); | 
| } | 
|  | 
| const double overhead = estimate_timer_overhead(); | 
| @@ -608,7 +588,7 @@ int nanobench_main() { | 
| create_targets(&targets, bench.get(), configs); | 
|  | 
| if (!targets.isEmpty()) { | 
| -            log.bench(bench->getName(), bench->getSize().fX, bench->getSize().fY); | 
| +            log->bench(bench->getName(), bench->getSize().fX, bench->getSize().fY); | 
| bench->preDraw(); | 
| } | 
| for (int j = 0; j < targets.count(); j++) { | 
| @@ -644,18 +624,18 @@ int nanobench_main() { | 
| } | 
|  | 
| Stats stats(samples.get(), FLAGS_samples); | 
| -            log.config(config); | 
| -            benchStream.fillCurrentOptions(&log); | 
| +            log->config(config); | 
| +            benchStream.fillCurrentOptions(log.get()); | 
| #if SK_SUPPORT_GPU | 
| if (Benchmark::kGPU_Backend == targets[j]->config.backend) { | 
| -                fill_gpu_options(&log, targets[j]->gl); | 
| +                fill_gpu_options(log.get(), targets[j]->gl); | 
| } | 
| #endif | 
| -            log.timer("min_ms",    stats.min); | 
| -            log.timer("median_ms", stats.median); | 
| -            log.timer("mean_ms",   stats.mean); | 
| -            log.timer("max_ms",    stats.max); | 
| -            log.timer("stddev_ms", sqrt(stats.var)); | 
| +            log->timer("min_ms",    stats.min); | 
| +            log->timer("median_ms", stats.median); | 
| +            log->timer("mean_ms",   stats.mean); | 
| +            log->timer("max_ms",    stats.max); | 
| +            log->timer("stddev_ms", sqrt(stats.var)); | 
|  | 
| if (kAutoTuneLoops != FLAGS_loops) { | 
| if (targets.count() == 1) { | 
|  |