// 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 #include #include #include #include "port/likely.h" #include "util/thread_local.h" #ifdef ROCKSDB_SUPPORT_THREAD_LOCAL #define STORAGE_DECL static __thread #else #define STORAGE_DECL static #endif namespace rocksdb { Random* Random::GetTLSInstance() { STORAGE_DECL Random* tls_instance; STORAGE_DECL std::aligned_storage::type tls_instance_bytes; auto rv = tls_instance; if (UNLIKELY(rv == nullptr)) { size_t seed = std::hash()(std::this_thread::get_id()); rv = new (&tls_instance_bytes) Random((uint32_t)seed); tls_instance = rv; } return rv; } } // namespace rocksdb