mirror of
https://github.com/google/benchmark.git
synced 2025-03-23 07:30:07 +08:00
Remove use of std::tmpnam. (#734)
std::tmpnam is deprecated and its use is discouraged. For our purposes in the tests, we really just need a file name which is unlikely to exist. This patch converts the tests to using a dummy random file name generator, which should hopefully avoid name conflicts.
This commit is contained in:
parent
19f7d5c2bc
commit
eafa34a5e8
@ -4,6 +4,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <random>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <streambuf>
|
#include <streambuf>
|
||||||
|
|
||||||
@ -438,11 +439,50 @@ int SubstrCnt(const std::string& haystack, const std::string& pat) {
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char ToHex(int ch) {
|
||||||
|
return ch < 10 ? static_cast<char>('0' + ch)
|
||||||
|
: static_cast<char>('a' + (ch - 10));
|
||||||
|
}
|
||||||
|
|
||||||
|
static char RandomHexChar() {
|
||||||
|
static std::mt19937 rd{std::random_device{}()};
|
||||||
|
static std::uniform_int_distribution<int> mrand{0, 15};
|
||||||
|
return ToHex(mrand(rd));
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string GetRandomFileName() {
|
||||||
|
std::string model = "test.%%%%%%";
|
||||||
|
for (auto & ch : model) {
|
||||||
|
if (ch == '%')
|
||||||
|
ch = RandomHexChar();
|
||||||
|
}
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool FileExists(std::string const& name) {
|
||||||
|
std::ifstream in(name.c_str());
|
||||||
|
return in.good();
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string GetTempFileName() {
|
||||||
|
// This function attempts to avoid race conditions where two tests
|
||||||
|
// create the same file at the same time. However, it still introduces races
|
||||||
|
// similar to tmpnam.
|
||||||
|
int retries = 3;
|
||||||
|
while (--retries) {
|
||||||
|
std::string name = GetRandomFileName();
|
||||||
|
if (!FileExists(name))
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
std::cerr << "Failed to create unique temporary file name" << std::endl;
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
|
||||||
std::string GetFileReporterOutput(int argc, char* argv[]) {
|
std::string GetFileReporterOutput(int argc, char* argv[]) {
|
||||||
std::vector<char*> new_argv(argv, argv + argc);
|
std::vector<char*> new_argv(argv, argv + argc);
|
||||||
assert(static_cast<decltype(new_argv)::size_type>(argc) == new_argv.size());
|
assert(static_cast<decltype(new_argv)::size_type>(argc) == new_argv.size());
|
||||||
|
|
||||||
std::string tmp_file_name = std::tmpnam(nullptr);
|
std::string tmp_file_name = GetTempFileName();
|
||||||
std::cout << "Will be using this as the tmp file: " << tmp_file_name << '\n';
|
std::cout << "Will be using this as the tmp file: " << tmp_file_name << '\n';
|
||||||
|
|
||||||
std::string tmp = "--benchmark_out=";
|
std::string tmp = "--benchmark_out=";
|
||||||
|
Loading…
Reference in New Issue
Block a user