- ed0ba496fe01eb8edfa86beade8a37768e7c12ef Updates the API for Exception Safety testing to use build... by Abseil Team <absl-team@google.com>
- c4b7a4e517c9404932c45f2f9f92eb7dc694e45d Internal change by Abseil Team <absl-team@google.com> - 76c78ed9385f65d881511645446e0bb8ababf6ec Add missing ABSL_PREDICT_FALSE to one of FixedArray::at()... by Abseil Team <absl-team@google.com> - 1204fb1c46f007dd9dfb7d9abf3e96c58835d193 Internal change. by Greg Falcon <gfalcon@google.com> - f1f47c98a026bc5e425ae83ff4a2eb391bbd3d9b Add internal-only functionality to examine the stack, to ... by Derek Mauro <dmauro@google.com> - 30d63097cd268d912f917526f6511005580465c4 fix typo by Abseil Team <absl-team@google.com> - 942d7efa6cf54cd248ca57dcaf3c245188b52a76 Remove unnecessary semicolons from comment examples. by Abseil Team <absl-team@google.com> - 7db0669cf23a06d934d3ed8c76aee4e4e23b7e04 Remove malloc_hook and malloc_extension from our internal... by Greg Falcon <gfalcon@google.com> - 0190f1063d101b1ded355019df2e1d325931f6c7 Make the maximum length of a string view equal difference... by Abseil Team <absl-team@google.com> - c8ae37cbce29449b02115a0ebd435ddc3d7ab062 Add namespace qualification. by Shaindel Schwartz <shaindel@google.com> - ff70afe2e6e3dd39f51ce9829e3e1f18231bf4d7 Fix internal/direct_mmap.h for non-linux builds. by Greg Falcon <gfalcon@google.com> GitOrigin-RevId: ed0ba496fe01eb8edfa86beade8a37768e7c12ef Change-Id: I7595ee3480d1d6724fd3797c15ba9d9be0d17e62
This commit is contained in:
parent
a7e522daf1
commit
5b53540166
35 changed files with 831 additions and 2601 deletions
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/base/internal/cycleclock.h"
|
||||
#include "absl/base/internal/malloc_extension.h"
|
||||
#include "absl/base/internal/thread_identity.h"
|
||||
#include "absl/strings/str_cat.h"
|
||||
#include "absl/time/clock.h"
|
||||
|
|
@ -167,79 +166,6 @@ TEST_F(PerThreadSemTest, Timeouts) {
|
|||
EXPECT_TRUE(Wait(negative_timeout));
|
||||
}
|
||||
|
||||
// Test that idle threads properly register themselves as such with malloc.
|
||||
TEST_F(PerThreadSemTest, Idle) {
|
||||
// We can't use gmock because it might use synch calls. So we do it
|
||||
// by hand, messily. I don't bother hitting every one of the
|
||||
// MallocExtension calls because most of them won't get made
|
||||
// anyway--if they do we can add them.
|
||||
class MockMallocExtension : public base_internal::MallocExtension {
|
||||
public:
|
||||
MockMallocExtension(base_internal::MallocExtension *real,
|
||||
base_internal::ThreadIdentity *id,
|
||||
std::atomic<int> *idles, std::atomic<int> *busies)
|
||||
: real_(real), id_(id), idles_(idles), busies_(busies) {}
|
||||
void MarkThreadIdle() override {
|
||||
if (base_internal::CurrentThreadIdentityIfPresent() != id_) {
|
||||
return;
|
||||
}
|
||||
idles_->fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
void MarkThreadBusy() override {
|
||||
if (base_internal::CurrentThreadIdentityIfPresent() != id_) {
|
||||
return;
|
||||
}
|
||||
busies_->fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
size_t GetAllocatedSize(const void* p) override {
|
||||
return real_->GetAllocatedSize(p);
|
||||
}
|
||||
|
||||
private:
|
||||
MallocExtension *real_;
|
||||
base_internal::ThreadIdentity *id_;
|
||||
std::atomic<int>* idles_;
|
||||
std::atomic<int>* busies_;
|
||||
};
|
||||
|
||||
base_internal::ThreadIdentity *id = GetOrCreateCurrentThreadIdentity();
|
||||
std::atomic<int> idles(0);
|
||||
std::atomic<int> busies(0);
|
||||
base_internal::MallocExtension *old =
|
||||
base_internal::MallocExtension::instance();
|
||||
MockMallocExtension mock(old, id, &idles, &busies);
|
||||
base_internal::MallocExtension::Register(&mock);
|
||||
std::atomic<int> sync(0);
|
||||
|
||||
std::thread t([id, &idles, &sync]() {
|
||||
// Wait for the main thread to begin the wait process
|
||||
while (0 == sync.load(std::memory_order_relaxed)) {
|
||||
SleepFor(absl::Milliseconds(1));
|
||||
}
|
||||
// Wait for main thread to become idle, then wake it
|
||||
// pretend time is passing--enough of these should cause an idling.
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
Tick(id);
|
||||
}
|
||||
while (0 == idles.load(std::memory_order_relaxed)) {
|
||||
// Keep ticking, just in case.
|
||||
Tick(id);
|
||||
SleepFor(absl::Milliseconds(1));
|
||||
}
|
||||
Post(id);
|
||||
});
|
||||
|
||||
idles.store(0, std::memory_order_relaxed); // In case we slept earlier.
|
||||
sync.store(1, std::memory_order_relaxed);
|
||||
Wait(KernelTimeout::Never());
|
||||
|
||||
// t will wake us once we become idle.
|
||||
EXPECT_LT(0, busies.load(std::memory_order_relaxed));
|
||||
t.join();
|
||||
base_internal::MallocExtension::Register(old);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace synchronization_internal
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue