From fe33916f8b77db93ca0737ad9d00cd48d216c6e4 Mon Sep 17 00:00:00 2001 From: Christopher Dykes Date: Mon, 28 Mar 2016 11:20:18 -0700 Subject: [PATCH] Move asm portability to an Asm portability header Summary: Portabilty.h is just a mashup of everything that was needed up-to now, however, with the Windows port significantly expanding the scope of portability in Folly, it no longer needs to be a massive mashup, so start things by splitting out the asm stubs. Reviewed By: yfeldblum Differential Revision: D3007018 fb-gh-sync-id: f32913f74660aaa8889a553ae5d6f7182a4f5789 fbshipit-source-id: f32913f74660aaa8889a553ae5d6f7182a4f5789 --- folly/Baton.h | 1 + folly/Makefile.am | 1 + folly/MicroLock.cpp | 2 + folly/Portability.h | 38 ------------------- folly/RWSpinLock.h | 1 + folly/SharedMutex.h | 1 + folly/detail/AtomicHashUtils.h | 2 +- folly/detail/Sleeper.h | 2 +- folly/detail/TurnSequencer.h | 2 +- folly/experimental/fibers/Baton.cpp | 1 + folly/portability/Asm.h | 57 +++++++++++++++++++++++++++++ folly/test/SmallLocksTest.cpp | 2 + folly/test/SpinLockTest.cpp | 2 + 13 files changed, 71 insertions(+), 41 deletions(-) create mode 100755 folly/portability/Asm.h diff --git a/folly/Baton.h b/folly/Baton.h index 6d4a7832..c14e57f3 100644 --- a/folly/Baton.h +++ b/folly/Baton.h @@ -24,6 +24,7 @@ #include #include +#include namespace folly { diff --git a/folly/Makefile.am b/folly/Makefile.am index a56afac1..0f8915a1 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -267,6 +267,7 @@ nobase_follyinclude_HEADERS = \ Padded.h \ PicoSpinLock.h \ Portability.h \ + portability/Asm.h \ portability/Config.h \ portability/Constexpr.h \ portability/Environment.h \ diff --git a/folly/MicroLock.cpp b/folly/MicroLock.cpp index dd649da1..778cd5b9 100644 --- a/folly/MicroLock.cpp +++ b/folly/MicroLock.cpp @@ -17,6 +17,8 @@ #include #include +#include + namespace folly { void MicroLockCore::lockSlowPath(uint32_t oldWord, diff --git a/folly/Portability.h b/folly/Portability.h index efef0184..1b6ce9db 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -369,43 +369,6 @@ inline size_t malloc_usable_size(void* ptr) { # define FOLLY_HAS_RTTI 1 #endif -#ifdef _MSC_VER -# include -#endif - -namespace folly { - -inline void asm_volatile_memory() { -#if defined(__clang__) || defined(__GNUC__) - asm volatile("" : : : "memory"); -#elif defined(_MSC_VER) - ::_ReadWriteBarrier(); -#endif -} - -inline void asm_volatile_pause() { -#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) - ::_mm_pause(); -#elif defined(__i386__) || FOLLY_X64 - asm volatile ("pause"); -#elif FOLLY_A64 || defined(__arm__) - asm volatile ("yield"); -#elif FOLLY_PPC64 - asm volatile("or 27,27,27"); -#endif -} -inline void asm_pause() { -#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) - ::_mm_pause(); -#elif defined(__i386__) || FOLLY_X64 - asm ("pause"); -#elif FOLLY_A64 || defined(__arm__) - asm ("yield"); -#elif FOLLY_PPC64 - asm ("or 31,31,31"); -#endif -} - #if defined(__APPLE__) || defined(_MSC_VER) #define MAX_STATIC_CONSTRUCTOR_PRIORITY #else @@ -415,5 +378,4 @@ inline void asm_pause() { #define MAX_STATIC_CONSTRUCTOR_PRIORITY __attribute__ ((__init_priority__(102))) #endif -} // namespace folly #endif // FOLLY_PORTABILITY_H_ diff --git a/folly/RWSpinLock.h b/folly/RWSpinLock.h index 3091dc1c..a5b60534 100644 --- a/folly/RWSpinLock.h +++ b/folly/RWSpinLock.h @@ -137,6 +137,7 @@ pthread_rwlock_t Read 728698 24us 101ns 7.28ms 194us */ #include +#include #if defined(__GNUC__) && \ (defined(__i386) || FOLLY_X64 || \ diff --git a/folly/SharedMutex.h b/folly/SharedMutex.h index 543b702f..782a6536 100644 --- a/folly/SharedMutex.h +++ b/folly/SharedMutex.h @@ -25,6 +25,7 @@ #include #include #include +#include #include // SharedMutex is a reader-writer lock. It is small, very fast, scalable diff --git a/folly/detail/AtomicHashUtils.h b/folly/detail/AtomicHashUtils.h index 262f1543..bb49eef0 100644 --- a/folly/detail/AtomicHashUtils.h +++ b/folly/detail/AtomicHashUtils.h @@ -17,8 +17,8 @@ #ifndef incl_FOLLY_ATOMIC_HASH_UTILS_H #define incl_FOLLY_ATOMIC_HASH_UTILS_H -#include #include +#include // Some utilities used by AtomicHashArray and AtomicHashMap // diff --git a/folly/detail/Sleeper.h b/folly/detail/Sleeper.h index b8c8dfdf..f5a12b85 100644 --- a/folly/detail/Sleeper.h +++ b/folly/detail/Sleeper.h @@ -24,7 +24,7 @@ #include #include -#include +#include namespace folly { diff --git a/folly/detail/TurnSequencer.h b/folly/detail/TurnSequencer.h index 32a6f57f..6c62928b 100644 --- a/folly/detail/TurnSequencer.h +++ b/folly/detail/TurnSequencer.h @@ -22,7 +22,7 @@ #include #include -#include +#include namespace folly { diff --git a/folly/experimental/fibers/Baton.cpp b/folly/experimental/fibers/Baton.cpp index 5b3cfdc9..9f6d4e41 100644 --- a/folly/experimental/fibers/Baton.cpp +++ b/folly/experimental/fibers/Baton.cpp @@ -19,6 +19,7 @@ #include #include +#include namespace folly { namespace fibers { diff --git a/folly/portability/Asm.h b/folly/portability/Asm.h new file mode 100755 index 00000000..ef9b3fa1 --- /dev/null +++ b/folly/portability/Asm.h @@ -0,0 +1,57 @@ +/* + * Copyright 2016 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#ifdef _MSC_VER +# include +#endif + +namespace folly { +inline void asm_volatile_memory() { +#if defined(__clang__) || defined(__GNUC__) + asm volatile("" : : : "memory"); +#elif defined(_MSC_VER) + ::_ReadWriteBarrier(); +#endif +} + +inline void asm_volatile_pause() { +#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + ::_mm_pause(); +#elif defined(__i386__) || FOLLY_X64 + asm volatile("pause"); +#elif FOLLY_A64 || defined(__arm__) + asm volatile("yield"); +#elif FOLLY_PPC64 + asm volatile("or 27,27,27"); +#endif +} + +inline void asm_pause() { +#if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + ::_mm_pause(); +#elif defined(__i386__) || FOLLY_X64 + asm("pause"); +#elif FOLLY_A64 || defined(__arm__) + asm("yield"); +#elif FOLLY_PPC64 + asm("or 31,31,31"); +#endif +} +} diff --git a/folly/test/SmallLocksTest.cpp b/folly/test/SmallLocksTest.cpp index 7ddd29a0..ad6a8378 100644 --- a/folly/test/SmallLocksTest.cpp +++ b/folly/test/SmallLocksTest.cpp @@ -31,6 +31,8 @@ #include +#include + using folly::MSLGuard; using folly::MicroLock; using folly::MicroSpinLock; diff --git a/folly/test/SpinLockTest.cpp b/folly/test/SpinLockTest.cpp index ee12ab16..6d028af1 100644 --- a/folly/test/SpinLockTest.cpp +++ b/folly/test/SpinLockTest.cpp @@ -20,6 +20,8 @@ #include #include +#include + using folly::SpinLockGuardImpl; namespace { -- 2.34.1