Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/meow_bgmgr.c
T

70 lines
2.3 KiB
C

/* meow_bgmgr.c — 批③ 后台管理页 逻辑层(数据汇聚 + kill 门控)。实现见 meow_bgmgr.h。
* 纯 C(无 launcher static/SDK 依赖),宿主 gcc 直编:gcc -Wall -Wextra -std=gnu99 \
* test_bgmgr.c meow_bgmgr.c -o test_bgmgr。 */
#include "meow_bgmgr.h"
#include <stdio.h>
#include <string.h>
int bgmgr_collect(const bgmgr_ops_t *ops, bgmgr_row_t *rows, int max)
{
if (!ops || !ops->enumerate || !ops->app_meta || !rows || max <= 0) return 0;
int n = ops->enumerate(ops->ctx, rows, max);
if (n < 0) n = 0;
if (n > max) n = max;
for (int i = 0; i < n; i++) {
bgmgr_row_t *r = &rows[i];
r->framework = 0;
r->is_fg = 0;
r->name[0] = 0;
r->icon[0] = 0;
r->pcpu = 0.0;
r->rss_kb = 0;
ops->app_meta(ops->ctx, r->app_id, r->pid,
r->name, (int)sizeof r->name, r->icon, (int)sizeof r->icon,
&r->framework, &r->is_fg);
if (!r->name[0]) snprintf(r->name, sizeof r->name, "%s", r->app_id);
if (ops->proc_sample && ops->proc_sample(ops->ctx, r->pid, &r->pcpu, &r->rss_kb) < 0) {
r->pcpu = 0.0; r->rss_kb = 0;
}
r->killable = bgmgr_can_kill(r);
}
return n;
}
int bgmgr_can_kill(const bgmgr_row_t *r)
{
if (!r) return 0;
if (r->framework) return 0; /* 框架/系统 App 不 kill(铁律) */
if (r->is_fg) return 0; /* 当前前台 App 不 kill */
if (r->pid <= 0) return 0; /* 非后台/无进程 */
return 1;
}
int bgmgr_kill_all(const bgmgr_ops_t *ops, bgmgr_row_t *rows, int n,
void (*kill_fn)(const char *app_id))
{
(void)ops;
if (!kill_fn) return 0;
int k = 0;
for (int i = 0; i < n; i++) {
if (bgmgr_can_kill(&rows[i])) { kill_fn(rows[i].app_id); k++; }
}
return k;
}
const char *bgmgr_status_str(const bgmgr_row_t *r)
{
if (!r) return "";
if (r->is_fg) return "前台";
if (r->keepalive) return "常驻";
return "后台";
}
const char *bgmgr_mem_str(long rss_kb)
{
static char buf[24];
if (rss_kb >= 1024) snprintf(buf, sizeof buf, "%.1fMB", (double)rss_kb / 1024.0);
else snprintf(buf, sizeof buf, "%ldKB", rss_kb);
return buf;
}