summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2010-11-15 13:22:16 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2010-11-15 13:22:16 -0800
commit69e2d97ab13641622b7da40bed47b17d61b4d889 (patch)
treed6aa1d51d3e567563690a20efbd9cec90fbb4c9c /services
parentdab0014acc9e010a65352a2eaa15bbed309a9c87 (diff)
parentf11bf284d355e2a8378c6a37a7ed702705ec6144 (diff)
downloadframeworks_base-69e2d97ab13641622b7da40bed47b17d61b4d889.zip
frameworks_base-69e2d97ab13641622b7da40bed47b17d61b4d889.tar.gz
frameworks_base-69e2d97ab13641622b7da40bed47b17d61b4d889.tar.bz2
am f11bf284: am 305bc0fe: Merge "Fix a race condition in sensormanager" into gingerbread
* commit 'f11bf284d355e2a8378c6a37a7ed702705ec6144': Fix a race condition in sensormanager
Diffstat (limited to 'services')
-rw-r--r--services/sensorservice/SensorService.cpp6
-rw-r--r--services/sensorservice/SensorService.h3
2 files changed, 8 insertions, 1 deletions
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index b5e73ac..22a45df 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -464,6 +464,7 @@ void SensorService::SensorEventConnection::onFirstRef()
}
bool SensorService::SensorEventConnection::addSensor(int32_t handle) {
+ Mutex::Autolock _l(mConnectionLock);
if (mSensorInfo.indexOfKey(handle) <= 0) {
SensorInfo info;
mSensorInfo.add(handle, info);
@@ -473,6 +474,7 @@ bool SensorService::SensorEventConnection::addSensor(int32_t handle) {
}
bool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
+ Mutex::Autolock _l(mConnectionLock);
if (mSensorInfo.removeItem(handle) >= 0) {
return true;
}
@@ -480,16 +482,19 @@ bool SensorService::SensorEventConnection::removeSensor(int32_t handle) {
}
bool SensorService::SensorEventConnection::hasSensor(int32_t handle) const {
+ Mutex::Autolock _l(mConnectionLock);
return mSensorInfo.indexOfKey(handle) >= 0;
}
bool SensorService::SensorEventConnection::hasAnySensor() const {
+ Mutex::Autolock _l(mConnectionLock);
return mSensorInfo.size() ? true : false;
}
status_t SensorService::SensorEventConnection::setEventRateLocked(
int handle, nsecs_t ns)
{
+ Mutex::Autolock _l(mConnectionLock);
ssize_t index = mSensorInfo.indexOfKey(handle);
if (index >= 0) {
SensorInfo& info = mSensorInfo.editValueFor(handle);
@@ -506,6 +511,7 @@ status_t SensorService::SensorEventConnection::sendEvents(
// filter out events not for this connection
size_t count = 0;
if (scratch) {
+ Mutex::Autolock _l(mConnectionLock);
size_t i=0;
while (i<numEvents) {
const int32_t curr = buffer[i].sensor;
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index b442779..c0922f5 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -75,8 +75,9 @@ class SensorService :
sp<SensorService> const mService;
sp<SensorChannel> const mChannel;
+ mutable Mutex mConnectionLock;
- // protected by SensorService::mLock
+ // protected mConnectionLock
struct SensorInfo {
SensorInfo() : ns(DEFAULT_EVENTS_PERIOD) { }
nsecs_t ns;