Merge "Fix NC caused by race condition in SystemSensorManager" into nyc-dev
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user