Merge "thermal-hal: Update the common data object with the status"
diff --git a/thermalCommon.cpp b/thermalCommon.cpp
index 2a3ec38..638b3b6 100644
--- a/thermalCommon.cpp
+++ b/thermalCommon.cpp
@@ -113,14 +113,14 @@
 	return -1;
 }
 
-static int readLineFromFile(std::string_view path, std::string *out)
+static int readLineFromFile(std::string_view path, std::string& out)
 {
 	char *fgets_ret;
 	FILE *fd;
 	int rv;
 	char buf[MAX_LENGTH];
 
-	out->clear();
+	out.clear();
 
 	fd = fopen(std::string(path).c_str(), "r");
 	if (fd == NULL) {
@@ -132,19 +132,19 @@
 	fgets_ret = fgets(buf, MAX_LENGTH, fd);
 	if (NULL != fgets_ret) {
 		rv = (int)strlen(buf);
-		out->append(buf, rv);
+		out.append(buf, rv);
 	} else {
 		rv = ferror(fd);
 	}
 
 	fclose(fd);
-	out->erase(std::remove(out->begin(), out->end(), '\n'), out->end());
-	LOG(DEBUG) << "Path:" << std::string(path) << " Val:" << *out << std::endl;
+	out.erase(std::remove(out.begin(), out.end(), '\n'), out.end());
+	LOG(DEBUG) << "Path:" << std::string(path) << " Val:" << out << std::endl;
 
 	return rv;
 }
 
-int ThermalCommon::readFromFile(std::string_view path, std::string *out)
+int ThermalCommon::readFromFile(std::string_view path, std::string& out)
 {
 	return readLineFromFile(path, out);
 }
@@ -183,7 +183,7 @@
 
 		snprintf(name, MAX_PATH, "%s%s/%s", THERMAL_SYSFS,
 				tdirent->d_name, TZ_TYPE);
-		ret = readLineFromFile(std::string_view(name), &buf);
+		ret = readLineFromFile(std::string_view(name), buf);
 		if (ret <= 0) {
 			LOG(ERROR) <<
 				"get_tzn: sensor name read error for tz:" <<
@@ -211,7 +211,7 @@
 	return found;
 }
 
-int ThermalCommon::initialize_sensor(struct target_therm_cfg cfg, int sens_idx)
+int ThermalCommon::initialize_sensor(struct target_therm_cfg& cfg, int sens_idx)
 {
 	struct therm_sensor sensor;
 	int idx = 0;
@@ -270,7 +270,7 @@
 	return 0;
 }
 
-int ThermalCommon::initializeCpuSensor(struct target_therm_cfg cpu_cfg)
+int ThermalCommon::initializeCpuSensor(struct target_therm_cfg& cpu_cfg)
 {
 	int cpu = 0;
 
@@ -282,7 +282,7 @@
 	return 0;
 }
 
-int ThermalCommon::initThermalZones(std::vector<struct target_therm_cfg> cfg)
+int ThermalCommon::initThermalZones(std::vector<struct target_therm_cfg>& cfg)
 {
 	std::vector<struct target_therm_cfg>::iterator it;
 
@@ -342,7 +342,7 @@
 
 		snprintf(name, MAX_PATH, "%s%s/%s", THERMAL_SYSFS,
 				tdirent->d_name, TZ_TYPE);
-		ret = readLineFromFile(std::string_view(name), &buf);
+		ret = readLineFromFile(std::string_view(name), buf);
 		if (ret <= 0) {
 			LOG(ERROR) <<
 				"init_cdev: cdev type read error for cdev:" <<
@@ -357,7 +357,7 @@
 		cdevInst.c.name = it->first;
 		cdevInst.c.type = it->second;
 		cdevInst.cdevn = cdevn;
-		read_cdev_state(&cdevInst);
+		read_cdev_state(cdevInst);
 		cdev.push_back(cdevInst);
 	}
 
@@ -368,7 +368,7 @@
 	return cdev.size();
 }
 
-int ThermalCommon::read_cdev_state(struct therm_cdev *cdev)
+int ThermalCommon::read_cdev_state(struct therm_cdev& cdev)
 {
 	char file_name[MAX_PATH];
 	std::string buf;
@@ -376,51 +376,68 @@
 
 	LOG(DEBUG) << "Entering " <<__func__;
 	snprintf(file_name, sizeof(file_name), CDEV_CUR_STATE_PATH,
-			cdev->cdevn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+			cdev.cdevn);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Cdev state read error:"<< ret <<
-			" for cdev: " << cdev->c.name;
+			" for cdev: " << cdev.c.name;
 		return -1;
 	}
-	cdev->c.value = std::stoi(buf);
-	LOG(DEBUG) << "cdev Name:" << cdev->c.name << ". state:" <<
-		cdev->c.value << std::endl;
+	cdev.c.value = std::stoi(buf, nullptr, 0);
+	LOG(DEBUG) << "cdev Name:" << cdev.c.name << ". state:" <<
+		cdev.c.value << std::endl;
 
-	return cdev->c.value;
+	return cdev.c.value;
 }
 
-int ThermalCommon::estimateSeverity(struct therm_sensor *sensor)
+int ThermalCommon::estimateSeverity(struct therm_sensor& sensor)
 {
 	int idx = 0;
 	ThrottlingSeverity severity = ThrottlingSeverity::NONE;
-	float temp = sensor->t.value;
+	float temp = sensor.t.value;
 
 	for (idx = (int)ThrottlingSeverity::SHUTDOWN; idx >= 0; idx--) {
-		if ((sensor->positiveThresh &&
-			!isnan(sensor->thresh.hotThrottlingThresholds[idx]) &&
+		/* If a particular threshold is hit already, check if the
+		 * hysteresis is cleared before changing the severity */
+		if (idx == (int)sensor.t.throttlingStatus) {
+			if ((sensor.positiveThresh &&
+				!isnan(sensor.thresh.hotThrottlingThresholds[idx]) &&
+				temp >=
+				(sensor.thresh.hotThrottlingThresholds[idx] -
+				DEFAULT_HYSTERESIS / sensor.mulFactor)) ||
+				(!sensor.positiveThresh &&
+				!isnan(sensor.thresh.coldThrottlingThresholds[idx]) &&
+				temp <=
+				(sensor.thresh.coldThrottlingThresholds[idx] +
+				DEFAULT_HYSTERESIS / sensor.mulFactor)))
+				break;
+			continue;
+		}
+		if ((sensor.positiveThresh &&
+			!isnan(sensor.thresh.hotThrottlingThresholds[idx]) &&
 			temp >=
-			sensor->thresh.hotThrottlingThresholds[idx]) ||
-		 	(!sensor->positiveThresh &&
-			!isnan(sensor->thresh.coldThrottlingThresholds[idx]) &&
+			sensor.thresh.hotThrottlingThresholds[idx]) ||
+		 	(!sensor.positiveThresh &&
+			!isnan(sensor.thresh.coldThrottlingThresholds[idx]) &&
 			temp <=
-			sensor->thresh.coldThrottlingThresholds[idx]))
+			sensor.thresh.coldThrottlingThresholds[idx]))
 			break;
 	}
 	if (idx >= 0)
 		severity = (ThrottlingSeverity)(idx);
-	LOG(DEBUG) << "Sensor Name:" << sensor->t.name << ". old severity:" <<
-		(int)sensor->t.throttlingStatus << " New severity:" <<
+	LOG(DEBUG) << "Sensor Name:" << sensor.t.name << ". prev severity:" <<
+		(int)sensor.lastThrottleStatus << ". cur severity:" <<
+		(int)sensor.t.throttlingStatus << " New severity:" <<
 		(int)severity << std::endl;
-	if (severity == sensor->t.throttlingStatus)
-		return 0;
-	sensor->lastThrottleStatus = sensor->t.throttlingStatus;
-	sensor->t.throttlingStatus = severity;
+	if (severity == sensor.t.throttlingStatus)
+		return -1;
+	sensor.lastThrottleStatus = sensor.t.throttlingStatus;
+	sensor.t.throttlingStatus = severity;
 
-	return 0;
+	return (int)severity;
 }
 
-int ThermalCommon::read_temperature(struct therm_sensor *sensor)
+int ThermalCommon::read_temperature(struct therm_sensor& sensor)
 {
 	char file_name[MAX_PATH];
 	float temp;
@@ -429,21 +446,22 @@
 
 	LOG(DEBUG) << "Entering " <<__func__;
 	snprintf(file_name, sizeof(file_name), TEMPERATURE_FILE_FORMAT,
-			sensor->tzn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+			sensor.tzn);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Temperature read error:"<< ret <<
-			" for sensor " << sensor->t.name;
+			" for sensor " << sensor.t.name;
 		return -1;
 	}
-	sensor->t.value = (float)std::stoi(buf) / (float)sensor->mulFactor;
-	LOG(DEBUG) << "Sensor Name:" << sensor->t.name << ". Temperature:" <<
-		(float)sensor->t.value << std::endl;
+	sensor.t.value = (float)std::stoi(buf, nullptr, 0) / (float)sensor.mulFactor;
+	LOG(DEBUG) << "Sensor Name:" << sensor.t.name << ". Temperature:" <<
+		(float)sensor.t.value << std::endl;
 
-	return estimateSeverity(sensor);
+	estimateSeverity(sensor);
+	return ret;
 }
 
-void ThermalCommon::initThreshold(struct therm_sensor sensor)
+void ThermalCommon::initThreshold(struct therm_sensor& sensor)
 {
 	char file_name[MAX_PATH] = "";
 	std::string buf;
@@ -459,7 +477,7 @@
 	}
 	snprintf(file_name, sizeof(file_name), POLICY_FILE_FORMAT,
 			sensor.tzn);
-	ret = readLineFromFile(std::string(file_name), &buf);
+	ret = readLineFromFile(std::string(file_name), buf);
 	if (ret <= 0) {
 		LOG(ERROR) << "Policy read error:"<< ret <<
 			" for sensor " << sensor.t.name;
diff --git a/thermalCommon.h b/thermalCommon.h
index 4375e1e..6a1b348 100644
--- a/thermalCommon.h
+++ b/thermalCommon.h
@@ -44,14 +44,14 @@
 		ThermalCommon();
 		~ThermalCommon() = default;
 
-		int readFromFile(std::string_view path, std::string *out);
-		int initThermalZones(std::vector<struct target_therm_cfg> cfg);
-		void initThreshold(struct therm_sensor sens);
+		int readFromFile(std::string_view path, std::string& out);
+		int initThermalZones(std::vector<struct target_therm_cfg>& cfg);
+		void initThreshold(struct therm_sensor& sens);
 		int initCdev();
 
-		int read_cdev_state(struct therm_cdev *cdev);
-		int read_temperature(struct therm_sensor *sensor);
-		int estimateSeverity(struct therm_sensor *sensor);
+		int read_cdev_state(struct therm_cdev& cdev);
+		int read_temperature(struct therm_sensor& sensor);
+		int estimateSeverity(struct therm_sensor& sensor);
 		int get_cpu_usages(hidl_vec<CpuUsage>& list);
 
 		std::vector<struct therm_sensor> fetch_sensor_list()
@@ -69,8 +69,8 @@
 		std::vector<struct therm_sensor> sens;
 		std::vector<struct therm_cdev> cdev;
 
-		int initializeCpuSensor(struct target_therm_cfg cpu_cfg);
-		int initialize_sensor(struct target_therm_cfg cfg,
+		int initializeCpuSensor(struct target_therm_cfg& cpu_cfg);
+		int initialize_sensor(struct target_therm_cfg& cfg,
 					int sens_idx);
 };
 
diff --git a/thermalConfig.cpp b/thermalConfig.cpp
index 34c0d36..3ab97b1 100644
--- a/thermalConfig.cpp
+++ b/thermalConfig.cpp
@@ -634,7 +634,7 @@
 		bool bcl_defined = false;
 		std::string soc_val;
 
-		if (cmnInst.readFromFile(socIDPath, &soc_val) <= 0) {
+		if (cmnInst.readFromFile(socIDPath, soc_val) <= 0) {
 			LOG(ERROR) <<"soc ID fetch error";
 			return;
 		}
diff --git a/thermalUtils.cpp b/thermalUtils.cpp
index 7aaada4..f057e75 100644
--- a/thermalUtils.cpp
+++ b/thermalUtils.cpp
@@ -54,19 +54,19 @@
 {
 	int ret = 0;
 	std::vector<struct therm_sensor> sensorList;
-	std::vector<struct therm_sensor>::iterator it;
+	std::vector<struct target_therm_cfg> therm_cfg = cfg.fetchConfig();
 
 	is_sensor_init = false;
 	is_cdev_init = false;
-	ret = cmnInst.initThermalZones(cfg.fetchConfig());
+	ret = cmnInst.initThermalZones(therm_cfg);
 	if (ret > 0) {
 		is_sensor_init = true;
 		sensorList = cmnInst.fetch_sensor_list();
 		std::lock_guard<std::mutex> _lock(sens_cb_mutex);
-		for (it = sensorList.begin(); it != sensorList.end(); it++) {
-			thermalConfig[it->sensor_name] = *it;
-			cmnInst.read_temperature(&(*it));
-			cmnInst.initThreshold(*it);
+		for (struct therm_sensor sens: sensorList) {
+			thermalConfig[sens.sensor_name] = sens;
+			cmnInst.read_temperature(sens);
+			cmnInst.initThreshold(sens);
 		}
 		monitor.start();
 	}
@@ -79,23 +79,22 @@
 
 void ThermalUtils::ueventParse(std::string sensor_name, int temp)
 {
-	std::unordered_map<std::string, struct therm_sensor>::iterator it;
-	struct therm_sensor sens;
+	int severity = 0;
 
 	LOG(INFO) << "uevent triggered for sensor: " << sensor_name
 		<< std::endl;
-	it = thermalConfig.find(sensor_name);
-	if (it == thermalConfig.end()) {
+	if (thermalConfig.find(sensor_name) == thermalConfig.end()) {
 		LOG(DEBUG) << "sensor is not monitored:" << sensor_name
 			<< std::endl;
 		return;
 	}
-	sens = it->second;
 	std::lock_guard<std::mutex> _lock(sens_cb_mutex);
+	struct therm_sensor& sens = thermalConfig[sensor_name];
 	sens.t.value = (float)temp / (float)sens.mulFactor;
-	cmnInst.estimateSeverity(&sens);
-	if (sens.lastThrottleStatus != sens.t.throttlingStatus) {
-		LOG(INFO) << "sensor: " << sensor_name <<" old: " <<
+	severity = cmnInst.estimateSeverity(sens);
+	if (severity != -1) {
+		LOG(INFO) << "sensor: " << sensor_name <<" temperature: "
+			<< sens.t.value << " old: " <<
 			(int)sens.lastThrottleStatus << " new: " <<
 			(int)sens.t.throttlingStatus << std::endl;
 		cb(sens.t);
@@ -113,13 +112,13 @@
 		return 0;
 	for (it = thermalConfig.begin(); it != thermalConfig.end();
 			it++, idx++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 		Temperature_1_0 _temp;
 
 		/* v1 supports only CPU, GPU, Battery and SKIN */
 		if (sens.t.type > TemperatureType::SKIN)
 			continue;
-		ret = cmnInst.read_temperature(&sens);
+		ret = cmnInst.read_temperature(sens);
 		if (ret < 0)
 			return ret;
 		_temp.currentValue = sens.t.value;
@@ -145,11 +144,11 @@
 	std::vector<Temperature> _temp;
 
 	for (it = thermalConfig.begin(); it != thermalConfig.end(); it++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 
 		if (filterType && sens.t.type != type)
 			continue;
-		ret = cmnInst.read_temperature(&sens);
+		ret = cmnInst.read_temperature(sens);
 		if (ret < 0)
 			return ret;
 		_temp.push_back(sens.t);
@@ -166,7 +165,7 @@
 	std::vector<TemperatureThreshold> _thresh;
 
 	for (it = thermalConfig.begin(); it != thermalConfig.end(); it++) {
-		struct therm_sensor sens = it->second;
+		struct therm_sensor& sens = it->second;
 
 		if (filterType && sens.t.type != type)
 			continue;
@@ -187,7 +186,7 @@
 
 		if (filterType && cdev.c.type != type)
 			continue;
-		ret = cmnInst.read_cdev_state(&cdev);
+		ret = cmnInst.read_cdev_state(cdev);
 		if (ret < 0)
 			return ret;
 		_cdev.push_back(cdev.c);