blob: b02b36cb60d2d1813fec50854f18e8dbc2b0cbd7 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ml_benchmark/shared_library_benchmark.h"
#include <memory>
#include <string>
#include <base/logging.h>
namespace ml_benchmark {
SharedLibraryBenchmark::SharedLibraryBenchmark(
std::unique_ptr<BenchmarkFunctions> functions)
: functions_(std::move(functions)) {
CHECK(functions_ != nullptr);
}
bool SharedLibraryBenchmark::ExecuteBenchmark(
const chrome::ml_benchmark::CrOSBenchmarkConfig& config,
chrome::ml_benchmark::BenchmarkResults* results) {
std::string config_bytes;
if (!config.SerializeToString(&config_bytes)) {
LOG(ERROR) << "Unable to serialize configuration protobuf";
return false;
}
void* results_buffer = nullptr;
int32_t results_size = 0;
auto ret =
functions_->BenchmarkFunction(config_bytes.c_str(), config_bytes.size(),
&results_buffer, &results_size);
if (ret != chrome::ml_benchmark::OK) {
LOG(ERROR) << "Benchmark did not successfully execute";
return false;
}
auto deleter = [this](void* memory) {
functions_->FreeBenchmarkResults(memory);
};
std::unique_ptr<void, decltype(deleter)> managed_results(results_buffer,
deleter);
if (results_buffer == nullptr || results_size == 0) {
LOG(ERROR) << "Cannot parse the results from the test driver: "
<< "Driver did not return a buffer or a correct size";
return false;
}
if (!results->ParseFromArray(results_buffer, results_size)) {
LOG(ERROR) << "Cannot parse the results from the test driver: "
<< "Driver did not return a valid result";
return false;
}
return true;
}
} // namespace ml_benchmark