feat(launcher): 通知查询/清除 IPC + App崩溃直报crash (agent-199) — MSG_NOTIFY_QUERY(0x25)/QUERY_RESULT(0x27)/DISMISS_ALL(0x26,保留媒体/进度/常驻红线), DISMISS(0x22)复用既有; 序列化在主循环单写者做; launch_app waitpid 回收处 notify_app_crash(信号杀/非0退出上报 /tmp/meow_crash.sock best-effort, 干净exit不报)
launcher 61f6b0db→3c7c2ec7; qemu IPC 往返+宿主存储单测+mock crash socket 全过; 顺带清理既有告警(util.c/app_launcher.c/meow_ipc.c)
This commit is contained in:
1 parent
29e1b35da8
commit
2d93298f8a
7 files changed
+272
-8
No files matched your search
@@ -459,8 +459,9 @@ int ui_width(const char *s, int size)
|
||||
}
|
||||
|
||||
|
||||
/* 文本高度(字库行高 or 回退 7×scale 估算),用于垂直居中 / 行高预算。 */
|
||||
static int ui_text_height(int size)
|
||||
/* 文本高度(字库行高 or 回退 7×scale 估算),用于垂直居中 / 行高预算。
|
||||
* (拆分后无调用点,保留接口;unused 满足 -Wall 0 warning) */
|
||||
static int __attribute__((unused)) ui_text_height(int size)
|
||||
{
|
||||
if (mfont_ready) return meow_font_line_height(size);
|
||||
return 7 * ((size >= 16) ? 2 : 1);
|
||||
@@ -480,8 +481,9 @@ static int ui_text_height(int size)
|
||||
void meow_dirty_full(void) { meow_gfx_mark_full(); }
|
||||
|
||||
|
||||
/* 清空脏集:SDK present 上屏后自清;launcher 侧无需再清(保留接口兼容)。 */
|
||||
static void meow_dirty_reset(void) { }
|
||||
/* 清空脏集:SDK present 上屏后自清;launcher 侧无需再清(保留接口兼容)。
|
||||
* (拆分后无调用点,保留钩子;unused 满足 -Wall 0 warning) */
|
||||
static void __attribute__((unused)) meow_dirty_reset(void) { }
|
||||
|
||||
|
||||
/* 标记一个矩形脏:桥进 SDK 脏追踪(相交合并/超限转全屏由 SDK dirty_add 处理)。 */
|
||||
@@ -891,12 +893,12 @@ static void ipc_enqueue_frame(struct meow_ipc_conn *c)
|
||||
static int ipc_conn_read(struct meow_ipc_conn *c)
|
||||
{
|
||||
for (;;) {
|
||||
if (c->hdr_n < MEOW_IPC_HDR_LEN) {
|
||||
if ((unsigned)c->hdr_n < MEOW_IPC_HDR_LEN) {
|
||||
ssize_t r = read(c->fd, c->hdr + c->hdr_n, MEOW_IPC_HDR_LEN - c->hdr_n);
|
||||
if (r < 0) { if (errno == EAGAIN) return 0; return -1; }
|
||||
if (r == 0) return -1;
|
||||
c->hdr_n += (int)r;
|
||||
if (c->hdr_n < MEOW_IPC_HDR_LEN) return 0;
|
||||
if ((unsigned)c->hdr_n < MEOW_IPC_HDR_LEN) return 0;
|
||||
uint32_t magic, len;
|
||||
uint16_t ver;
|
||||
memcpy(&magic, c->hdr, 4);
|
||||
@@ -1191,6 +1193,33 @@ static void ipc_dispatch(struct meow_ipc_msg *m)
|
||||
logmsg("ipc: NOTIFY_PROGRESS nid=%u p=%d rc=%d -> ACK", p.nid, p.progress, rc);
|
||||
break;
|
||||
}
|
||||
/* 查询当前内存活跃通知集(MeowPanel 实时化前置)。序列化在主循环出队后做(单写者),
|
||||
* 绝不把通知存储/ring 读到 IPC 线程;应答经 MSG_NOTIFY_QUERY_RESULT 回 JSON 数组文本。 */
|
||||
case MSG_NOTIFY_QUERY: {
|
||||
char filter[MEOW_APP_ID_MAX] = "";
|
||||
if (m->plen > 0) {
|
||||
uint32_t cp = m->plen < MEOW_APP_ID_MAX - 1 ? m->plen : MEOW_APP_ID_MAX - 1;
|
||||
memcpy(filter, m->payload, cp);
|
||||
filter[MEOW_APP_ID_MAX - 1] = 0;
|
||||
}
|
||||
m_notify_query_result_t r;
|
||||
memset(&r, 0, sizeof r);
|
||||
int n = meow_notif_serialize_json(filter[0] ? filter : NULL, r.text, sizeof r.text);
|
||||
r.code = (n >= 0) ? MEOW_OK : MEOW_ERR_INTERNAL;
|
||||
r.text_len = (n >= 0) ? (uint16_t)n : 0;
|
||||
ipc_send(m->fd, MSG_NOTIFY_QUERY_RESULT, m->req_id, &r, sizeof r);
|
||||
logmsg("ipc: NOTIFY_QUERY app=%s -> %dB", filter[0] ? filter : "*", n);
|
||||
break;
|
||||
}
|
||||
case MSG_NOTIFY_DISMISS_ALL: {
|
||||
int rc = meow_notif_clear_active();
|
||||
m_ack_t a;
|
||||
a.code = (rc >= 0) ? MEOW_OK : (uint32_t)rc;
|
||||
a.status = (uint32_t)(rc > 0 ? rc : 0); /* 清除条数 */
|
||||
ipc_send(m->fd, MSG_ACK, m->req_id, &a, sizeof a);
|
||||
logmsg("ipc: NOTIFY_DISMISS_ALL -> %d cleared", rc);
|
||||
break;
|
||||
}
|
||||
case MSG_NOTIFY_LIST:
|
||||
/* ↓ 守护→App 下发通知清单(重同步)。本帧不来自客户端(无请求类型),故不在此应答;
|
||||
* 需用时由守护主动经 meow_notif_serialize_list() + ipc_send 下发(M5 通知中心接入)。 */
|
||||
|
||||
Reference in new issue
Block a user