Reduce memory footprint of ituxd
This patch eliminates creation of temporary
objects in some methods and thereby reduces
memory footprint.
Bug: 17850611
BZ: 225614
Change-Id: I49eabc9271553e15f5cbd7196d083629f4323b77
Signed-off-by: Saranya Gopal <[email protected]>
diff --git a/ituxd/jni/thermalJNI.cpp b/ituxd/jni/thermalJNI.cpp
index 4c92775..8a64906 100644
--- a/ituxd/jni/thermalJNI.cpp
+++ b/ituxd/jni/thermalJNI.cpp
@@ -248,9 +248,35 @@
}
}
+static jint readSysfsTemp(JNIEnv* env, jobject obj, jstring jPath)
+{
+ const char *path = NULL;
+ const int SIZE = 64;
+ char buf[SIZE];
+ // Convention: To allow returning of normal negative temperatures
+ // (say -10C), let us return errno as a negative offset from
+ // absolute zero millidegree C.
+ const int ABS_ZERO = -273000;
+ int ret;
+
+ path = jPath ? env->GetStringUTFChars(jPath, NULL) : NULL;
+ if (!path) {
+ jniThrowNullPointerException(env, "path");
+ return (ABS_ZERO - ENOENT);
+ }
+
+ ret = readFromFile(path, buf, SIZE, true);
+ env->ReleaseStringUTFChars(jPath, path);
+ if (ret > 0) {
+ return atoi(buf);
+ }
+ return (ret + ABS_ZERO);
+}
+
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"native_readSysfs", "(Ljava/lang/String;)Ljava/lang/String;", (void*)readSysfs},
+ {"native_readSysfsTemp", "(Ljava/lang/String;)I", (void*)readSysfsTemp},
{"native_writeSysfs", "(Ljava/lang/String;I)I", (void*)writeSysfs},
{"native_getThermalZoneIndex", "(Ljava/lang/String;)I", (void*)getThermalZoneIndex},
{"native_getThermalZoneIndexContains", "(Ljava/lang/String;)I",
diff --git a/ituxd/src/com/intel/thermal/RawThermalZone.java b/ituxd/src/com/intel/thermal/RawThermalZone.java
index 4baba9a..9953a02 100644
--- a/ituxd/src/com/intel/thermal/RawThermalZone.java
+++ b/ituxd/src/com/intel/thermal/RawThermalZone.java
@@ -75,9 +75,10 @@
}
} else {
//zone temp is max of all sensor temp
- for (ThermalSensor ts : getThermalSensorList()) {
- if (ts != null && ts.getSensorActiveStatus()) {
- curTemp = ts.getCurrTemp();
+ for (int i = 0; i < mThermalSensors.size(); i++) {
+ if (mThermalSensors.get(i) != null &&
+ mThermalSensors.get(i).getSensorActiveStatus()) {
+ curTemp = mThermalSensors.get(i).getCurrTemp();
if (curTemp > maxCurTemp) {
maxCurTemp = curTemp;
}
diff --git a/ituxd/src/com/intel/thermal/ThermalManager.java b/ituxd/src/com/intel/thermal/ThermalManager.java
index b68bd3d..e9e5597 100644
--- a/ituxd/src/com/intel/thermal/ThermalManager.java
+++ b/ituxd/src/com/intel/thermal/ThermalManager.java
@@ -207,6 +207,9 @@
public static final int INVALID_TEMP = 0xDEADBEEF;
+ /* Absolute zero in millidegree C */
+ public static final int ABS_ZERO = -273000;
+
/* base sysfs path for sensors */
public static final String sSysfsSensorBasePath = "/sys/class/thermal/thermal_zone";
diff --git a/ituxd/src/com/intel/thermal/ThermalSensor.java b/ituxd/src/com/intel/thermal/ThermalSensor.java
index 78c7739..eb6d75f 100644
--- a/ituxd/src/com/intel/thermal/ThermalSensor.java
+++ b/ituxd/src/com/intel/thermal/ThermalSensor.java
@@ -219,14 +219,11 @@
* Method that actually does a Sysfs read.
*/
public int readSensorTemp() {
- int val = ThermalManager.INVALID_TEMP;
- try {
- String tempStr = ThermalUtils.readSysfs(mInputTempPath);
- if (tempStr != null) {
- val = Integer.parseInt(tempStr.trim());
- }
- } catch (NumberFormatException e) {
- Log.i(TAG, "NumberFormatException in readSensorTemp():" + mInputTempPath);
+ int val = ThermalUtils.readSysfsTemp(mInputTempPath);
+ if (val <= ThermalManager.ABS_ZERO) {
+ // Error will be returned as negative offset from absolute zero in milli degree C
+ Log.e(TAG, "readSensorTemp failed with error:" + (val - ThermalManager.ABS_ZERO));
+ val = ThermalManager.INVALID_TEMP;
}
return val;
}
diff --git a/ituxd/src/com/intel/thermal/ThermalUtils.java b/ituxd/src/com/intel/thermal/ThermalUtils.java
index 7126f9b..0094e5b 100644
--- a/ituxd/src/com/intel/thermal/ThermalUtils.java
+++ b/ituxd/src/com/intel/thermal/ThermalUtils.java
@@ -37,6 +37,7 @@
/* Native methods to access Sysfs Interfaces */
private native static String native_readSysfs(String path);
+ private native static int native_readSysfsTemp(String path);
private native static int native_writeSysfs(String path, int val);
private native static int native_getThermalZoneIndex(String name);
private native static int native_getThermalZoneIndexContains(String name);
@@ -54,6 +55,15 @@
}
}
+ public static int readSysfsTemp(String path) {
+ try {
+ return native_readSysfsTemp(path);
+ } catch (UnsatisfiedLinkError e) {
+ Log.i(TAG, "caught UnsatisfiedLinkError in readSysfsTemp");
+ return INVALID_TEMP;
+ }
+ }
+
public static int writeSysfs(String path, int val) {
try {
return native_writeSysfs(path, val);
@@ -143,22 +153,11 @@
}
public static void getTjMax() {
- String temp_tjmax;
-
- temp_tjmax = readSysfs(ThermalManager.TJMAX_PATH);
- if (temp_tjmax != null) {
- try {
- ThermalManager.sTjMaxTemp = Integer.parseInt(temp_tjmax);
- Log.i(TAG, "TjMax temp = " + ThermalManager.sTjMaxTemp);
- } catch (NumberFormatException e) {
- ThermalManager.sTjMaxTemp = ThermalManager.sDefaultTjMax;
- Log.i(TAG, "TjMax value invalid, Default TjMax value =" +
- ThermalManager.sTjMaxTemp);
- }
- } else {
- ThermalManager.sTjMaxTemp = ThermalManager.sDefaultTjMax;
+ ThermalManager.sTjMaxTemp = readSysfsTemp(ThermalManager.TJMAX_PATH);
+ if (ThermalManager.sTjMaxTemp <= ThermalManager.ABS_ZERO) {
Log.i(TAG, "TjMax temp read failed, Default TjMax value =" +
ThermalManager.sTjMaxTemp);
+ ThermalManager.sTjMaxTemp = ThermalManager.sDefaultTjMax;
}
}
diff --git a/ituxd/src/com/intel/thermal/ThermalZone.java b/ituxd/src/com/intel/thermal/ThermalZone.java
index a3af5af..9844f9e 100644
--- a/ituxd/src/com/intel/thermal/ThermalZone.java
+++ b/ituxd/src/com/intel/thermal/ThermalZone.java
@@ -481,9 +481,9 @@
* zone operates in polling mode.
*/
public boolean isZoneStateChanged() {
- for (ThermalSensor ts : mThermalSensors) {
- if (ts.getSensorActiveStatus()) {
- ts.updateSensorTemp();
+ for (int i = 0; i < mThermalSensors.size(); i++) {
+ if (mThermalSensors.get(i).getSensorActiveStatus()) {
+ mThermalSensors.get(i).updateSensorTemp();
}
}
return updateZoneParams();
diff --git a/ituxd/src/com/intel/thermal/VirtualThermalZone.java b/ituxd/src/com/intel/thermal/VirtualThermalZone.java
index 1f4fd4d..52364ca 100644
--- a/ituxd/src/com/intel/thermal/VirtualThermalZone.java
+++ b/ituxd/src/com/intel/thermal/VirtualThermalZone.java
@@ -175,14 +175,15 @@
// In UEvent mode, the obtained temperature is the zone temperature
return true;
} else {
- for (ThermalSensor ts : getThermalSensorList()) {
- if (ts != null && ts.getSensorActiveStatus()) {
+ for (int i = 0; i < mThermalSensors.size(); i++) {
+ if (mThermalSensors.get(i) != null
+ && mThermalSensors.get(i).getSensorActiveStatus()) {
if (flag == false) {
// one time initialization of zone temp
curZoneTemp = 0;
flag = true;
}
- weightedTemp = getWeightedTemp(ts);
+ weightedTemp = getWeightedTemp(mThermalSensors.get(i));
if (weightedTemp != ThermalManager.INVALID_TEMP) {
curZoneTemp += weightedTemp;
}