summaryrefslogtreecommitdiff
path: root/libs/utils/PollLoop.cpp
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2010-06-16 01:53:36 -0700
committer Jeff Brown <jeffbrown@google.com> 2010-06-17 13:27:16 -0700
commit5c225b1680e696ae8bbf505a1997d6f720672f74 (patch)
tree932326fd02ee91d8a64adfcc9415027646c56563 /libs/utils/PollLoop.cpp
parent3a0146cd29fae3c5bc29d8d535d67826284f8cc9 (diff)
Even more native input dispatch work in progress.
Added more tests. Fixed a regression in Vector. Fixed bugs in pointer tracking. Fixed a starvation issue in PollLoop when setting or removing callbacks. Fixed a couple of policy nits. Modified the internal representation of MotionEvent to be more efficient and more consistent. Added code to skip/cancel virtual key processing when there are multiple pointers down. This helps to better disambiguate virtual key presses from stray touches (such as cheek presses). Change-Id: I2a7d2cce0195afb9125b23378baa94fd2fc6671c
Diffstat (limited to 'libs/utils/PollLoop.cpp')
-rw-r--r--libs/utils/PollLoop.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/libs/utils/PollLoop.cpp b/libs/utils/PollLoop.cpp
index 90a3e8b35374..20a4d1385bd1 100644
--- a/libs/utils/PollLoop.cpp
+++ b/libs/utils/PollLoop.cpp
@@ -11,7 +11,7 @@
#define DEBUG_POLL_AND_WAKE 0
// Debugs callback registration and invocation.
-#define DEBUG_CALLBACKS 1
+#define DEBUG_CALLBACKS 0
#include <cutils/log.h>
#include <utils/PollLoop.h>
@@ -22,7 +22,7 @@
namespace android {
PollLoop::PollLoop() :
- mPolling(false) {
+ mPolling(false), mWaiters(0) {
openWakePipe();
}
@@ -68,6 +68,9 @@ void PollLoop::closeWakePipe() {
bool PollLoop::pollOnce(int timeoutMillis) {
mLock.lock();
+ while (mWaiters != 0) {
+ mResume.wait(mLock);
+ }
mPolling = true;
mLock.unlock();
@@ -156,7 +159,9 @@ bool PollLoop::pollOnce(int timeoutMillis) {
Done:
mLock.lock();
mPolling = false;
- mAwake.broadcast();
+ if (mWaiters != 0) {
+ mAwake.broadcast();
+ }
mLock.unlock();
if (result) {
@@ -258,10 +263,15 @@ ssize_t PollLoop::getRequestIndexLocked(int fd) {
void PollLoop::wakeAndLock() {
mLock.lock();
+ mWaiters += 1;
while (mPolling) {
wake();
mAwake.wait(mLock);
}
+ mWaiters -= 1;
+ if (mWaiters == 0) {
+ mResume.signal();
+ }
}
} // namespace android