Skip to content

Commit 78cdb23

Browse files
authored
Merge pull request #300 from array2d/cleanup-disconnect
cleanup(layout): 剥离写侧/vthread/帧路径与 Ptr 构造
2 parents ddfae5d + 8137053 commit 78cdb23

12 files changed

Lines changed: 39 additions & 212 deletions

File tree

‎layout/build.rs‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
// 链接 kvspace dispatch 前端(已安装 /usr/lib)。布局侧只通过 extern "C" ABI 调用,
1+
// 链接 kvspace dispatch 前端(与后端同装 /usr/lib/kvspace)。布局侧只通过 extern "C" ABI 调用,
22
// 运行期由前端按 DSN 选后端(shm://→kvspace-c,其余→kvspace-durable)。
33
fn main() {
4+
println!("cargo:rustc-link-search=native=/usr/lib/kvspace");
45
println!("cargo:rustc-link-lib=dylib=kvspace");
6+
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags"); // rpath 转 DT_RPATH,传递解析子依赖
7+
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/kvspace");
58
}

‎layout/src/ast.rs‎

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -316,26 +316,6 @@ pub fn float_lit(v: &str) -> Expr {
316316
}
317317
}
318318

319-
pub fn bool_lit(v: &str) -> Expr {
320-
Expr {
321-
op: String::new(),
322-
args: Vec::new(),
323-
val: v.to_string(),
324-
quote: 0,
325-
lit: LitKind::LitBool,
326-
}
327-
}
328-
329-
pub fn none_lit() -> Expr {
330-
Expr {
331-
op: String::new(),
332-
args: Vec::new(),
333-
val: "None".to_string(),
334-
quote: 0,
335-
lit: LitKind::LitNil,
336-
}
337-
}
338-
339319
pub fn call(op: &str, args: Vec<Expr>) -> Expr {
340320
Expr {
341321
op: op.to_string(),

‎layout/src/code.rs‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,11 +630,19 @@ pub fn write_func(kv: &mut Kv, pkg: &str, fn_: &mut Func) {
630630
// 不带 `*` 的按**值传递**(槽存值本体,体内裸坐标 `[0,-k]` 直读)。见 spec [[函数]]。
631631
let mut param_coord: HashMap<String, String> = HashMap::new();
632632
for (i, p) in fn_.sig.params.iter().enumerate() {
633-
let d = if langtype::is_addr_param(&p.ty) { "*" } else { "" };
633+
let d = if langtype::is_addr_param(&p.ty) {
634+
"*"
635+
} else {
636+
""
637+
};
634638
param_coord.insert(p.name.clone(), format!("{d}[0,-{}]", i + 1));
635639
}
636640
for (i, r) in fn_.sig.returns.iter().enumerate() {
637-
let d = if langtype::is_addr_param(&r.ty) { "*" } else { "" };
641+
let d = if langtype::is_addr_param(&r.ty) {
642+
"*"
643+
} else {
644+
""
645+
};
638646
param_coord.insert(r.name.clone(), format!("{d}[0,{}]", i + 1));
639647
}
640648

‎layout/src/ffi.rs‎

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ pub type Handle = *mut c_void;
1313

1414
// ── extern "C" 声明 ─────────────────────────────────────────────────────
1515

16-
#[allow(dead_code)]
1716
extern "C" {
1817
fn kvspaceConnect(dsn: *const c_char) -> Handle;
1918
fn kvspaceClose(h: Handle);
@@ -28,16 +27,6 @@ extern "C" {
2827
out: *mut *mut u8,
2928
out_len: *mut u32,
3029
) -> c_int;
31-
/// 就地写:key 已存在、body_len==原 body_len → 返回原 box body 偏移指针;否则非 0。
32-
fn kvspaceWriteInPlace(
33-
h: Handle,
34-
key: *const c_char,
35-
resolve: c_int,
36-
body_len: u32,
37-
body: *mut *mut u8,
38-
err: *mut c_char,
39-
err_cap: u32,
40-
) -> c_int;
4130
/// 新位置写:按 (ref, storetype, ro, vid, langtype, body_len) 分配新 box、写 head,返回 body 偏移指针。
4231
fn kvspaceWriteNewPlace(
4332
h: Handle,
@@ -70,13 +59,6 @@ extern "C" {
7059
buf_cap: u32,
7160
out_len: *mut u32,
7261
) -> c_int;
73-
fn kvspaceDel(
74-
h: Handle,
75-
keys: *const *const c_char,
76-
nkeys: u32,
77-
err: *mut c_char,
78-
err_cap: u32,
79-
) -> c_int;
8062
fn kvspaceDelTree(h: Handle, prefix: *const c_char, err: *mut c_char, err_cap: u32) -> c_int;
8163
fn kvspaceMkindex(
8264
h: Handle,
@@ -85,17 +67,6 @@ extern "C" {
8567
err: *mut c_char,
8668
err_cap: u32,
8769
) -> c_int;
88-
fn kvspaceMkindexExt(
89-
h: Handle,
90-
path: *const c_char,
91-
ext_path: *const c_char,
92-
err: *mut c_char,
93-
err_cap: u32,
94-
) -> c_int;
95-
fn kvspaceRmindexExt(h: Handle, path: *const c_char, err: *mut c_char, err_cap: u32) -> c_int;
96-
fn kvspaceClear(h: Handle, err: *mut c_char, err_cap: u32) -> c_int;
97-
fn kvspaceDisconnect(h: Handle, err: *mut c_char, err_cap: u32) -> c_int;
98-
9970
fn kvspaceTlvEncode(
10071
kind: *const c_char,
10172
raw: *const u8,
@@ -107,12 +78,6 @@ extern "C" {
10778
) -> c_int;
10879
fn kvspaceDecodeHead(data: *const u8, data_len: u32, out: *mut kvspaceHead_t) -> c_int;
10980

110-
fn kvspaceNewPtr(
111-
target_langtype: *const c_char,
112-
target: *const c_char,
113-
out: *mut *mut u8,
114-
out_len: *mut u32,
115-
) -> c_int;
11681
fn kvspaceNewChar(bytes: *const u8, len: u32, out: *mut *mut u8, out_len: *mut u32) -> c_int;
11782
fn kvspaceNewBool(v: u8, out: *mut *mut u8, out_len: *mut u32) -> c_int;
11883
fn kvspaceNewInt64(v: i64, out: *mut *mut u8, out_len: *mut u32) -> c_int;
@@ -294,30 +259,6 @@ impl Kv {
294259
unsafe { kvspaceMkindex(self.h, c.as_ptr(), 0, err.as_mut_ptr(), err.len() as u32) };
295260
err_ret(&mut err, ret)
296261
}
297-
298-
pub fn ext_index(&mut self, path: &str, ext_path: &str) -> Result<(), String> {
299-
let cp = CString::new(path).expect("no NUL");
300-
let ce = CString::new(ext_path).expect("no NUL");
301-
let mut err: [c_char; 256] = [0; 256];
302-
let ret = unsafe {
303-
kvspaceMkindexExt(
304-
self.h,
305-
cp.as_ptr(),
306-
ce.as_ptr(),
307-
err.as_mut_ptr(),
308-
err.len() as u32,
309-
)
310-
};
311-
err_ret(&mut err, ret)
312-
}
313-
314-
pub fn del_ext_index(&mut self, path: &str) -> Result<(), String> {
315-
let c = CString::new(path).expect("no NUL");
316-
let mut err: [c_char; 256] = [0; 256];
317-
let ret =
318-
unsafe { kvspaceRmindexExt(self.h, c.as_ptr(), err.as_mut_ptr(), err.len() as u32) };
319-
err_ret(&mut err, ret)
320-
}
321262
}
322263

323264
impl Drop for Kv {
@@ -379,12 +320,6 @@ pub fn decode_head(data: &[u8]) -> kvspaceHead_t {
379320

380321
// ── 标准标量构造器 ───────────────────────────────────────────────────
381322

382-
pub fn new_ptr(target_langtype: &str, target: &str) -> Vec<u8> {
383-
let ck = CString::new(target_langtype).expect("no NUL");
384-
let ct = CString::new(target).expect("no NUL");
385-
call_codec(|out, out_len| unsafe { kvspaceNewPtr(ck.as_ptr(), ct.as_ptr(), out, out_len) })
386-
}
387-
388323
pub fn new_char(kind: &str, s: &str) -> Vec<u8> {
389324
let bytes = s.as_bytes();
390325
if kind == "char/utf8" {

‎layout/src/keytree.rs‎

Lines changed: 1 addition & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,14 @@
1-
//! KV 路径与成员分隔符统一管理(对齐 keytree/const.go、entry.go、frame.go、
2-
//! member.go、vthread.go、sys.go)。所有构造 KV 路径的地方均须使用本模块常量。
1+
//! KV 路径与成员分隔符统一管理。所有构造 KV 路径的地方均须使用本模块常量。
32
43
// ── 常量 ─────────────────────────────────────────────────────────────
54

65
pub const MEMBER_SEP: &str = "·"; // 成员访问分隔符(U+00B7 中点号):释放 '.' 供小数 key 使用
76
pub const RUNTIME_MEMBER_SEP: &str = "\u{2025}"; // U+2025,运行时保留字段前缀
8-
pub const PATH_SEG_SEP: &str = "/"; // 路径分隔符
9-
pub const PATH_SEG_LIB: &str = "lib"; // /lib
10-
pub const PATH_SEG_VTHREAD: &str = "vthread"; // /vthread
11-
12-
pub const SEG_RO: &str = "ro";
13-
pub const SEG_RPARAM: &str = "rparam";
14-
pub const SEG_WPARAM: &str = "wparam";
15-
pub const SEG_PC: &str = "pc";
16-
pub const SEG_CALLPC: &str = "callpc";
17-
pub const SEG_RETURNPC: &str = "returnpc";
18-
pub const SEG_STATUS: &str = "status";
19-
pub const SEG_CTIME: &str = "ctime";
20-
pub const SEG_DEBUGGER: &str = "debugger";
21-
22-
pub const SEG_LIB: &str = "\u{2025}lib"; // 帧 extindex 标记
237
pub const SEG_LABELS: &str = "labels"; // /lib/<func>/‥labels/<name> → irseq
248
pub const SRC_EXT: &str = ".src"; // 函数源码文件后缀
259

2610
pub const LIB_ROOT: &str = "/lib";
2711
pub const RWIR_ROOT: &str = "/lib";
28-
pub const VTHREAD_ROOT: &str = "/vthread";
2912

3013
// ── /lib ─────────────────────────────────────────────────────────────
3114

@@ -59,90 +42,8 @@ pub fn rwir(opcode: &str) -> String {
5942
format!("{RWIR_ROOT}/{opcode}")
6043
}
6144

62-
// ── 帧路径 ───────────────────────────────────────────────────────────
63-
64-
fn frame_member(root: &str, seg: &str) -> String {
65-
format!("{}{}{}", stack(root), RUNTIME_MEMBER_SEP, seg)
66-
}
67-
68-
pub fn stack(root: &str) -> String {
69-
format!("{}/", root.trim_end_matches(PATH_SEG_SEP))
70-
}
71-
72-
pub fn frame_ro(root: &str) -> String {
73-
frame_member(root, SEG_RO)
74-
}
75-
76-
pub fn call_pc(root: &str) -> String {
77-
frame_member(root, SEG_CALLPC)
78-
}
79-
80-
pub fn return_pc(root: &str) -> String {
81-
frame_member(root, SEG_RETURNPC)
82-
}
83-
84-
/// Frame root of a PC (`/vthread/42/[3]/[5,0]` → `/vthread/42/[3]`).
85-
pub fn frame_root(pc: &str) -> &str {
86-
if let Some(idx) = pc.rfind("/[") {
87-
&pc[..idx]
88-
} else {
89-
panic!("frame_root: pc has no /[coord] segment: {pc:?}")
90-
}
91-
}
92-
93-
pub fn entry_pc(root: &str) -> String {
94-
format!("{}/[1,0]", root.trim_end_matches(PATH_SEG_SEP))
95-
}
96-
97-
pub fn is_entry_pc(pc: &str) -> bool {
98-
pc.ends_with("/[1,0]")
99-
}
100-
10145
// ── 成员 ─────────────────────────────────────────────────────────────
10246

10347
pub fn member(base: &str, name: &str) -> String {
10448
format!("{base}{MEMBER_SEP}{name}")
10549
}
106-
107-
// ── /vthread ─────────────────────────────────────────────────────────
108-
109-
pub fn v_thread(vtid: &str) -> String {
110-
format!("{VTHREAD_ROOT}/{vtid}")
111-
}
112-
113-
fn vt_member(vtid: &str, seg: &str) -> String {
114-
format!("{}/{}{}", v_thread(vtid), RUNTIME_MEMBER_SEP, seg)
115-
}
116-
117-
pub fn v_thread_pc(vtid: &str) -> String {
118-
vt_member(vtid, SEG_PC)
119-
}
120-
121-
pub fn v_thread_status(vtid: &str) -> String {
122-
vt_member(vtid, SEG_STATUS)
123-
}
124-
125-
pub fn v_thread_ctime(vtid: &str) -> String {
126-
vt_member(vtid, SEG_CTIME)
127-
}
128-
129-
pub fn v_thread_debugger(vtid: &str) -> String {
130-
vt_member(vtid, SEG_DEBUGGER)
131-
}
132-
133-
pub fn v_thread_at(vtid: &str, key: &str) -> String {
134-
format!("{}/{key}", v_thread(vtid))
135-
}
136-
137-
/// 从 pc(/vthread/<vtid>/...)提取 vtid。
138-
pub fn vtid_from_pc(pc: &str) -> String {
139-
let prefix = format!("{VTHREAD_ROOT}/");
140-
if !pc.starts_with(&prefix) {
141-
return String::new();
142-
}
143-
let rest = &pc[prefix.len()..];
144-
match rest.find(PATH_SEG_SEP) {
145-
Some(i) => rest[..i].to_string(),
146-
None => rest.to_string(),
147-
}
148-
}

‎layout/src/kvkind.rs‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@ use super::ffi;
99
// ── kind 常量 ─────────────────────────────────────────────────────────
1010

1111
pub const KIND_CHAR: &str = "char/utf32";
12-
pub const KIND_CHAR_UTF8: &str = "char/utf8";
13-
pub const KIND_CHAR_ASCII: &str = "char/ascii";
14-
pub const KIND_BOOL: &str = "bool";
15-
pub const KIND_INT64: &str = "int64";
16-
pub const KIND_FLOAT64: &str = "float64";
17-
pub const KIND_MAP: &str = "stringkeymap";
1812
pub const KIND_INDEX: &str = "index";
19-
pub const KIND_EXT_INDEX: &str = "extindex";
2013
pub const KIND_STRUCT: &str = "struct";
2114

2215
// kvlang 自有 kind
@@ -25,7 +18,6 @@ pub const KIND_RWFUNC: &str = "rwfunc";
2518
pub const KIND_DEF_RWIR: &str = "def rwir";
2619
pub const KIND_DEF_LANGTYPE: &str = "def langtype";
2720
pub const KIND_RWIR_OR_RWFUNC: &str = "rwir|rwfunc";
28-
pub const KIND_SCOPE: &str = "scope";
2921

3022
// ── 通用 XValue 字节访问器 ───────────────────────────────────────────
3123

‎layout/src/parser.rs‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -567,10 +567,12 @@ impl Parser {
567567
ret.name,
568568
ret.ty
569569
.split('|')
570-
.map(|a| if !a.starts_with('*') && (a.starts_with('/') || a.contains('·')) {
571-
format!("*{a}")
572-
} else {
573-
a.to_string()
570+
.map(|a| {
571+
if !a.starts_with('*') && (a.starts_with('/') || a.contains('·')) {
572+
format!("*{a}")
573+
} else {
574+
a.to_string()
575+
}
574576
})
575577
.collect::<Vec<_>>()
576578
.join("|")
@@ -737,7 +739,8 @@ impl Parser {
737739
// 于是经 q 写成员就是在写读参的对象。只读性沿别名传播,否则 `q = p; q·x = v`
738740
// 一句话就把「签名诚实原则」洗白了。
739741
// 别名 → 源头读参(`q = p` 记 q→p;再 `r = q` 追到 p),供诊断点名真凶。
740-
let mut tainted: std::collections::HashMap<String, String> = std::collections::HashMap::new();
742+
let mut tainted: std::collections::HashMap<String, String> =
743+
std::collections::HashMap::new();
741744
let mut all: Vec<&Instruction> = Vec::new();
742745
collect_body_insts(&func.body, &mut all);
743746
loop {

‎layout/tests/pipeline_test.rs‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@ fn compile_simple_func() {
3030
let b = body(&sig_val);
3131
assert_eq!(kvkind::rwfunc_num_reads(b), 2);
3232
assert_eq!(kvkind::rwfunc_num_writes(b), 1);
33-
// langtype 列表:读参在前(nr=2)、写参在后(nw=1)
34-
assert_eq!(
35-
kvkind::rwfunc_param_types(b),
36-
vec!["int64", "int64", "int64"]
37-
);
33+
// langtype 列表:读参在前(nr=2)、写参在后(nw=1),落参数定义键 .[0,±k]
34+
let types: Vec<String> = ["[0,-1]", "[0,-2]", "[0,1]"]
35+
.iter()
36+
.map(|k| {
37+
kvkind::def_param_parts(&kv.get_one(&format!("/lib/sum.{k}")))
38+
.unwrap()
39+
.1
40+
})
41+
.collect();
42+
assert_eq!(types, vec!["int64", "int64", "int64"]);
3843

3944
// 参数 Ptr
4045
let a = kv.get_one("/lib/sum/A");

‎runtime-rs/build.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ fn main() {
2424
let bin = format!("{manifest}/../bin"); // kvlang/bin(新构建的 libkvlang_runtime.so)
2525

2626
println!("cargo:rustc-link-search=native={bin}");
27+
println!("cargo:rustc-link-search=native=/usr/lib/kvspace");
2728
println!("cargo:rustc-link-search=native=/usr/lib");
2829
println!("cargo:rustc-link-lib=dylib=kvlang_runtime");
2930
println!("cargo:rustc-link-lib=dylib=kvspace");
@@ -32,6 +33,7 @@ fn main() {
3233
println!("cargo:rustc-link-arg=-Wl,--disable-new-dtags"); // rpath 转 DT_RPATH,传递解析子依赖
3334
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN");
3435
println!("cargo:rustc-link-arg=-Wl,-rpath,$ORIGIN/../lib");
36+
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib/kvspace");
3537
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib");
3638

3739
// 内嵌顶层 stdlib/**/*.kv → EMBEDDED_KV。

0 commit comments

Comments
 (0)