70 lines
2.3 KiB
C
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;
|
|
}
|