| Commit message (Collapse) | Author | Age |
... | |
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 452134803
Change-Id: I8660df850ab537c441399545b25eb32399b2a3ef
|
|\ \
| | |
| | |
| | |
| | | |
PiperOrigin-RevId: 452110436
Change-Id: I3cb870935932c7e2895c8a7f019f375ad707ee77
|
|\ \ \
| | | |
| | | |
| | | |
| | | | |
PiperOrigin-RevId: 452108013
Change-Id: I71fa7bc792d34327680dc3daa96a8d6d4116b49a
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
the allocator (ignoring copy/move constructors).
We were using `init_type`s for temp values that we would move into slots, but in this case, we need to have actual slots. We use node handles for managing slots outside of nodes.
Also, in btree::copy_or_move_values_in_order, pass the slots from the iterators rather than references to values. This allows for moving from map keys instead of copying for standard layout types.
In the test, fix a couple of ClangTidy warnings from missing includes and calling `new` instead of `make_unique`.
PiperOrigin-RevId: 452062967
Change-Id: I870e89ae1aa5b3cfa62ae6e75b73ffc3d52e731c
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Timeouts were once necessary when the SpinLock Unlock used an atomic
store and could therefore have a race and a missed wakeup, however,
the Unlock path now uses an atomic exchange, so the missed wakeup
cannot happen.
Fixes #1179
PiperOrigin-RevId: 452047517
Change-Id: I844944879b51b7f7ddac148e063a376cddd0d05a
|
| | | |
| | | |
| | | |
| | | |
| | | | |
PiperOrigin-RevId: 451979149
Change-Id: Ic9b02306f2c5324b6648989a895f128c9eb5743d
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
This fixes an overload that is ambiguous for some toolchains, because
0U does not always refer to a uint32_t (on some toolchains, uint32_t
is an unsigned long).
PiperOrigin-RevId: 451962182
Change-Id: Id13700817ea3eb6d04e2cc02f20726040eb447fb
|
|/ / / |
|
|/ /
| |
| |
| |
| |
| |
| |
| |
| | |
Without the change absl-cpp build fails on this week's gcc-13 snapshot as:
/build/abseil-cpp/absl/strings/internal/str_format/extension.h:34:33: error: found ':' in nested-name-specifier, expected '::'
34 | enum class FormatConversionChar : uint8_t;
| ^
| ::
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 451434783
Change-Id: I572e77a67e18e8dd530bf0347c76863c9bb1946f
|
| |
| |
| |
| |
| |
| |
| | |
calling thread doesn't hold the mutex.
PiperOrigin-RevId: 451410449
Change-Id: Iffd4c7463f1051474debbed256703589d96a548c
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 451201387
Change-Id: Ibeac4f24d00e28bbfc61e476936d669321a2cb24
|
| |
| |
| |
| |
| |
| |
| | |
define it as alias of std::is_invocable_r when C++ >= 17
PiperOrigin-RevId: 451171660
Change-Id: I6dc0e40eabac72b82c4a19e292158e43118cb080
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Benchmarks: https://pastebin.com/tZ7dr67W. Works well especially on smaller ranges.
After a week on spending optimizing NEON SIMD where I almost managed to make hash tables work with NEON SIMD without performance hits (still 1 cycle to optimize and I gave up a little), I found an interesting optimization for aarch64 to use cls instruction (count leading sign bits).
The loop has a property that ctrl_ group is not matched against count when the first slot is empty or deleted.
```
void skip_empty_or_deleted() {
while (IsEmptyOrDeleted(*ctrl_)) {
uint32_t shift = Group{ctrl_}.CountLeadingEmptyOrDeleted();
ctrl_ += shift;
slot_ += shift;
}
...
}
```
However, `kEmpty` and `kDeleted` have format of `1xxxxxx0` and `~ctrl & (ctrl >> 7)` always sets the lowest bit to 1.
In naive implementation, it does +1 to start counting zero bits, however, in aarch64 we may start counting one bits immediately. This saves 1 cycle and 5% of iteration performance.
Then it becomes hard to find a supported and sustainable C++ version of it.
`__clsll` is not supported by GCC and was supported only since clang 8, `__builtin_clrsb` is not producing optimal codegen for clang. `__rbit` is not supported by GCC and there is no intrinsic to do that, however, in clang we have `__builtin_bitreverse{32,64}`. For now I decided to enable this only for clang, only if they have appropriate builtins.
PiperOrigin-RevId: 451168570
Change-Id: I7e9256a60aecdc88ced4e6eb15ebc257281b6664
|
| |
| |
| |
| |
| |
| |
| |
| | |
Fixes #1181
ORIGINAL_AUTHOR=jerome.duval@gmail.com
PiperOrigin-RevId: 451006334
Change-Id: Id61e5889fb55594d09e92e7bb98fdf8bfbc13cc4
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
When building pkg-config files, compute linker flags with a string
substitution rather than the JOIN generator expression. This ensures
that commas in linker flags don’t get treated as argument separators in
JOIN.
Bug: https://bugs.debian.org/1011294
PiperOrigin-RevId: 450675966
Change-Id: I61eacc46a468bae5ff3dae2b437a564f2f1042c2
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 450446058
Change-Id: I22a878bf04cf56b8a0e1dd049353acd2f6933828
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 450445030
Change-Id: I1c1e5ed67f81a181454f7fc6751bf42a3bc2bc48
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
See the GCC bug report
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105585
and Abseil bug report
https://github.com/abseil/abseil-cpp/issues/1175
Fixes #1175
PiperOrigin-RevId: 450083136
Change-Id: I207aaffaec9166b335065dd6ef148a721b94048e
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
trigger from MSC_VER 1910 to 1930.
1929 is the last _MSC_VER for Visual Studio 2019.
PiperOrigin-RevId: 449909831
Change-Id: Ibca931cc31131235eba55d2a1b97c7a062f059db
|
| |
| |
| |
| |
| |
| |
| |
| | |
Previously was disabled on iPhone, but still enabled for macOS.
The unscaled cycle clock does not work correctly when run on a VM.
PiperOrigin-RevId: 449876559
Change-Id: I679ade90b43462e8d2794b1a2b32569d59029ed9
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This notably gets prefetch working on MSVC
Implementation note:
https://docs.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-prefetchcacheline
MSVC does have PreFetchCacheLine, but that would require including <windows.h>
in a header
PiperOrigin-RevId: 449602543
Change-Id: I5e6ca4b7c3d287779aa03c2fd348b41fb65c3680
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
functions.
Add a new (internal) feature test macro to detect whether the wrappers are no-ops on a given platform.
Note that one-arg __builtin_prefetch(x) is equivalent to __builtin_prefetch(x, 0, 3), per `man BUILTIN_PREFETCH(3)` and gcc docs.
PiperOrigin-RevId: 449508660
Change-Id: I144e750205eec0c956d8dd62bc72e10bdb87c4f7
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 449351955
Change-Id: Id30280107bb29f7d715327b99a2c954809513a48
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
pointers as ""
Fixes #1167
PiperOrigin-RevId: 449328725
Change-Id: I813785db77b94efa49eeeff4c93449334c380935
|
| |
| |
| |
| |
| |
| |
| | |
LogPrefixHook to a default implementation.
PiperOrigin-RevId: 449306617
Change-Id: Ia3e87d2edcae7e9874998f21a0e2ff245e48fd96
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Both Mutex and CondVar signal PerThreadSem/Waiter after satisfying the wait condition,
as the result the waiting thread may return w/o waiting on the
PerThreadSem/Waiter at all. If the waiting thread then exits, it currently
destroys Waiter object. As the result Waiter::Post can be called on
already destroyed object.
PerThreadSem/Waiter must be type-stable after creation and must not be destroyed.
The futex-based implementation is the only one that is not affected by the bug
since there is effectively nothing to destroy (maybe only UBSan/ASan
could complain about calling methods on a destroyed object).
Here is the problematic sequence of events:
1: void Mutex::Block(PerThreadSynch *s) {
2: while (s->state.load(std::memory_order_acquire) == PerThreadSynch::kQueued) {
3: if (!DecrementSynchSem(this, s, s->waitp->timeout)) {
4: PerThreadSynch *Mutex::Wakeup(PerThreadSynch *w) {
5: ...
6: w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
7: IncrementSynchSem(this, w);
8: ...
9: }
Consider line 6 is executed, then line 2 observes kAvailable and
line 3 is not called. The thread executing Mutex::Block returns from
the method, acquires the mutex, releases the mutex, exits and destroys
PerThreadSem/Waiter.
Now Mutex::Wakeup resumes and executes line 7 on the destroyed object. Boom!
CondVar uses a similar pattern.
Moreover the semaphore-based Waiter implementation is not even destruction-safe
(the Waiter cannot be used to signal own destruction). So even if Mutex/CondVar
would always pair Waiter::Post with Waiter::Wait before destroying PerThreadSem/Waiter,
it would still be subject to use-after-free bug on the semaphore.
PiperOrigin-RevId: 449159939
Change-Id: I497134fa8b6ce1294a422827c5f0de0e897cea31
|
| |
| |
| |
| |
| |
| |
| |
| | |
CondVar::WaitWithTimeout can live-lock when timeout is racing with Signal/SignalAll
and Signal/SignalAll thread is not scheduled due to priorities, affinity or other
scheduler artifacts. This could lead to stalls of up to tens of seconds in some cases.
PiperOrigin-RevId: 449159670
Change-Id: I64bbd277c1f91964cfba3306ba8a80eeadf85f64
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 449067700
Change-Id: I972b1736c28d76ed500e9ad6fd15c7a469a5825f
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 448582508
Change-Id: I67fbff5f42a083e093ea2c20749e073ca03feb0b
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 448361090
Change-Id: Iec6063b88a778dfe815081612650eaa456503265
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Stop the absl::Cord destructor from running on the constinit cord in
CordTest.ConstinitConstructor. This allows inspecting the cord at any point
while the test is exiting, which is important for the semantics of the test.
PiperOrigin-RevId: 448327386
Change-Id: Icef9faa2b63f1f0ae60b3430dcf6184f5dead885
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 448159349
Change-Id: I6b25a90d8a3b6d3a888274d156aa696d77fb042d
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 448075898
Change-Id: Ia4047f833bf27c62752b41f4ba65ab3be88a0181
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
* Avoid warnings due to deprecation of volatile return types.
Also fix up optional_test.cc due to ABSL_USES_STD_OPTIONAL always being
false in its body.
Bug: chromium:1284275
PiperOrigin-RevId: 447796238
Change-Id: If050206c979c6c08af22e71ff0ea91e7f7932f0c
|
| |
| |
| |
| |
| |
| |
| | |
process remains alive.
PiperOrigin-RevId: 446725910
Change-Id: I291fa8c1c41155b1530969f64b2b7f44b1576c92
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
(answer: it's async-signal-safe).
Also, preserve errno across calls to make it actually signal-safe.
PiperOrigin-RevId: 446620926
Change-Id: I875fbec02b909e8424ddf763303b0d6007f8548f
|
| |
| |
| |
| |
| |
| |
| | |
Also note that this probe sequence visits every group exactly once.
PiperOrigin-RevId: 446535602
Change-Id: I13169be3f8ee6a4ddbbe8be84f1e1a482444d0cc
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
complicated, slightly incorrect.
The old analysis viewed it as birthday attack, which asks how often
there are multiple values in the probe same probe sequence with the
same H2. In their own words, this analysis "breaks down" at around `n
= 12`.
Instead we can answer a simpler question, which is, if a probe
sequence examines `k` objects that are not what we are looking for,
what's the number of calls `==`? The expectation is simply `k/128`.
PiperOrigin-RevId: 446518063
Change-Id: Ie879bd4f6c97979822bc9d550b9e2503b1418c78
|
| |
| |
| |
| |
| |
| |
| | |
We also add accessors for rightmost()/mutable_rightmost().
PiperOrigin-RevId: 446515231
Change-Id: I4b8cb46f4bd209a0f51dcdcb96c9479e480828a3
|
| |
| |
| |
| |
| |
| |
| | |
(filtering by severity).
PiperOrigin-RevId: 446476285
Change-Id: Ibd0913e06244424241200d17177a4f220fcb7861
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 446274314
Change-Id: Ibf641808c533a10e0aef8d1601095e539ae5c43a
|
| |
| |
| |
| |
| |
| |
| | |
function_type_benchmark.cc, add missing includes
PiperOrigin-RevId: 446209567
Change-Id: I9aac8ce10b93ed71f1260931995af1d32db6f780
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 446010475
Change-Id: I28020510f3888a11f35b1960e9af441145ebf39b
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 445394311
Change-Id: I265b6a83f79bbed4321e24e6da4730a2c43ddb07
|
| |
| |
| |
| |
| |
| |
| | |
Fixes #1159
PiperOrigin-RevId: 444278141
Change-Id: Iae055fe78b438c31150a9e7601b734f4981f002e
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 444259007
Change-Id: Ic518f66a33e387b7a551f37f7c0f6003c743dcb0
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 443726104
Change-Id: Ibd015472fe3e403c2da49bdeeb365ca9a817b8a5
|
| |
| |
| |
| |
| | |
PiperOrigin-RevId: 443723710
Change-Id: Ic39b0cf2b289efa9cd9434616949dd08a1a35117
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
--
6d4e969ad240d248bfeb644b3b76fffae0f07882 by Christian Blichmann <cblichmann@google.com>:
cmake: Fix description of `ABSL_USE_EXTERNAL_GOOGLETEST` option
There is no `add_subproject()` in CMake.
PiperOrigin-RevId: 443087953
Change-Id: I30c2118638f99ad1389ae197e2c81d1e5f298882
GitOrigin-RevId: 6d4e969ad240d248bfeb644b3b76fffae0f07882
|