You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.2 KiB
130 lines
4.2 KiB
/* |
|
* Copyright 2014 Google Inc. |
|
* |
|
* Use of this source code is governed by a BSD-style license that can be |
|
* found in the LICENSE file. |
|
*/ |
|
|
|
#include "DMJsonWriter.h" |
|
|
|
#include "ProcStats.h" |
|
#include "SkCommonFlags.h" |
|
#include "SkData.h" |
|
#include "SkJSONCPP.h" |
|
#include "SkMutex.h" |
|
#include "SkOSFile.h" |
|
#include "SkOSPath.h" |
|
#include "SkStream.h" |
|
#include "SkTArray.h" |
|
|
|
namespace DM { |
|
|
|
SkTArray<JsonWriter::BitmapResult> gBitmapResults; |
|
SK_DECLARE_STATIC_MUTEX(gBitmapResultLock); |
|
|
|
void JsonWriter::AddBitmapResult(const BitmapResult& result) { |
|
SkAutoMutexAcquire lock(&gBitmapResultLock); |
|
gBitmapResults.push_back(result); |
|
} |
|
|
|
SkTArray<skiatest::Failure> gFailures; |
|
SK_DECLARE_STATIC_MUTEX(gFailureLock); |
|
|
|
void JsonWriter::AddTestFailure(const skiatest::Failure& failure) { |
|
SkAutoMutexAcquire lock(gFailureLock); |
|
gFailures.push_back(failure); |
|
} |
|
|
|
void JsonWriter::DumpJson() { |
|
if (FLAGS_writePath.isEmpty()) { |
|
return; |
|
} |
|
|
|
Json::Value root; |
|
|
|
for (int i = 1; i < FLAGS_properties.count(); i += 2) { |
|
root[FLAGS_properties[i-1]] = FLAGS_properties[i]; |
|
} |
|
for (int i = 1; i < FLAGS_key.count(); i += 2) { |
|
root["key"][FLAGS_key[i-1]] = FLAGS_key[i]; |
|
} |
|
|
|
{ |
|
SkAutoMutexAcquire lock(&gBitmapResultLock); |
|
for (int i = 0; i < gBitmapResults.count(); i++) { |
|
Json::Value result; |
|
result["key"]["name"] = gBitmapResults[i].name.c_str(); |
|
result["key"]["config"] = gBitmapResults[i].config.c_str(); |
|
result["key"]["source_type"] = gBitmapResults[i].sourceType.c_str(); |
|
result["options"]["ext"] = gBitmapResults[i].ext.c_str(); |
|
result["options"]["gamma_correct"] = gBitmapResults[i].gammaCorrect ? "yes" : "no"; |
|
result["md5"] = gBitmapResults[i].md5.c_str(); |
|
|
|
// Source options only need to be part of the key if they exist. |
|
// Source type by source type, we either always set options or never set options. |
|
if (!gBitmapResults[i].sourceOptions.isEmpty()) { |
|
result["key"]["source_options"] = gBitmapResults[i].sourceOptions.c_str(); |
|
} |
|
|
|
root["results"].append(result); |
|
} |
|
} |
|
|
|
{ |
|
SkAutoMutexAcquire lock(gFailureLock); |
|
for (int i = 0; i < gFailures.count(); i++) { |
|
Json::Value result; |
|
result["file_name"] = gFailures[i].fileName; |
|
result["line_no"] = gFailures[i].lineNo; |
|
result["condition"] = gFailures[i].condition; |
|
result["message"] = gFailures[i].message.c_str(); |
|
|
|
root["test_results"]["failures"].append(result); |
|
} |
|
} |
|
|
|
int maxResidentSetSizeMB = sk_tools::getMaxResidentSetSizeMB(); |
|
if (maxResidentSetSizeMB != -1) { |
|
root["max_rss_MB"] = sk_tools::getMaxResidentSetSizeMB(); |
|
} |
|
|
|
SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json"); |
|
sk_mkdir(FLAGS_writePath[0]); |
|
SkFILEWStream stream(path.c_str()); |
|
stream.writeText(Json::StyledWriter().write(root).c_str()); |
|
stream.flush(); |
|
} |
|
|
|
bool JsonWriter::ReadJson(const char* path, void(*callback)(BitmapResult)) { |
|
sk_sp<SkData> json(SkData::MakeFromFileName(path)); |
|
if (!json) { |
|
return false; |
|
} |
|
|
|
Json::Reader reader; |
|
Json::Value root; |
|
const char* data = (const char*)json->data(); |
|
if (!reader.parse(data, data+json->size(), root)) { |
|
return false; |
|
} |
|
|
|
const Json::Value& results = root["results"]; |
|
BitmapResult br; |
|
for (unsigned i = 0; i < results.size(); i++) { |
|
const Json::Value& r = results[i]; |
|
br.name = r["key"]["name"].asCString(); |
|
br.config = r["key"]["config"].asCString(); |
|
br.sourceType = r["key"]["source_type"].asCString(); |
|
br.ext = r["options"]["ext"].asCString(); |
|
br.gammaCorrect = 0 == strcmp("yes", r["options"]["gamma_correct"].asCString()); |
|
br.md5 = r["md5"].asCString(); |
|
|
|
if (!r["key"]["source_options"].isNull()) { |
|
br.sourceOptions = r["key"]["source_options"].asCString(); |
|
} |
|
callback(br); |
|
} |
|
return true; |
|
} |
|
|
|
} // namespace DM
|
|
|