vkbench: initial commit
This is the initial commit of vkbench. And contains a example test,
submitTest, which submit empty command buffers into the queue.
BUG=chromium:936705
TEST=build and run 'vkbench --notemp'
Change-Id: Ica55d97ac2348da7527cd17418fe4a989d30748e
Signed-off-by: Po-Hsien Wang <pwang@chromium.org>
diff --git a/src/utils.cc b/src/utils.cc
new file mode 100644
index 0000000..6d665a8
--- /dev/null
+++ b/src/utils.cc
@@ -0,0 +1,101 @@
+// Copyright 2019 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 "utils.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include <chrono>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+const std::string kTemperatureScript =
+ "/usr/local/autotest/bin/temperature.py --maximum";
+
+void PrintDateTime() {
+ time_t timer;
+ char buffer[26];
+ time(&timer);
+ struct tm* tm_info = localtime(&timer);
+ strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
+ LOG("# DateTime: %s", buffer)
+}
+
+/* Execute a shell command and return its file descriptor for reading output. */
+/* @param command: command to be run. */
+/* @param result: the stdout of the command output. */
+/* @return true if the command is executed successfully. */
+bool ExecuteCommand(const std::string& kCommand,
+ std::string* result = nullptr) {
+ FILE* fd = popen(kCommand.c_str(), "r");
+ if (!fd) {
+ return false;
+ }
+
+ if (result) {
+ fseek(fd, 0, SEEK_END);
+ long size = ftell(fd);
+ fseek(fd, 0, SEEK_SET);
+ fread(&result[0], sizeof(char), size, fd);
+ }
+ return pclose(fd) == 0;
+}
+
+std::vector<std::string> SplitString(const std::string& kInput,
+ char delimiter) {
+ std::vector<std::string> result;
+ std::stringstream srcStream(kInput);
+
+ std::string token;
+ while (getline(srcStream, token, delimiter)) {
+ result.push_back(token);
+ }
+ return result;
+}
+
+// Returns currently measured temperature.
+double GetMachineTemperature() {
+ std::string temp_str;
+ double temperature;
+ if (!ExecuteCommand(kTemperatureScript, &temp_str)) {
+ return 10000;
+ }
+ temperature = strtod(temp_str.c_str(), nullptr);
+ if (temperature < 10.0 || temperature > 150.0) {
+ DEBUG("Warning: ignoring temperature reading of %f'C.", temperature)
+ }
+ return temperature;
+}
+
+// Waits up to timeout seconds to reach cold_temperature in Celsius.
+// @param cold_temperature: the target temperature in celsius.
+// @param timeout: the timeout to wait.
+// @param temperature: the final temperature of the machine.
+// @return: the total second of wait time.
+double WaitForCoolMachine(double cold_temperature,
+ double timeout,
+ double* temperature) {
+ uint64_t start, now, end;
+ start = now = GetUTime();
+ end = now + 1e6 * timeout;
+ do {
+ *temperature = GetMachineTemperature();
+ if (*temperature < cold_temperature)
+ break;
+ sleep(1.0);
+ now = GetUTime();
+ } while (now < end);
+ return 1.0e-6 * (now - start);
+}
+
+bool IsItemInVector(const std::vector<std::string>& list,
+ const char* value,
+ bool empty_value = false) {
+ if (list.empty())
+ return empty_value;
+ return !(find(list.begin(), list.end(), std::string(value)) == list.end());
+}