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;
                     }