@@ -44,6 +44,111 @@ func semroot(addr *uint32) *semaRoot {
4444}
4545```
4646
47+ ```
48+ ┌─────┬─────┬─────┬─────┬─────┬────────────────────────┬─────┐
49+ │ 0 │ 1 │ 2 │ 3 │ 4 │ ..... │ 250 │
50+ └─────┴─────┴─────┴─────┴─────┴────────────────────────┴─────┘
51+ │ │
52+ │ │
53+ └──┐ └─┐
54+ │ │
55+ │ │
56+ ▼ ▼
57+ ┌─────────┐ ┌─────────┐
58+ │ struct │ │ struct │
59+ ├─────────┴─────────┐ ├─────────┴─────────┐
60+ │ root semaRoot │──┐ │ root semaRoot │──┐
61+ ├───────────────────┤ │ ├───────────────────┤ │
62+ │ pad │ │ │ pad │ │
63+ └───────────────────┘ │ └───────────────────┘ │
64+ │ │
65+ ┌────────────────┘ ┌────────────────┘
66+ │ │
67+ │ │
68+ ▼ ▼
69+ ┌──────────┐ ┌──────────┐
70+ │ semaRoot │ │ semaRoot │
71+ ├──────────┴────────┐ ├──────────┴────────┐
72+ │ lock mutex │ │ lock mutex │
73+ ├───────────────────┤ ├───────────────────┤
74+ │ treap *sudog │ │ treap *sudog │
75+ ├───────────────────┤ ├───────────────────┤
76+ │ nwait uint32 │ │ nwait uint32 │
77+ └───────────────────┘ └───────────────────┘
78+ ```
79+
80+ treap 结构:
81+
82+ ```
83+ ┌──────────┐
84+ ┌─┬─▶│ sudog │
85+ │ │ ├──────────┴────────────┐
86+ ┌─────────────────────┼─┼──│ prev *sudog │
87+ │ │ │ ├───────────────────────┤
88+ │ │ │ │ next *sudog │────┐
89+ │ │ │ ├───────────────────────┤ │
90+ │ │ │ │ parent *sudog │ │
91+ │ │ │ ├───────────────────────┤ │
92+ │ │ │ │ elem unsafe.Pointer │ │
93+ │ │ │ ├───────────────────────┤ │
94+ │ │ │ │ ticket uint32 │ │
95+ │ │ │ └───────────────────────┘ │
96+ │ │ │ │
97+ │ │ │ │
98+ │ │ │ │
99+ │ │ │ │
100+ │ │ │ │
101+ │ │ │ │
102+ ▼ │ │ ▼
103+ ┌──────────┐ │ │ ┌──────────┐
104+ │ sudog │ │ │ │ sudog │
105+ ├──────────┴────────────┐ │ │ ├──────────┴────────────┐
106+ │ prev *sudog │ │ │ │ prev *sudog │
107+ ├───────────────────────┤ │ │ ├───────────────────────┤
108+ │ next *sudog │ │ │ │ next *sudog │
109+ ├───────────────────────┤ │ │ ├───────────────────────┤
110+ │ parent *sudog │───┘ └─────────────────────────│ parent *sudog │
111+ ├───────────────────────┤ ├───────────────────────┤
112+ │ elem unsafe.Pointer │ │ elem unsafe.Pointer │
113+ ├───────────────────────┤ ├───────────────────────┤
114+ │ ticket uint32 │ │ ticket uint32 │
115+ └───────────────────────┘ └───────────────────────┘
116+ ```
117+
118+ ```
119+ ┌──────────┐ ┌──────────┐ ┌──────────┐
120+ │ sudog │ ┌─────▶│ sudog │ ┌─────▶│ sudog │
121+ ├──────────┴────────────┐ │ ├──────────┴────────────┐ │ ├──────────┴────────────┐
122+ │ waitlink *sudog │─────┘ │ waitlink *sudog │──────┘ │ waitlink *sudog │
123+ ├───────────────────────┤ ├───────────────────────┤ ├───────────────────────┤
124+ │ waittail *sudog │ │ waittail *sudog │ │ waittail *sudog │
125+ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘
126+ ```
127+
128+ ```
129+ ┌──────────┐
130+ │ sudog │
131+ ├──────────┴────────────┐
132+ │ waitlink *sudog │
133+ ├───────────────────────┤
134+ │ waittail *sudog │───────────────────────────────────────────────────────────┐
135+ └───────────────────────┘ │
136+ ┌──────────┐ │
137+ │ sudog │ │
138+ ├──────────┴────────────┐ │
139+ │ waitlink *sudog │ │
140+ ├───────────────────────┤ │
141+ │ waittail *sudog │─────────────────────────┤
142+ └───────────────────────┘ ▼
143+ ┌──────────┐
144+ │ sudog │
145+ ├──────────┴────────────┐
146+ │ waitlink *sudog │
147+ ├───────────────────────┤
148+ │ waittail *sudog │
149+ └───────────────────────┘
150+ ```
151+
47152## 对外封装
48153
49154在 sema.go 里实现的内容,用 ` go:linkname ` 导出给 sync、poll 库来使用,也是在链接期做了些手脚:
0 commit comments