forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move WTF::SpinLock to base::SpinLock.
This CL depends on https://codereview.chromium.org/2473153003 ("Move some compiler intrinsic #defines to base/."). This CL is a re-land of https://codereview.chromium.org/2484803003. BUG=632441 TBR=esprehn Review-Url: https://codereview.chromium.org/2519183002 Cr-Commit-Position: refs/heads/master@{#434297}
- Loading branch information
palmer
authored and
Commit bot
committed
Nov 24, 2016
1 parent
0f1facb
commit 74db88d
Showing
6 changed files
with
95 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// Copyright (c) 2013 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef BASE_SYNCHRONIZATION_SPIN_LOCK_H | ||
#define BASE_SYNCHRONIZATION_SPIN_LOCK_H | ||
|
||
#include <atomic> | ||
#include <memory> | ||
#include <mutex> | ||
|
||
#include "base/base_export.h" | ||
#include "base/compiler_specific.h" | ||
|
||
// Spinlock is a simple spinlock class based on the standard CPU primitive of | ||
// atomic increment and decrement of an int at a given memory address. These are | ||
// intended only for very short duration locks and assume a system with multiple | ||
// cores. For any potentially longer wait you should use a real lock, such as | ||
// |base::Lock|. | ||
// | ||
// |SpinLock|s MUST be globals. Using them as (e.g.) struct/class members will | ||
// result in an uninitialized lock, which is dangerously incorrect. | ||
|
||
namespace base { | ||
namespace subtle { | ||
|
||
class SpinLock { | ||
public: | ||
using Guard = std::lock_guard<SpinLock>; | ||
|
||
ALWAYS_INLINE void lock() { | ||
static_assert(sizeof(lock_) == sizeof(int), | ||
"int and lock_ are different sizes"); | ||
if (LIKELY(!lock_.exchange(true, std::memory_order_acquire))) | ||
return; | ||
LockSlow(); | ||
} | ||
|
||
ALWAYS_INLINE void unlock() { lock_.store(false, std::memory_order_release); } | ||
|
||
private: | ||
// This is called if the initial attempt to acquire the lock fails. It's | ||
// slower, but has a much better scheduling and power consumption behavior. | ||
BASE_EXPORT void LockSlow(); | ||
|
||
std::atomic_int lock_; | ||
}; | ||
|
||
} // namespace subtle | ||
} // namespace base | ||
|
||
#endif // BASE_SYNCHRONIZATION_SPIN_LOCK_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters