Skip to content

Commit

Permalink
legiond: refactor config reload
Browse files Browse the repository at this point in the history
  • Loading branch information
st0nie committed Dec 29, 2024
1 parent 56ffee2 commit 95895f6
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 64 deletions.
15 changes: 8 additions & 7 deletions extra/service/legiond/legiond.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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");
Expand Down
64 changes: 22 additions & 42 deletions extra/service/legiond/modules/parseconf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
31 changes: 16 additions & 15 deletions extra/service/legiond/modules/parseconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,26 @@
#include <stdbool.h>

#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);
Expand Down

0 comments on commit 95895f6

Please sign in to comment.