From 95895f65fe1c6164fdb790fc6aad896e0c7fe0f5 Mon Sep 17 00:00:00 2001 From: ston Date: Sun, 29 Dec 2024 20:40:59 +0800 Subject: [PATCH] legiond: refactor config reload --- extra/service/legiond/legiond.c | 15 +++--- extra/service/legiond/modules/parseconf.c | 64 ++++++++--------------- extra/service/legiond/modules/parseconf.h | 31 +++++------ 3 files changed, 46 insertions(+), 64 deletions(-) diff --git a/extra/service/legiond/legiond.c b/extra/service/legiond/legiond.c index f6b51dc..9dc7523 100644 --- a/extra/service/legiond/legiond.c +++ b/extra/service/legiond/legiond.c @@ -102,12 +102,12 @@ int main() inotify_fd = inotify_init(); inotify_add_watch(inotify_fd, profile_path, IN_MODIFY); inotify_add_watch(inotify_fd, ac_path, IN_MODIFY); - + // listen while (1) { FD_ZERO(&readfds); - FD_SET(fd, &readfds); - FD_SET(inotify_fd, &readfds); + FD_SET(fd, &readfds); + FD_SET(inotify_fd, &readfds); maxfd = (fd > inotify_fd) ? fd : inotify_fd; @@ -128,7 +128,8 @@ int main() set_timer(&its, delayed, 0, timerid); } else if (ret[1] == '0') { printf("reset timer\n"); - set_timer(&its, delay_s, delay_ns, timerid); + set_timer(&its, delay_s, delay_ns, + timerid); } else { printf("reset timer with delay\n"); int delay; @@ -152,9 +153,9 @@ int main() if (FD_ISSET(inotify_fd, &readfds)) { int lengh = read(inotify_fd, buffer, BUF_LEN); - char* p = buffer; - while(p < buffer + lengh) { - event = (struct inotify_event*)p; + char *p = buffer; + while (p < buffer + lengh) { + event = (struct inotify_event *)p; if (event->mask & IN_MODIFY) { pretty("power-state/power-profile change"); pretty("config reload start"); diff --git a/extra/service/legiond/modules/parseconf.c b/extra/service/legiond/modules/parseconf.c index 774942c..3b8a9e4 100644 --- a/extra/service/legiond/modules/parseconf.c +++ b/extra/service/legiond/modules/parseconf.c @@ -5,89 +5,69 @@ #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0 -static bool reload = false; - static int handler(void *user, const char *section, const char *name, const char *value) { LEGIOND_CONFIG *pconfig = (LEGIOND_CONFIG *)user; + command *ptr_cmd = NULL; + if (MATCH("main", "cpu_control")) { if (strcmp(value, "true") == 0) pconfig->cpu_control = true; else pconfig->cpu_control = false; } else if (MATCH("main", "gpu_control")) { - pconfig->gpu_control = strdup(value); + ptr_cmd = &pconfig->gpu_control; } else if (MATCH("main", "fan_control")) { if (strcmp(value, "true") == 0) pconfig->fan_control = true; else pconfig->fan_control = false; } else if (MATCH("gpu_control", "tdp_ac_q")) { - pconfig->gpu_tdp_ac_q = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_ac_q; } else if (MATCH("gpu_control", "tdp_bat_q")) { - pconfig->gpu_tdp_bat_q = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_bat_q; } else if (MATCH("gpu_control", "tdp_ac_b")) { - pconfig->gpu_tdp_ac_b = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_ac_b; } else if (MATCH("gpu_control", "tdp_bat_b")) { - pconfig->gpu_tdp_bat_b = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_bat_b; } else if (MATCH("gpu_control", "tdp_ac_bp")) { - pconfig->gpu_tdp_ac_bp = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_ac_bp; } else if (MATCH("gpu_control", "tdp_bat_bp")) { - pconfig->gpu_tdp_bat_bp = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_bat_bp; } else if (MATCH("gpu_control", "tdp_ac_p")) { - pconfig->gpu_tdp_ac_p = strdup(value); + ptr_cmd = &pconfig->gpu_tdp_ac_p; } else if (MATCH("cpu_control", "bat_q")) { - pconfig->cpu_bat_q = strdup(value); + ptr_cmd = &pconfig->cpu_bat_q; } else if (MATCH("cpu_control", "ac_q")) { - pconfig->cpu_ac_q = strdup(value); + ptr_cmd = &pconfig->cpu_ac_q; } else if (MATCH("cpu_control", "bat_b")) { - pconfig->cpu_bat_b = strdup(value); + ptr_cmd = &pconfig->cpu_bat_b; } else if (MATCH("cpu_control", "ac_b")) { - pconfig->cpu_ac_b = strdup(value); + ptr_cmd = &pconfig->cpu_ac_b; } else if (MATCH("cpu_control", "bat_bp")) { - pconfig->cpu_bat_bp = strdup(value); + ptr_cmd = &pconfig->cpu_bat_bp; } else if (MATCH("cpu_control", "ac_bp")) { - pconfig->cpu_ac_bp = strdup(value); + ptr_cmd = &pconfig->cpu_ac_bp; } else if (MATCH("cpu_control", "ac_p")) { - pconfig->cpu_ac_p = strdup(value); + ptr_cmd = &pconfig->cpu_ac_p; } else { // unknown section return 0; } - return 1; -} -static void reset(const char *p) -{ - if (p && reload) { - free((char *)p); + if (ptr_cmd) { + strcpy((char *)ptr_cmd, value); } - p = NULL; + return 1; } static void init_config(LEGIOND_CONFIG *config) { + memset((void *)config, 0, sizeof(LEGIOND_CONFIG)); + config->fan_control = false; config->cpu_control = false; - reset(config->gpu_control); - reset(config->cpu_ac_q); - reset(config->cpu_bat_q); - reset(config->cpu_ac_b); - reset(config->cpu_bat_b); - reset(config->cpu_ac_bp); - reset(config->cpu_bat_bp); - reset(config->cpu_ac_p); - reset(config->gpu_tdp_ac_q); - reset(config->gpu_tdp_bat_q); - reset(config->gpu_tdp_ac_b); - reset(config->gpu_tdp_bat_b); - reset(config->gpu_tdp_ac_bp); - reset(config->gpu_tdp_bat_bp); - reset(config->gpu_tdp_ac_p); - - if (!reload) - reload = true; } int parseconf(LEGIOND_CONFIG *config) diff --git a/extra/service/legiond/modules/parseconf.h b/extra/service/legiond/modules/parseconf.h index c556151..b437208 100644 --- a/extra/service/legiond/modules/parseconf.h +++ b/extra/service/legiond/modules/parseconf.h @@ -4,25 +4,26 @@ #include #define config_path "/etc/legion_linux/legiond.ini" +typedef char command[100]; typedef struct _LEGIOND_CONFIG { bool fan_control; bool cpu_control; - const char *gpu_control; - const char *cpu_ac_q; - const char *cpu_bat_q; - const char *cpu_ac_b; - const char *cpu_bat_b; - const char *cpu_ac_bp; - const char *cpu_bat_bp; - const char *cpu_ac_p; - const char *gpu_tdp_ac_q; - const char *gpu_tdp_bat_q; - const char *gpu_tdp_ac_b; - const char *gpu_tdp_bat_b; - const char *gpu_tdp_ac_bp; - const char *gpu_tdp_bat_bp; - const char *gpu_tdp_ac_p; + command gpu_control; + command cpu_ac_q; + command cpu_bat_q; + command cpu_ac_b; + command cpu_bat_b; + command cpu_ac_bp; + command cpu_bat_bp; + command cpu_ac_p; + command gpu_tdp_ac_q; + command gpu_tdp_bat_q; + command gpu_tdp_ac_b; + command gpu_tdp_bat_b; + command gpu_tdp_ac_bp; + command gpu_tdp_bat_bp; + command gpu_tdp_ac_p; } LEGIOND_CONFIG; int parseconf(LEGIOND_CONFIG *config);