Merge "Fix NC caused by race condition in SystemSensorManager" into nyc-dev

This commit is contained in:
Peng Xu
2016-03-16 19:30:54 +00:00
committed by Android (Google) Code Review

View File

@@ -54,10 +54,9 @@ public class SystemSensorManager extends SensorManager {
private static native void nativeGetDynamicSensors(long nativeInstance, List<Sensor> list); private static native void nativeGetDynamicSensors(long nativeInstance, List<Sensor> list);
private static native boolean nativeIsDataInjectionEnabled(long nativeInstance); private static native boolean nativeIsDataInjectionEnabled(long nativeInstance);
private static final Object sLock = new Object();
private static boolean sSensorModuleInitialized = false; private static boolean sSensorModuleInitialized = false;
private static InjectEventQueue mInjectEventQueue = null; private static InjectEventQueue sInjectEventQueue = null;
private final Object mLock = new Object();
private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>(); private final ArrayList<Sensor> mFullSensorsList = new ArrayList<>();
private List<Sensor> mFullDynamicSensorsList = new ArrayList<>(); private List<Sensor> mFullDynamicSensorsList = new ArrayList<>();
@@ -84,24 +83,24 @@ public class SystemSensorManager extends SensorManager {
/** {@hide} */ /** {@hide} */
public SystemSensorManager(Context context, Looper mainLooper) { public SystemSensorManager(Context context, Looper mainLooper) {
synchronized(sLock) {
if (!sSensorModuleInitialized) {
sSensorModuleInitialized = true;
nativeClassInit();
}
}
mMainLooper = mainLooper; mMainLooper = mainLooper;
mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion; mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
mContext = context; mContext = context;
mNativeInstance = nativeCreate(context.getOpPackageName()); mNativeInstance = nativeCreate(context.getOpPackageName());
synchronized(mLock) { // initialize the sensor list
if (!sSensorModuleInitialized) { for (int index = 0;;++index) {
sSensorModuleInitialized = true; Sensor sensor = new Sensor();
nativeClassInit(); if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break;
} mFullSensorsList.add(sensor);
mHandleToSensor.put(sensor.getHandle(), sensor);
// initialize the sensor list
for (int index = 0;;++index) {
Sensor sensor = new Sensor();
if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break;
mFullSensorsList.add(sensor);
mHandleToSensor.put(sensor.getHandle(), sensor);
}
} }
} }
@@ -257,7 +256,7 @@ public class SystemSensorManager extends SensorManager {
} }
protected boolean initDataInjectionImpl(boolean enable) { protected boolean initDataInjectionImpl(boolean enable) {
synchronized (mLock) { synchronized (sLock) {
if (enable) { if (enable) {
boolean isDataInjectionModeEnabled = nativeIsDataInjectionEnabled(mNativeInstance); boolean isDataInjectionModeEnabled = nativeIsDataInjectionEnabled(mNativeInstance);
// The HAL does not support injection OR SensorService hasn't been set in DI mode. // The HAL does not support injection OR SensorService hasn't been set in DI mode.
@@ -266,15 +265,15 @@ public class SystemSensorManager extends SensorManager {
return false; return false;
} }
// Initialize a client for data_injection. // Initialize a client for data_injection.
if (mInjectEventQueue == null) { if (sInjectEventQueue == null) {
mInjectEventQueue = new InjectEventQueue(mMainLooper, this, sInjectEventQueue = new InjectEventQueue(mMainLooper, this,
mContext.getPackageName()); mContext.getPackageName());
} }
} else { } else {
// If data injection is being disabled clean up the native resources. // If data injection is being disabled clean up the native resources.
if (mInjectEventQueue != null) { if (sInjectEventQueue != null) {
mInjectEventQueue.dispose(); sInjectEventQueue.dispose();
mInjectEventQueue = null; sInjectEventQueue = null;
} }
} }
return true; return true;
@@ -283,17 +282,17 @@ public class SystemSensorManager extends SensorManager {
protected boolean injectSensorDataImpl(Sensor sensor, float[] values, int accuracy, protected boolean injectSensorDataImpl(Sensor sensor, float[] values, int accuracy,
long timestamp) { long timestamp) {
synchronized (mLock) { synchronized (sLock) {
if (mInjectEventQueue == null) { if (sInjectEventQueue == null) {
Log.e(TAG, "Data injection mode not activated before calling injectSensorData"); Log.e(TAG, "Data injection mode not activated before calling injectSensorData");
return false; return false;
} }
int ret = mInjectEventQueue.injectSensorData(sensor.getHandle(), values, accuracy, int ret = sInjectEventQueue.injectSensorData(sensor.getHandle(), values, accuracy,
timestamp); timestamp);
// If there are any errors in data injection clean up the native resources. // If there are any errors in data injection clean up the native resources.
if (ret != 0) { if (ret != 0) {
mInjectEventQueue.dispose(); sInjectEventQueue.dispose();
mInjectEventQueue = null; sInjectEventQueue = null;
} }
return ret == 0; return ret == 0;
} }