Skip to content

runtime-c: 删除 kvlangStrbuf,改一次性有界格式化 - #393

Merged
miaobyte merged 1 commit into
masterfrom
refactor/drop-strbuf
Oct 19, 2026
Merged

miaobyte merged 1 commit into
masterfrom
refactor/drop-strbuf

Conversation

@miaobyte

Copy link
Copy Markdown
Contributor

Strbuf 可增长、可清空、可复用——它把「字符串怎么拼」变成了一个带生命周期和容量策略的对象。但 runtime 里每一处用法都是「拼一次 → 用 → 扔」,没有任何调用点需要复用;这个缓冲只是在每个调用处引入三字段状态和一条 malloc 失败路径。

删掉它,换成三个一次性函数(新增 runtime/src/strutil.c):

  • kvlangKeyFmt(buf, cap, fmt, ...):有界写入调用方栈缓冲;超长或格式化错误直接 abort,绝不截断——截断会静默产出一个错的 key,比崩更糟
  • kvlangAstr(fmt, ...) / kvlangAstrN(s, n):一次性堆字符串,调用方 free;OOM abort
  • kvlangDie(fmt, ...):统一 panic 出口,noreturn

所有 keytree 函数的 out 参数从 kvlangStrbuf_t * 改成 (char *out, size_t cap)——签名直接表达「调用方给的缓冲有多大」,不再有隐藏扩容。

改动面

  • runtime/src/strbuf.c 删除;新增 strutil.c(CMake 走 src/*.c GLOB,构建文件无需改)
  • keytree.c / kvcpu.c / runtime.c / vthread.c / xvalue.c / rwir*.c / rwirext.c / myrwircaps.c / runtime_internal.h / const.h 全量改签名与调用点(-650/+479)
  • spec 05-runtime语义/09-cruntime与后端abi.kv:内部模块清单 strbuf.c → strutil.c
  • runtime/tests/test_crash_resume.c 跟改

验证

  • make runtime 构建通过
  • ctest:7/9 通过。param_address_{shm,fs} 失败,但用临时 clone 在**重构前的 HEAD(9dbe650)**上复跑同样失败——既有问题,非本次引入(CI 只 make runtime、不跑 ctest,所以一直没暴露)
  • tutorial fs 后端:PASS:222 FAIL:0 SKIP:1,无回归

🤖 Generated with Claude Code

@miaobyte

Copy link
Copy Markdown
Contributor Author

交接:与 #390 语义冲突,交由 coding 决定收口方式

本 PR 在 #390(feat/rwir-delegation-03)合入后变为 CONFLICTING。文本冲突只有
runtime_internal.h 一处(master 新增的一批 keytree 声明与 kvlangKeytreeVthread
签名改动撞在同一段),已手动 rebase 验证可解;真正的问题是语义冲突:

#390 新增代码里 kvlangStrbuf 的使用点
  runtime/src/dispatch.c   51 处
  runtime/src/keytree.c    34 处

本 PR 删除了 kvlangStrbuf_t,上述 85 处全部编译失败(unknown type name 'kvlangStrbuf_t')。且 dispatch.c 是增量拼 JSON(可变长 value、名字列表),
一次性 API(kvlangAstr / kvlangKeyFmt)从形状上无法替代。

rebase 后的临时分支未推送、未 force-push,远程分支仍停在原提交;本地已切回
master(干净、可编译)。三种收口方式:

  1. 保留本重构原则(调用方给缓冲 / 超长 abort / 不隐藏扩容),补一个有界不增长的
    append 族(无 malloc 增长、无 clear 复用),再移植 85 处;
  2. 放弃本次删除,保留 kvlangStrbuf(feat: rwir delegation on kvspace 0.3 #390 证明增量拼串是真需求);
  3. 由 coding 在解决 feat: rwir delegation on kvspace 0.3 #390 后续改动时一并决定。

(顺带:make runtime 下 ctest 的 param_address_{shm,fs} 是既有失败——在重构前
的 HEAD 9dbe650 上复跑同样失败;CI 不跑 ctest 所以一直没暴露。)

Strbuf 可增长、可清空、可复用——它把「字符串怎么拼」变成了一个带生命周期和容量策略
的对象。但 runtime 里每一处用法都是「拼一次 → 用 → 扔」,没有任何调用点需要复用;
这个缓冲只是在每个调用处引入三字段状态和一条 malloc 失败路径。

删掉它,换成三个一次性函数(新增 runtime/src/strutil.c):

- kvlangKeyFmt(buf, cap, fmt, ...):有界写入调用方栈缓冲;超长或格式化错误**直接
  abort,绝不截断**——截断会静默产出一个错的 key,比崩更糟
- kvlangAstr(fmt, ...) / kvlangAstrN(s, n):一次性堆字符串,调用方 free;OOM abort
- kvlangDie(fmt, ...):统一 panic 出口,noreturn

所有 keytree 函数的 out 参数从 `kvlangStrbuf_t *` 改成 `(char *out, size_t cap)`——
签名直接表达「调用方给的缓冲有多大」,不再有隐藏扩容。

- runtime/src/strbuf.c 删除;新增 strutil.c(CMake 走 `src/*.c` GLOB,构建文件无需改)
- keytree.c / kvcpu.c / runtime.c / vthread.c / xvalue.c / rwir*.c / rwirext.c /
  myrwircaps.c / runtime_internal.h / const.h 全量改签名与调用点(-650/+479)
- spec/05-runtime语义/09-cruntime与后端abi.kv:内部模块清单 strbuf.c → strutil.c
- runtime/tests/test_crash_resume.c 跟改

验证:
- `make runtime` 构建通过
- `ctest`:7/9 通过。param_address_{shm,fs} 失败,但用临时 clone 在**重构前的 HEAD
  (9dbe650)** 上复跑同样失败——既有问题,非本次引入(CI 只 `make runtime` 不跑
  ctest,所以一直没暴露)
- tutorial fs 后端:PASS:222 FAIL:0 SKIP:1,无回归

Co-Authored-By: Claude Code <noreply@anthropic.com>

rebase 到 #390 后:dispatch.c 的 JSON/错误拼接与 keytree 的 delegation 路径
同步改为 parts_t 精确拼接 + kvlangAstr,未保留任何 strbuf 调用。
@miaobyte
miaobyte force-pushed the refactor/drop-strbuf branch from 5b10c4f to 46441e2 Compare October 19, 2026 08:15
@miaobyte
miaobyte merged commit 5f49f93 into master Oct 19, 2026
6 checks passed
@miaobyte
miaobyte deleted the refactor/drop-strbuf branch October 19, 2026 08:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant