summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/util/random.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/rocksdb/util/random.cc62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/rocksdb/util/random.cc b/src/rocksdb/util/random.cc
new file mode 100644
index 000000000..c94c28dfb
--- /dev/null
+++ b/src/rocksdb/util/random.cc
@@ -0,0 +1,62 @@
+// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
+// This source code is licensed under both the GPLv2 (found in the
+// COPYING file in the root directory) and Apache 2.0 License
+// (found in the LICENSE.Apache file in the root directory).
+//
+
+#include "util/random.h"
+
+#include <stdint.h>
+#include <string.h>
+
+#include <thread>
+#include <utility>
+
+#include "port/likely.h"
+#include "util/thread_local.h"
+
+#define STORAGE_DECL static thread_local
+
+namespace ROCKSDB_NAMESPACE {
+
+Random* Random::GetTLSInstance() {
+ STORAGE_DECL Random* tls_instance;
+ STORAGE_DECL std::aligned_storage<sizeof(Random)>::type tls_instance_bytes;
+
+ auto rv = tls_instance;
+ if (UNLIKELY(rv == nullptr)) {
+ size_t seed = std::hash<std::thread::id>()(std::this_thread::get_id());
+ rv = new (&tls_instance_bytes) Random((uint32_t)seed);
+ tls_instance = rv;
+ }
+ return rv;
+}
+
+std::string Random::HumanReadableString(int len) {
+ std::string ret;
+ ret.resize(len);
+ for (int i = 0; i < len; ++i) {
+ ret[i] = static_cast<char>('a' + Uniform(26));
+ }
+ return ret;
+}
+
+std::string Random::RandomString(int len) {
+ std::string ret;
+ ret.resize(len);
+ for (int i = 0; i < len; i++) {
+ ret[i] = static_cast<char>(' ' + Uniform(95)); // ' ' .. '~'
+ }
+ return ret;
+}
+
+std::string Random::RandomBinaryString(int len) {
+ std::string ret;
+ ret.resize(len);
+ for (int i = 0; i < len; i++) {
+ ret[i] = static_cast<char>(Uniform(CHAR_MAX));
+ }
+ return ret;
+}
+
+} // namespace ROCKSDB_NAMESPACE