diff options
Diffstat (limited to 'services/java/com/android/server/SensorService.java')
-rw-r--r-- | services/java/com/android/server/SensorService.java | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/services/java/com/android/server/SensorService.java b/services/java/com/android/server/SensorService.java index ceef39f93ff9..4dfeb9d51b8d 100644 --- a/services/java/com/android/server/SensorService.java +++ b/services/java/com/android/server/SensorService.java @@ -84,12 +84,16 @@ class SensorService extends ISensorService.Stub { if (hasSensor(sensor)) { removeSensor(sensor); try { - deactivateIfUnused(sensor); + deactivateIfUnusedLocked(sensor); } catch (RemoteException e) { Log.w(TAG, "RemoteException in binderDied"); } } } + if (mListeners.size() == 0) { + _sensors_control_wake(); + _sensors_control_close(); + } mListeners.notify(); } } @@ -102,9 +106,12 @@ class SensorService extends ISensorService.Stub { } public Bundle getDataChannel() throws RemoteException { - return _sensors_control_open(); + // synchronize so we do not require sensor HAL to be thread-safe. + synchronized(mListeners) { + return _sensors_control_open(); + } } - + public boolean enableSensor(IBinder binder, String name, int sensor, int enable) throws RemoteException { if (localLOGV) Log.d(TAG, "enableSensor " + name + "(#" + sensor + ") " + enable); @@ -163,7 +170,7 @@ class SensorService extends ISensorService.Stub { l.addSensor(sensor, enable); } else { l.removeSensor(sensor); - deactivateIfUnused(sensor); + deactivateIfUnusedLocked(sensor); if (l.mSensors == 0) { mListeners.remove(l); binder.unlinkToDeath(l, 0); @@ -173,12 +180,13 @@ class SensorService extends ISensorService.Stub { if (mListeners.size() == 0) { _sensors_control_wake(); + _sensors_control_close(); } } return true; } - void deactivateIfUnused(int sensor) throws RemoteException { + private void deactivateIfUnusedLocked(int sensor) throws RemoteException { int size = mListeners.size(); for (int i=0 ; i<size ; i++) { if (mListeners.get(i).hasSensor(sensor)) @@ -187,10 +195,11 @@ class SensorService extends ISensorService.Stub { _sensors_control_activate(sensor, false); } - ArrayList<Listener> mListeners = new ArrayList<Listener>(); + private ArrayList<Listener> mListeners = new ArrayList<Listener>(); private static native int _sensors_control_init(); private static native Bundle _sensors_control_open(); + private static native int _sensors_control_close(); private static native boolean _sensors_control_activate(int sensor, boolean activate); private static native int _sensors_control_set_delay(int ms); private static native int _sensors_control_wake(); |