Export of internal Abseil changes
-- d857e6e1f9b09a3eb5abd890677a98b23346f07a by Abseil Team <absl-team@google.com>: Simplify internal TryAcquireWithSpinning. No point declaring the `result` variable: we can just return the results directly. PiperOrigin-RevId: 307045800 -- 421952252bc23be51f47f7d23f3422bad1ed382c by Derek Mauro <dmauro@google.com>: Add custom sink support for `absl::Format()` through an ADL extension mechanism. Users can now define `void AbslFormatFlush(MySink* dest, absl::string_view part)` to allow `absl::Format()` to append to a custom sink. PiperOrigin-RevId: 306929052 -- c73d5cdb62cd58ea421ed1aeeab78a0ffcfeeefb by Matt Calabrese <calabrese@google.com>: Internal-only conformance-testing macro ABSL_INTERNAL_ASSERT_CONFORMANCE_OF for compile-time and runtime checks of a specified type, expected properties of that type, and a logically-ordered series of equivalence classes of that type. PiperOrigin-RevId: 306885512 -- a8c2495a07f37d68907855e3f0535bd5c27a3b52 by Abseil Team <absl-team@google.com>: Internal change PiperOrigin-RevId: 306766753 GitOrigin-RevId: d857e6e1f9b09a3eb5abd890677a98b23346f07a Change-Id: Ic23c92ac74f9ffcbb2471ff8c6691f4b7b20354b
This commit is contained in:
parent
db5773a721
commit
b35973e3e3
16 changed files with 3096 additions and 44 deletions
|
|
@ -1439,20 +1439,18 @@ void Mutex::AssertNotHeld() const {
|
|||
// may spin for a short while if the lock cannot be acquired immediately.
|
||||
static bool TryAcquireWithSpinning(std::atomic<intptr_t>* mu) {
|
||||
int c = mutex_globals.spinloop_iterations;
|
||||
int result = -1; // result of operation: 0=false, 1=true, -1=unknown
|
||||
|
||||
do { // do/while somewhat faster on AMD
|
||||
intptr_t v = mu->load(std::memory_order_relaxed);
|
||||
if ((v & (kMuReader|kMuEvent)) != 0) { // a reader or tracing -> give up
|
||||
result = 0;
|
||||
if ((v & (kMuReader|kMuEvent)) != 0) {
|
||||
return false; // a reader or tracing -> give up
|
||||
} else if (((v & kMuWriter) == 0) && // no holder -> try to acquire
|
||||
mu->compare_exchange_strong(v, kMuWriter | v,
|
||||
std::memory_order_acquire,
|
||||
std::memory_order_relaxed)) {
|
||||
result = 1;
|
||||
return true;
|
||||
}
|
||||
} while (result == -1 && --c > 0);
|
||||
return result == 1;
|
||||
} while (--c > 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
ABSL_XRAY_LOG_ARGS(1) void Mutex::Lock() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue