|
|
|
// 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).
|
|
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "monitoring/perf_step_timer.h"
|
|
|
|
#include "rocksdb/iostats_context.h"
|
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
8 years ago
|
|
|
#ifdef ROCKSDB_SUPPORT_THREAD_LOCAL
|
|
|
|
namespace ROCKSDB_NAMESPACE {
|
|
|
|
extern __thread IOStatsContext iostats_context;
|
|
|
|
} // namespace ROCKSDB_NAMESPACE
|
|
|
|
|
|
|
|
// increment a specific counter by the specified value
|
|
|
|
#define IOSTATS_ADD(metric, value) (iostats_context.metric += value)
|
|
|
|
|
|
|
|
// Increase metric value only when it is positive
|
|
|
|
#define IOSTATS_ADD_IF_POSITIVE(metric, value) \
|
|
|
|
if (value > 0) { IOSTATS_ADD(metric, value); }
|
|
|
|
|
|
|
|
// reset a specific counter to zero
|
|
|
|
#define IOSTATS_RESET(metric) (iostats_context.metric = 0)
|
|
|
|
|
|
|
|
// reset all counters to zero
|
|
|
|
#define IOSTATS_RESET_ALL() (iostats_context.Reset())
|
|
|
|
|
|
|
|
#define IOSTATS_SET_THREAD_POOL_ID(value) \
|
|
|
|
(iostats_context.thread_pool_id = value)
|
|
|
|
|
|
|
|
#define IOSTATS_THREAD_POOL_ID() (iostats_context.thread_pool_id)
|
|
|
|
|
|
|
|
#define IOSTATS(metric) (iostats_context.metric)
|
|
|
|
|
|
|
|
// Declare and set start time of the timer
|
|
|
|
#define IOSTATS_TIMER_GUARD(metric) \
|
|
|
|
PerfStepTimer iostats_step_timer_##metric(&(iostats_context.metric)); \
|
|
|
|
iostats_step_timer_##metric.Start();
|
|
|
|
|
|
|
|
// Declare and set start time of the timer
|
|
|
|
#define IOSTATS_CPU_TIMER_GUARD(metric, clock) \
|
|
|
|
PerfStepTimer iostats_step_timer_##metric( \
|
|
|
|
&(iostats_context.metric), clock.get(), true, \
|
|
|
|
PerfLevel::kEnableTimeAndCPUTimeExceptForMutex); \
|
|
|
|
iostats_step_timer_##metric.Start();
|
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
8 years ago
|
|
|
#else // ROCKSDB_SUPPORT_THREAD_LOCAL
|
|
|
|
|
|
|
|
#define IOSTATS_ADD(metric, value)
|
|
|
|
#define IOSTATS_ADD_IF_POSITIVE(metric, value)
|
|
|
|
#define IOSTATS_RESET(metric)
|
|
|
|
#define IOSTATS_RESET_ALL()
|
|
|
|
#define IOSTATS_SET_THREAD_POOL_ID(value)
|
|
|
|
#define IOSTATS_THREAD_POOL_ID()
|
|
|
|
#define IOSTATS(metric) 0
|
|
|
|
|
|
|
|
#define IOSTATS_TIMER_GUARD(metric)
|
|
|
|
#define IOSTATS_CPU_TIMER_GUARD(metric, clock) static_cast<void>(clock)
|
|
|
|
|
cross-platform compatibility improvements
Summary:
We've had a couple CockroachDB users fail to build RocksDB on exotic platforms, so I figured I'd try my hand at solving these issues upstream. The problems stem from a) `USE_SSE=1` being too aggressive about turning on SSE4.2, even on toolchains that don't support SSE4.2 and b) RocksDB attempting to detect support for thread-local storage based on OS, even though it can vary by compiler on the same OS.
See the individual commit messages for details. Regarding SSE support, this PR should change virtually nothing for non-CMake based builds. `make`, `PORTABLE=1 make`, `USE_SSE=1 make`, and `PORTABLE=1 USE_SSE=1 make` function exactly as before, except that SSE support will be automatically disabled when a simple SSE4.2-using test program fails to compile, as it does on OpenBSD. (OpenBSD's ports GCC supports SSE4.2, but its binutils do not, so `__SSE_4_2__` is defined but an SSE4.2-using program will fail to assemble.) A warning is emitted in this case. The CMake build is modified to support the same set of options, except that `USE_SSE` is spelled `FORCE_SSE42` because `USE_SSE` is rather useless now that we can automatically detect SSE support, and I figure changing options in the CMake build is less disruptive than changing the non-CMake build.
I've tested these changes on all the platforms I can get my hands on (macOS, Windows MSVC, Windows MinGW, and OpenBSD) and it all works splendidly. Let me know if there's anything you object to—I obviously don't mean to break any of your build pipelines in the process of fixing ours downstream.
Closes https://github.com/facebook/rocksdb/pull/2199
Differential Revision: D5054042
Pulled By: yiwu-arbug
fbshipit-source-id: 938e1fc665c049c02ae15698e1409155b8e72171
8 years ago
|
|
|
#endif // ROCKSDB_SUPPORT_THREAD_LOCAL
|