mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:23:37 +00:00
Merge changes I707ea158,Ic1c489dd,I7484b772 into main
* changes: libhealthloop: Use designated initializers libhealthloop: Reduce the number of ScheduleBatteryUpdate() calls libhealthloop: Terminate KLOG messages with a newline
This commit is contained in:
@@ -43,6 +43,8 @@ namespace android {
|
||||
namespace hardware {
|
||||
namespace health {
|
||||
|
||||
static constexpr uint32_t kUeventMsgLen = 2048;
|
||||
|
||||
HealthLoop::HealthLoop() {
|
||||
InitHealthdConfig(&healthd_config_);
|
||||
awake_poll_interval_ = -1;
|
||||
@@ -61,14 +63,13 @@ int HealthLoop::RegisterEvent(int fd, BoundFunction func, EventWakeup wakeup) {
|
||||
EventHandler{this, fd, std::move(func)}))
|
||||
.get();
|
||||
|
||||
struct epoll_event ev;
|
||||
|
||||
ev.events = EPOLLIN;
|
||||
struct epoll_event ev = {
|
||||
.events = EPOLLIN,
|
||||
.data.ptr = reinterpret_cast<void*>(event_handler),
|
||||
};
|
||||
|
||||
if (wakeup == EVENT_WAKEUP_FD) ev.events |= EPOLLWAKEUP;
|
||||
|
||||
ev.data.ptr = reinterpret_cast<void*>(event_handler);
|
||||
|
||||
if (epoll_ctl(epollfd_, EPOLL_CTL_ADD, fd, &ev) == -1) {
|
||||
KLOG_ERROR(LOG_TAG, "epoll_ctl failed; errno=%d\n", errno);
|
||||
return -1;
|
||||
@@ -121,32 +122,39 @@ void HealthLoop::PeriodicChores() {
|
||||
ScheduleBatteryUpdate();
|
||||
}
|
||||
|
||||
#define UEVENT_MSG_LEN 2048
|
||||
void HealthLoop::UeventEvent(uint32_t /*epevents*/) {
|
||||
// No need to lock because uevent_fd_ is guaranteed to be initialized.
|
||||
|
||||
char msg[UEVENT_MSG_LEN + 2];
|
||||
char* cp;
|
||||
int n;
|
||||
|
||||
n = uevent_kernel_multicast_recv(uevent_fd_, msg, UEVENT_MSG_LEN);
|
||||
if (n <= 0) return;
|
||||
if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
|
||||
return;
|
||||
|
||||
msg[n] = '\0';
|
||||
msg[n + 1] = '\0';
|
||||
cp = msg;
|
||||
|
||||
while (*cp) {
|
||||
if (!strcmp(cp, "SUBSYSTEM=power_supply")) {
|
||||
ScheduleBatteryUpdate();
|
||||
break;
|
||||
// Returns true if and only if the battery statistics should be updated.
|
||||
bool HealthLoop::RecvUevents() {
|
||||
bool update_stats = false;
|
||||
for (;;) {
|
||||
char msg[kUeventMsgLen + 2];
|
||||
int n = uevent_kernel_multicast_recv(uevent_fd_, msg, kUeventMsgLen);
|
||||
if (n <= 0) return update_stats;
|
||||
if (n >= kUeventMsgLen) {
|
||||
// too long -- discard
|
||||
continue;
|
||||
}
|
||||
if (update_stats) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* advance to after the next \0 */
|
||||
while (*cp++)
|
||||
;
|
||||
msg[n] = '\0';
|
||||
msg[n + 1] = '\0';
|
||||
for (char* cp = msg; *cp;) {
|
||||
if (strcmp(cp, "SUBSYSTEM=power_supply") == 0) {
|
||||
update_stats = true;
|
||||
break;
|
||||
}
|
||||
|
||||
/* advance to after the next \0 */
|
||||
while (*cp++) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HealthLoop::UeventEvent(uint32_t /*epevents*/) {
|
||||
if (RecvUevents()) {
|
||||
ScheduleBatteryUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,9 +191,9 @@ void HealthLoop::UeventInit(void) {
|
||||
std::string error_msg = attach_result.error().message();
|
||||
error_msg +=
|
||||
". This is expected in recovery mode and also for kernel versions before 5.10.";
|
||||
KLOG_WARNING(LOG_TAG, "%s", error_msg.c_str());
|
||||
KLOG_WARNING(LOG_TAG, "%s\n", error_msg.c_str());
|
||||
} else {
|
||||
KLOG_INFO(LOG_TAG, "Successfully attached the BPF filter to the uevent socket");
|
||||
KLOG_INFO(LOG_TAG, "Successfully attached the BPF filter to the uevent socket\n");
|
||||
}
|
||||
|
||||
if (RegisterEvent(uevent_fd_, &HealthLoop::UeventEvent, EVENT_WAKEUP_FD))
|
||||
|
||||
@@ -93,6 +93,7 @@ class HealthLoop {
|
||||
void WakeAlarmInit();
|
||||
void WakeAlarmEvent(uint32_t);
|
||||
void UeventInit();
|
||||
bool RecvUevents();
|
||||
void UeventEvent(uint32_t);
|
||||
void WakeAlarmSetInterval(int interval);
|
||||
void PeriodicChores();
|
||||
|
||||
Reference in New Issue
Block a user