From 51147a836955ed6ff7c111bbce89e244f0c3f27f Mon Sep 17 00:00:00 2001
From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期四, 17 八月 2017 16:20:05 +0800
Subject: [PATCH] aaaaa
---
VisitFace/RtspNativeCodec/app/libs/capnproto/include/kj/mutex.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/VisitFace/RtspNativeCodec/app/libs/capnproto/include/kj/mutex.h b/VisitFace/RtspNativeCodec/app/libs/capnproto/include/kj/mutex.h
index d211ebf..76edeb2 100644
--- a/VisitFace/RtspNativeCodec/app/libs/capnproto/include/kj/mutex.h
+++ b/VisitFace/RtspNativeCodec/app/libs/capnproto/include/kj/mutex.h
@@ -67,6 +67,16 @@
// non-trivial, assert that the mutex is locked (which should be good enough to catch problems
// in unit tests). In non-debug builds, do nothing.
+#if KJ_USE_FUTEX // TODO(soon): Implement on pthread & win32
+ class Predicate {
+ public:
+ virtual bool check() = 0;
+ };
+
+ void lockWhen(Predicate& predicate);
+ // Lock (exclusively) when predicate.check() returns true.
+#endif
+
private:
#if KJ_USE_FUTEX
uint futex;
@@ -79,6 +89,11 @@
static constexpr uint EXCLUSIVE_HELD = 1u << 31;
static constexpr uint EXCLUSIVE_REQUESTED = 1u << 30;
static constexpr uint SHARED_COUNT_MASK = EXCLUSIVE_REQUESTED - 1;
+
+ struct Waiter;
+ kj::Maybe<Waiter&> waitersHead = nullptr;
+ kj::Maybe<Waiter&>* waitersTail = &waitersHead;
+ // linked list of waitUntil()s; can only modify under lock
#elif _WIN32
uintptr_t srwLock; // Actually an SRWLOCK, but don't want to #include <windows.h> in header.
@@ -249,6 +264,39 @@
inline T& getAlreadyLockedExclusive() const;
// Like `getWithoutLock()`, but asserts that the lock is already held by the calling thread.
+#if KJ_USE_FUTEX // TODO(soon): Implement on pthread & win32
+ template <typename Cond, typename Func>
+ auto when(Cond&& condition, Func&& callback) const -> decltype(callback(instance<T&>())) {
+ // Waits until condition(state) returns true, then calls callback(state) under lock.
+ //
+ // `condition`, when called, receives as its parameter a const reference to the state, which is
+ // locked (either shared or exclusive). `callback` returns a mutable reference, which is
+ // exclusively locked.
+ //
+ // `condition()` may be called multiple times, from multiple threads, while waiting for the
+ // condition to become true. It may even return true once, but then be called more times.
+ // It is guaranteed, though, that at the time `callback()` is finally called, `condition()`
+ // would currently return true (assuming it is a pure function of the guarded data).
+
+ struct PredicateImpl final: public _::Mutex::Predicate {
+ bool check() override {
+ return condition(value);
+ }
+
+ Cond&& condition;
+ const T& value;
+
+ PredicateImpl(Cond&& condition, const T& value)
+ : condition(kj::fwd<Cond>(condition)), value(value) {}
+ };
+
+ PredicateImpl impl(kj::fwd<Cond>(condition), value);
+ mutex.lockWhen(impl);
+ KJ_DEFER(mutex.unlock(_::Mutex::EXCLUSIVE));
+ return callback(value);
+ }
+#endif
+
private:
mutable _::Mutex mutex;
mutable T value;
--
Gitblit v1.8.0