mirror of
https://gitcode.com/JianFeeeee/homeagent-sdk.git
synced 2026-09-20 08:58:03 +00:00
- 目录 tools/plugindev → tools/hmapdev,可执行文件名/平台产物名同步
(hmapdev_linux_amd64 等;包格式仍叫 .hmap)
- module path github.com/JianFeeeee/homeagent-sdk/tools/... → gitcode.com/...
(与仓库实际托管一致;核心仓不依赖该 path,改动无外部影响)
- SDK 存储目录 ~/.homeagent/plugindev/sdk → ~/.homeagent/hmapdev/sdk
新目录不存在而旧目录存在时沿用旧目录 → 已装 SDK 版本不会丢失
- 命令表/usage/--help/生成项目 README/示例 README/NSIS 安装器/
package/build.sh/build-examples.sh 全部同步;PLUGINDEV 环境变量保留兼容
- sdk/ 目录零改动(公开接口不变)
验证:
- go build ./... ok;go test ./tools/hmapdev/ ok(含模板接线守卫 TestProcTemplate_CoversAllCoreMethods)
- bash -n package/{build,build-examples}.sh ok
- 端到端:hmapdev init demo && hmapdev build → dist/demo_bundle.hmap(linux+darwin)
- 本机安装 /usr/local/bin/hmapdev,旧名以软链保留;sdk list/current 正常
55 lines
1.6 KiB
Cheetah
55 lines
1.6 KiB
Cheetah
//go:build linux || darwin || freebsd
|
||
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"syscall"
|
||
)
|
||
|
||
// Unix 侧共享段挂载:内核经 ExtraFiles 传入继承的 fd。
|
||
//
|
||
// 统一共享内存区域布局(§13.1):
|
||
//
|
||
// fd 3 = 统一区域(SuperBlock + StageContext + EvtRing)
|
||
// fd 4 = 事件通知(Linux eventfd / macOS pipe 读端)
|
||
//
|
||
// 继承的 fd 无需文件名,也不残留——这是选 memfd 而非 /dev/shm 的原因。
|
||
const (
|
||
fdUnifiedShm = 3
|
||
fdEvtNotifier = 4
|
||
)
|
||
|
||
// attachUnifiedShm 挂载统一共享内存区域。
|
||
//
|
||
// 各进程 mmap 到不同虚拟地址,段内一律用相对偏移而非指针,故仍能正确解引用
|
||
// (实验 2 已验证父子 mmap 基址不同时偏移解引用正确)。
|
||
func attachUnifiedShm(size int) ([]byte, error) {
|
||
return syscall.Mmap(fdUnifiedShm, 0, size,
|
||
syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
|
||
}
|
||
|
||
// openEvtNotifier 打开事件通知读端。
|
||
func openEvtNotifier() (evtWaiter, error) {
|
||
f := os.NewFile(fdEvtNotifier, "evtnotify")
|
||
if f == nil {
|
||
return nil, fmt.Errorf("fd %d 不是有效的通知句柄", fdEvtNotifier)
|
||
}
|
||
return &unixEvtWaiter{f: f}, nil
|
||
}
|
||
|
||
// unixEvtWaiter 用 eventfd/pipe 的阻塞 Read 等待通知。
|
||
//
|
||
// os.NewFile 把 fd 注册进 runtime netpoller,Read 阻塞时只 park goroutine,
|
||
// 不占 OS 线程(实验 1:200 个等待者仅增 1 个 OS 线程)。
|
||
// 反面对照是经 cgo 调 sem_wait——那会阻塞整个 M。
|
||
type unixEvtWaiter struct {
|
||
f *os.File
|
||
}
|
||
|
||
func (w *unixEvtWaiter) Wait(buf []byte) error {
|
||
_, err := w.f.Read(buf)
|
||
return err
|
||
}
|