MultiHal multithreaded polling
Change-Id: I3ebe380169eed1c8deeca2860d1788be6c14837e
diff --git a/modules/sensors/SensorEventQueue.cpp b/modules/sensors/SensorEventQueue.cpp
index c139944..00013de 100644
--- a/modules/sensors/SensorEventQueue.cpp
+++ b/modules/sensors/SensorEventQueue.cpp
@@ -17,55 +17,28 @@
#include <hardware/sensors.h>
#include <algorithm>
#include <pthread.h>
-
#include <linux/input.h>
-#include <cutils/atomic.h>
#include <cutils/log.h>
#include "SensorEventQueue.h"
SensorEventQueue::SensorEventQueue(int capacity) {
mCapacity = capacity;
+
mStart = 0;
mSize = 0;
mData = new sensors_event_t[mCapacity];
- pthread_cond_init(&mDataAvailableCondition, NULL);
pthread_cond_init(&mSpaceAvailableCondition, NULL);
- pthread_mutex_init(&mMutex, NULL);
}
SensorEventQueue::~SensorEventQueue() {
delete[] mData;
mData = NULL;
- pthread_cond_destroy(&mDataAvailableCondition);
pthread_cond_destroy(&mSpaceAvailableCondition);
- pthread_mutex_destroy(&mMutex);
-}
-
-void SensorEventQueue::lock() {
- pthread_mutex_lock(&mMutex);
-}
-
-void SensorEventQueue::unlock() {
- pthread_mutex_unlock(&mMutex);
-}
-
-void SensorEventQueue::waitForSpaceAndLock() {
- lock();
- while (mSize >= mCapacity) {
- pthread_cond_wait(&mSpaceAvailableCondition, &mMutex);
- }
-}
-
-void SensorEventQueue::waitForDataAndLock() {
- lock();
- while (mSize <= 0) {
- pthread_cond_wait(&mDataAvailableCondition, &mMutex);
- }
}
int SensorEventQueue::getWritableRegion(int requestedLength, sensors_event_t** out) {
- if (mSize >= mCapacity || requestedLength <= 0) {
+ if (mSize == mCapacity || requestedLength <= 0) {
*out = NULL;
return 0;
}
@@ -88,9 +61,6 @@
void SensorEventQueue::markAsWritten(int count) {
mSize += count;
- if (mSize) {
- pthread_cond_broadcast(&mDataAvailableCondition);
- }
}
int SensorEventQueue::getSize() {
@@ -98,13 +68,21 @@
}
sensors_event_t* SensorEventQueue::peek() {
- if (mSize <= 0) return NULL;
+ if (mSize == 0) return NULL;
return &mData[mStart];
}
void SensorEventQueue::dequeue() {
- if (mSize <= 0) return;
+ if (mSize == 0) return;
+ if (mSize == mCapacity) {
+ pthread_cond_broadcast(&mSpaceAvailableCondition);
+ }
mSize--;
mStart = (mStart + 1) % mCapacity;
- pthread_cond_broadcast(&mSpaceAvailableCondition);
+}
+
+void SensorEventQueue::waitForSpace(pthread_mutex_t* mutex) {
+ while (mSize == mCapacity) {
+ pthread_cond_wait(&mSpaceAvailableCondition, mutex);
+ }
}