mirror of
https://github.com/ii64/gouring.git
synced 2025-03-23 23:29:29 +01:00
Merge pull request #1 from ii64/for-next
API changes, optimizations, features
This commit is contained in:
commit
8e3380e47d
18 changed files with 1972 additions and 164 deletions
31
README.md
31
README.md
|
@ -1,8 +1,8 @@
|
|||
# gouring
|
||||
|
||||
|
||||
[](LICENSE)
|
||||
[](https://pkg.go.dev/github.com/ii64/gouring)
|
||||
[![License: MIT][1]](LICENSE)
|
||||
[![Go Reference][2]](https://pkg.go.dev/github.com/ii64/gouring)
|
||||
|
||||
Low-level io uring library
|
||||
|
||||
|
@ -75,5 +75,30 @@ if err != nil {
|
|||
}
|
||||
```
|
||||
|
||||
## Graph
|
||||
|
||||
> Check out test script [here][5]
|
||||
|
||||
<table><tr>
|
||||
<td>SQPOLL</td><td>non-SQPOLL</td>
|
||||
</tr><tr><td>
|
||||
|
||||
![graph sqpoll][3]
|
||||
|
||||
</td><td>
|
||||
|
||||
![graph non sqpoll][4]
|
||||
|
||||
</td></tr></table>
|
||||
|
||||
|
||||
|
||||
### Referece
|
||||
[github.com/iceber/iouring-go](https://github.com/iceber/iouring-go)
|
||||
[github.com/iceber/iouring-go](https://github.com/iceber/iouring-go)
|
||||
|
||||
|
||||
[1]: https://img.shields.io/badge/License-MIT-yellow.svg
|
||||
[2]: https://pkg.go.dev/badge/github.com/ii64/gouring.svg
|
||||
[3]: assets/sqpoll.svg
|
||||
[4]: assets/nosqpoll.svg
|
||||
[5]: https://gist.github.com/ii64/3a4e8f5c689bb65b2fb9c5f2b1a5904d
|
454
assets/nosqpoll.svg
Normal file
454
assets/nosqpoll.svg
Normal file
|
@ -0,0 +1,454 @@
|
|||
<svg width="771pt" height="1023pt" viewBox="5.42577 -3.63378 770.5 1023" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1019)">
|
||||
<title>prf</title>
|
||||
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1019 766.5,-1019 766.5,4 -4,4"></polygon>
|
||||
<!-- N1 -->
|
||||
<g id="node1" class="node">
|
||||
<title>N1</title>
|
||||
<g id="a_node1"><a xlink:title="main.main (34.23s)">
|
||||
<polygon fill="#edd5d5" stroke="#b20000" points="706.5,-928 576.5,-928 576.5,-868 706.5,-868 706.5,-928"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-914.4" font-family="Times,serif" font-size="12.00">main</text>
|
||||
<text text-anchor="middle" x="641.5" y="-901.4" font-family="Times,serif" font-size="12.00">main</text>
|
||||
<text text-anchor="middle" x="641.5" y="-888.4" font-family="Times,serif" font-size="12.00">1.29s (3.77%)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-875.4" font-family="Times,serif" font-size="12.00">of 34.23s (99.94%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N8 -->
|
||||
<g id="node8" class="node">
|
||||
<title>N8</title>
|
||||
<g id="a_node8"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry (3.51s)">
|
||||
<polygon fill="#ede7e0" stroke="#b28457" points="454,-802 339,-802 339,-734 454,-734 454,-802"></polygon>
|
||||
<text text-anchor="middle" x="396.5" y="-789.2" font-family="Times,serif" font-size="11.00">queue</text>
|
||||
<text text-anchor="middle" x="396.5" y="-777.2" font-family="Times,serif" font-size="11.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="396.5" y="-765.2" font-family="Times,serif" font-size="11.00">GetSQEntry</text>
|
||||
<text text-anchor="middle" x="396.5" y="-753.2" font-family="Times,serif" font-size="11.00">0.38s (1.11%)</text>
|
||||
<text text-anchor="middle" x="396.5" y="-741.2" font-family="Times,serif" font-size="11.00">of 3.51s (10.25%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N8 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>N1->N8</title>
|
||||
<g id="a_edge11"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetSQEntry (3.51s)">
|
||||
<path fill="none" stroke="#b28457" d="M576.19,-877.79C554.42,-870.33 530.41,-860.94 509.5,-850 487.14,-838.3 464.19,-822.65 444.87,-808.22"></path>
|
||||
<polygon fill="#b28457" stroke="#b28457" points="446.91,-805.37 436.82,-802.12 442.68,-810.95 446.91,-805.37"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge11-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetSQEntry (3.51s)">
|
||||
<text text-anchor="middle" x="531.5" y="-831.3" font-family="Times,serif" font-size="14.00"> 3.51s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N14 -->
|
||||
<g id="node14" class="node">
|
||||
<title>N14</title>
|
||||
<g id="a_node14"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry (5.63s)">
|
||||
<polygon fill="#ede1d9" stroke="#b25d1f" points="571,-797 472,-797 472,-739 571,-739 571,-797"></polygon>
|
||||
<text text-anchor="middle" x="521.5" y="-785.8" font-family="Times,serif" font-size="9.00">queue</text>
|
||||
<text text-anchor="middle" x="521.5" y="-775.8" font-family="Times,serif" font-size="9.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="521.5" y="-765.8" font-family="Times,serif" font-size="9.00">GetCQEntry</text>
|
||||
<text text-anchor="middle" x="521.5" y="-755.8" font-family="Times,serif" font-size="9.00">0.03s (0.088%)</text>
|
||||
<text text-anchor="middle" x="521.5" y="-745.8" font-family="Times,serif" font-size="9.00">of 5.63s (16.44%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N14 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>N1->N14</title>
|
||||
<g id="a_edge9"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetCQEntry (5.63s)">
|
||||
<path fill="none" stroke="#b25d1f" d="M602.2,-868C595.37,-862.32 588.53,-856.19 582.5,-850 569.26,-836.4 556.35,-819.88 545.84,-805.32"></path>
|
||||
<polygon fill="#b25d1f" stroke="#b25d1f" points="548.59,-803.14 539.95,-797.01 542.88,-807.19 548.59,-803.14"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge9-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetCQEntry (5.63s)">
|
||||
<text text-anchor="middle" x="610" y="-838.8" font-family="Times,serif" font-size="14.00"> 5.63s</text>
|
||||
<text text-anchor="middle" x="610" y="-823.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N15 -->
|
||||
<g id="node15" class="node">
|
||||
<title>N15</title>
|
||||
<g id="a_node15"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit (23.80s)">
|
||||
<polygon fill="#edd7d5" stroke="#b21200" points="694,-797 589,-797 589,-739 694,-739 694,-797"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-785.8" font-family="Times,serif" font-size="9.00">queue</text>
|
||||
<text text-anchor="middle" x="641.5" y="-775.8" font-family="Times,serif" font-size="9.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-765.8" font-family="Times,serif" font-size="9.00">Submit</text>
|
||||
<text text-anchor="middle" x="641.5" y="-755.8" font-family="Times,serif" font-size="9.00">0.01s (0.029%)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-745.8" font-family="Times,serif" font-size="9.00">of 23.80s (69.49%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N15 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>N1->N15</title>
|
||||
<g id="a_edge2"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).Submit (23.80s)">
|
||||
<path fill="none" stroke="#b21200" stroke-width="4" d="M641.5,-867.95C641.5,-849.95 641.5,-826.62 641.5,-807.13"></path>
|
||||
<polygon fill="#b21200" stroke="#b21200" stroke-width="4" points="645,-807.05 641.5,-797.05 638,-807.05 645,-807.05"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge2-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).Submit (23.80s)">
|
||||
<text text-anchor="middle" x="669" y="-838.8" font-family="Times,serif" font-size="14.00"> 23.80s</text>
|
||||
<text text-anchor="middle" x="669" y="-823.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2 -->
|
||||
<g id="node2" class="node">
|
||||
<title>N2</title>
|
||||
<g id="a_node2"><a xlink:title="syscall.Syscall6 (22.68s)">
|
||||
<polygon fill="#edd8d5" stroke="#b21400" points="762.5,-112 520.5,-112 520.5,0 762.5,0 762.5,-112"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-88.8" font-family="Times,serif" font-size="24.00">syscall</text>
|
||||
<text text-anchor="middle" x="641.5" y="-62.8" font-family="Times,serif" font-size="24.00">Syscall6</text>
|
||||
<text text-anchor="middle" x="641.5" y="-36.8" font-family="Times,serif" font-size="24.00">22.53s (65.78%)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-10.8" font-family="Times,serif" font-size="24.00">of 22.68s (66.22%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3 -->
|
||||
<g id="node3" class="node">
|
||||
<title>N3</title>
|
||||
<g id="a_node3"><a xlink:title="runtime.main (34.23s)">
|
||||
<polygon fill="#edd5d5" stroke="#b20000" points="691.5,-1015 591.5,-1015 591.5,-979 691.5,-979 691.5,-1015"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-1004.1" font-family="Times,serif" font-size="8.00">runtime</text>
|
||||
<text text-anchor="middle" x="641.5" y="-995.1" font-family="Times,serif" font-size="8.00">main</text>
|
||||
<text text-anchor="middle" x="641.5" y="-986.1" font-family="Times,serif" font-size="8.00">0 of 34.23s (99.94%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3->N1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>N3->N1</title>
|
||||
<g id="a_edge1"><a xlink:title="runtime.main -> main.main (34.23s)">
|
||||
<path fill="none" stroke="#b20000" stroke-width="5" d="M641.5,-978.66C641.5,-967.54 641.5,-952.64 641.5,-938.73"></path>
|
||||
<polygon fill="#b20000" stroke="#b20000" stroke-width="5" points="645.88,-938.37 641.5,-928.37 637.13,-938.37 645.88,-938.37"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge1-label"><a xlink:title="runtime.main -> main.main (34.23s)">
|
||||
<text text-anchor="middle" x="668" y="-949.8" font-family="Times,serif" font-size="14.00"> 34.23s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4 -->
|
||||
<g id="node4" class="node">
|
||||
<title>N4</title>
|
||||
<g id="a_node4"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.60s)">
|
||||
<polygon fill="#ede1d9" stroke="#b25d20" points="573,-683 422,-683 422,-590 573,-590 573,-683"></polygon>
|
||||
<text text-anchor="middle" x="497.5" y="-667" font-family="Times,serif" font-size="15.00">queue</text>
|
||||
<text text-anchor="middle" x="497.5" y="-650" font-family="Times,serif" font-size="15.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="497.5" y="-633" font-family="Times,serif" font-size="15.00">GetCQEntryWait</text>
|
||||
<text text-anchor="middle" x="497.5" y="-616" font-family="Times,serif" font-size="15.00">4.31s (12.58%)</text>
|
||||
<text text-anchor="middle" x="497.5" y="-599" font-family="Times,serif" font-size="15.00">of 5.60s (16.35%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N10 -->
|
||||
<g id="node10" class="node">
|
||||
<title>N10</title>
|
||||
<g id="a_node10"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).cqPeek (0.71s)">
|
||||
<polygon fill="#edecea" stroke="#b2ac9f" points="221.5,-515.5 127.5,-515.5 127.5,-459.5 221.5,-459.5 221.5,-515.5"></polygon>
|
||||
<text text-anchor="middle" x="174.5" y="-502.7" font-family="Times,serif" font-size="11.00">queue</text>
|
||||
<text text-anchor="middle" x="174.5" y="-490.7" font-family="Times,serif" font-size="11.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="174.5" y="-478.7" font-family="Times,serif" font-size="11.00">cqPeek</text>
|
||||
<text text-anchor="middle" x="174.5" y="-466.7" font-family="Times,serif" font-size="11.00">0.71s (2.07%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4->N10 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>N4->N10</title>
|
||||
<g id="a_edge15"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqPeek (0.71s)">
|
||||
<path fill="none" stroke="#b2ac9f" d="M421.63,-593.19C418.58,-592.03 415.53,-590.96 412.5,-590 350.61,-570.34 326.59,-598.93 267.5,-572 242.97,-560.82 220.34,-540.82 203.55,-523.2"></path>
|
||||
<polygon fill="#b2ac9f" stroke="#b2ac9f" points="206.08,-520.79 196.72,-515.83 200.95,-525.54 206.08,-520.79"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge15-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqPeek (0.71s)">
|
||||
<text text-anchor="middle" x="295" y="-560.8" font-family="Times,serif" font-size="14.00"> 0.71s</text>
|
||||
<text text-anchor="middle" x="295" y="-545.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N11 -->
|
||||
<g id="node11" class="node">
|
||||
<title>N11</title>
|
||||
<g id="a_node11"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).precheck (0.31s)">
|
||||
<polygon fill="#edecec" stroke="#b2b0aa" points="323.5,-513.5 239.5,-513.5 239.5,-461.5 323.5,-461.5 323.5,-513.5"></polygon>
|
||||
<text text-anchor="middle" x="281.5" y="-501.5" font-family="Times,serif" font-size="10.00">queue</text>
|
||||
<text text-anchor="middle" x="281.5" y="-490.5" font-family="Times,serif" font-size="10.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="281.5" y="-479.5" font-family="Times,serif" font-size="10.00">precheck</text>
|
||||
<text text-anchor="middle" x="281.5" y="-468.5" font-family="Times,serif" font-size="10.00">0.31s (0.91%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4->N11 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>N4->N11</title>
|
||||
<g id="a_edge16"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).precheck (0.31s)">
|
||||
<path fill="none" stroke="#b2b0aa" d="M421.8,-594.19C418.68,-592.73 415.57,-591.33 412.5,-590 389.68,-580.1 380.4,-585.5 359.5,-572 338.88,-558.68 319.97,-538.73 305.93,-521.67"></path>
|
||||
<polygon fill="#b2b0aa" stroke="#b2b0aa" points="308.43,-519.18 299.45,-513.56 302.96,-523.56 308.43,-519.18"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge16-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).precheck (0.31s)">
|
||||
<text text-anchor="middle" x="387" y="-560.8" font-family="Times,serif" font-size="14.00"> 0.31s</text>
|
||||
<text text-anchor="middle" x="387" y="-545.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N12 -->
|
||||
<g id="node12" class="node">
|
||||
<title>N12</title>
|
||||
<g id="a_node12"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.27s)">
|
||||
<polygon fill="#edecec" stroke="#b2b0ab" points="438,-519 341,-519 341,-456 438,-456 438,-519"></polygon>
|
||||
<text text-anchor="middle" x="389.5" y="-507" font-family="Times,serif" font-size="10.00">queue</text>
|
||||
<text text-anchor="middle" x="389.5" y="-496" font-family="Times,serif" font-size="10.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="389.5" y="-485" font-family="Times,serif" font-size="10.00">cqAdvance</text>
|
||||
<text text-anchor="middle" x="389.5" y="-474" font-family="Times,serif" font-size="10.00">0.26s (0.76%)</text>
|
||||
<text text-anchor="middle" x="389.5" y="-463" font-family="Times,serif" font-size="10.00">of 0.27s (0.79%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4->N12 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>N4->N12</title>
|
||||
<g id="a_edge17"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.27s)">
|
||||
<path fill="none" stroke="#b2b0ab" d="M451.11,-589.88C445.96,-584.05 440.97,-578.01 436.5,-572 426.49,-558.53 417.07,-542.7 409.33,-528.47"></path>
|
||||
<polygon fill="#b2b0ab" stroke="#b2b0ab" points="412.28,-526.58 404.5,-519.4 406.1,-529.87 412.28,-526.58"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge17-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.27s)">
|
||||
<text text-anchor="middle" x="464" y="-560.8" font-family="Times,serif" font-size="14.00"> 0.27s</text>
|
||||
<text text-anchor="middle" x="464" y="-545.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N5 -->
|
||||
<g id="node5" class="node">
|
||||
<title>N5</title>
|
||||
<g id="a_node5"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (23.79s)">
|
||||
<polygon fill="#edd7d5" stroke="#b21200" points="691.5,-658.5 591.5,-658.5 591.5,-614.5 691.5,-614.5 691.5,-658.5"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-648.1" font-family="Times,serif" font-size="8.00">queue</text>
|
||||
<text text-anchor="middle" x="641.5" y="-639.1" font-family="Times,serif" font-size="8.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-630.1" font-family="Times,serif" font-size="8.00">SubmitAndWait</text>
|
||||
<text text-anchor="middle" x="641.5" y="-621.1" font-family="Times,serif" font-size="8.00">0 of 23.79s (69.46%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N9 -->
|
||||
<g id="node9" class="node">
|
||||
<title>N9</title>
|
||||
<g id="a_node9"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).sqFlush (1.07s)">
|
||||
<polygon fill="#edebe9" stroke="#b2a896" points="571,-524 456,-524 456,-451 571,-451 571,-524"></polygon>
|
||||
<text text-anchor="middle" x="513.5" y="-510.4" font-family="Times,serif" font-size="12.00">queue</text>
|
||||
<text text-anchor="middle" x="513.5" y="-497.4" font-family="Times,serif" font-size="12.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="513.5" y="-484.4" font-family="Times,serif" font-size="12.00">sqFlush</text>
|
||||
<text text-anchor="middle" x="513.5" y="-471.4" font-family="Times,serif" font-size="12.00">0.92s (2.69%)</text>
|
||||
<text text-anchor="middle" x="513.5" y="-458.4" font-family="Times,serif" font-size="12.00">of 1.07s (3.12%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N5->N9 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>N5->N9</title>
|
||||
<g id="a_edge14"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring/queue.(*Queue).sqFlush (1.07s)">
|
||||
<path fill="none" stroke="#b2a896" d="M623.16,-614.44C604.54,-593.05 575.15,-559.3 551.48,-532.12"></path>
|
||||
<polygon fill="#b2a896" stroke="#b2a896" points="553.87,-529.53 544.66,-524.28 548.59,-534.12 553.87,-529.53"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge14-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring/queue.(*Queue).sqFlush (1.07s)">
|
||||
<text text-anchor="middle" x="607.5" y="-553.3" font-family="Times,serif" font-size="14.00"> 1.07s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N13 -->
|
||||
<g id="node13" class="node">
|
||||
<title>N13</title>
|
||||
<g id="a_node13"><a xlink:title="github.com/ii64/gouring.(*Ring).Enter (22.72s)">
|
||||
<polygon fill="#edd8d5" stroke="#b21400" points="694,-516.5 589,-516.5 589,-458.5 694,-458.5 694,-516.5"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-505.3" font-family="Times,serif" font-size="9.00">gouring</text>
|
||||
<text text-anchor="middle" x="641.5" y="-495.3" font-family="Times,serif" font-size="9.00">(*Ring)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-485.3" font-family="Times,serif" font-size="9.00">Enter</text>
|
||||
<text text-anchor="middle" x="641.5" y="-475.3" font-family="Times,serif" font-size="9.00">0.03s (0.088%)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-465.3" font-family="Times,serif" font-size="9.00">of 22.72s (66.34%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N5->N13 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>N5->N13</title>
|
||||
<g id="a_edge4"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring.(*Ring).Enter (22.72s)">
|
||||
<path fill="none" stroke="#b21400" stroke-width="4" d="M641.5,-614.44C641.5,-591.63 641.5,-554.77 641.5,-526.8"></path>
|
||||
<polygon fill="#b21400" stroke="#b21400" stroke-width="4" points="645,-526.57 641.5,-516.57 638,-526.57 645,-526.57"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge4-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring.(*Ring).Enter (22.72s)">
|
||||
<text text-anchor="middle" x="668" y="-553.3" font-family="Times,serif" font-size="14.00"> 22.72s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6 -->
|
||||
<g id="node6" class="node">
|
||||
<title>N6</title>
|
||||
<g id="a_node6"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry (3.13s)">
|
||||
<polygon fill="#ede7e2" stroke="#b28a60" points="404,-675.5 279,-675.5 279,-597.5 404,-597.5 404,-675.5"></polygon>
|
||||
<text text-anchor="middle" x="341.5" y="-661.1" font-family="Times,serif" font-size="13.00">queue</text>
|
||||
<text text-anchor="middle" x="341.5" y="-647.1" font-family="Times,serif" font-size="13.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="341.5" y="-633.1" font-family="Times,serif" font-size="13.00">_getSQEntry</text>
|
||||
<text text-anchor="middle" x="341.5" y="-619.1" font-family="Times,serif" font-size="13.00">1.68s (4.91%)</text>
|
||||
<text text-anchor="middle" x="341.5" y="-605.1" font-family="Times,serif" font-size="13.00">of 3.13s (9.14%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N7 -->
|
||||
<g id="node7" class="node">
|
||||
<title>N7</title>
|
||||
<g id="a_node7"><a xlink:title="github.com/ii64/gouring.(*SQEntry).Reset (1.45s)">
|
||||
<polygon fill="#edebe8" stroke="#b2a38c" points="109,-519.5 0,-519.5 0,-455.5 109,-455.5 109,-519.5"></polygon>
|
||||
<text text-anchor="middle" x="54.5" y="-505.1" font-family="Times,serif" font-size="13.00">gouring</text>
|
||||
<text text-anchor="middle" x="54.5" y="-491.1" font-family="Times,serif" font-size="13.00">(*SQEntry)</text>
|
||||
<text text-anchor="middle" x="54.5" y="-477.1" font-family="Times,serif" font-size="13.00">Reset</text>
|
||||
<text text-anchor="middle" x="54.5" y="-463.1" font-family="Times,serif" font-size="13.00">1.45s (4.23%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N7 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>N6->N7</title>
|
||||
<g id="a_edge13"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry -> github.com/ii64/gouring.(*SQEntry).Reset (1.45s)">
|
||||
<path fill="none" stroke="#b2a38c" d="M278.83,-630.69C228.64,-624.13 158.59,-608.63 108.5,-572 93.36,-560.93 81.34,-544.21 72.52,-528.63"></path>
|
||||
<polygon fill="#b2a38c" stroke="#b2a38c" points="75.51,-526.8 67.7,-519.64 69.34,-530.11 75.51,-526.8"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge13-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry -> github.com/ii64/gouring.(*SQEntry).Reset (1.45s)">
|
||||
<text text-anchor="middle" x="130.5" y="-553.3" font-family="Times,serif" font-size="14.00"> 1.45s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N8->N6 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>N8->N6</title>
|
||||
<g id="a_edge12"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry -> github.com/ii64/gouring/queue.(*Queue)._getSQEntry (3.13s)">
|
||||
<path fill="none" stroke="#b28a60" d="M382.48,-733.99C376.2,-719.2 368.68,-701.49 361.8,-685.29"></path>
|
||||
<polygon fill="#b28a60" stroke="#b28a60" points="364.97,-683.8 357.84,-675.97 358.53,-686.54 364.97,-683.8"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge12-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry -> github.com/ii64/gouring/queue.(*Queue)._getSQEntry (3.13s)">
|
||||
<text text-anchor="middle" x="396.5" y="-704.8" font-family="Times,serif" font-size="14.00"> 3.13s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N17 -->
|
||||
<g id="node17" class="node">
|
||||
<title>N17</title>
|
||||
<g id="a_node17"><a xlink:title="github.com/ii64/gouring.enter (22.69s)">
|
||||
<polygon fill="#edd8d5" stroke="#b21400" points="691.5,-400 591.5,-400 591.5,-364 691.5,-364 691.5,-400"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-389.1" font-family="Times,serif" font-size="8.00">gouring</text>
|
||||
<text text-anchor="middle" x="641.5" y="-380.1" font-family="Times,serif" font-size="8.00">enter</text>
|
||||
<text text-anchor="middle" x="641.5" y="-371.1" font-family="Times,serif" font-size="8.00">0 of 22.69s (66.25%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N13->N17 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>N13->N17</title>
|
||||
<g id="a_edge5"><a xlink:title="github.com/ii64/gouring.(*Ring).Enter -> github.com/ii64/gouring.enter (22.69s)">
|
||||
<path fill="none" stroke="#b21400" stroke-width="4" d="M641.5,-458.49C641.5,-443.46 641.5,-425.02 641.5,-410.13"></path>
|
||||
<polygon fill="#b21400" stroke="#b21400" stroke-width="4" points="645,-410.01 641.5,-400.01 638,-410.01 645,-410.01"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge5-label"><a xlink:title="github.com/ii64/gouring.(*Ring).Enter -> github.com/ii64/gouring.enter (22.69s)">
|
||||
<text text-anchor="middle" x="668" y="-421.8" font-family="Times,serif" font-size="14.00"> 22.69s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N14->N4 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>N14->N4</title>
|
||||
<g id="a_edge10"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry -> github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.60s)">
|
||||
<path fill="none" stroke="#b25d20" d="M516.29,-738.9C513.82,-725.54 510.76,-709.07 507.84,-693.32"></path>
|
||||
<polygon fill="#b25d20" stroke="#b25d20" points="511.22,-692.3 505.95,-683.11 504.33,-693.58 511.22,-692.3"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge10-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry -> github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.60s)">
|
||||
<text text-anchor="middle" x="534.5" y="-704.8" font-family="Times,serif" font-size="14.00"> 5.60s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N15->N5 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>N15->N5</title>
|
||||
<g id="a_edge3"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit -> github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (23.79s)">
|
||||
<path fill="none" stroke="#b21200" stroke-width="4" d="M641.5,-738.9C641.5,-718.28 641.5,-690.27 641.5,-668.91"></path>
|
||||
<polygon fill="#b21200" stroke="#b21200" stroke-width="4" points="645,-668.73 641.5,-658.73 638,-668.73 645,-668.73"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge3-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit -> github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (23.79s)">
|
||||
<text text-anchor="middle" x="668" y="-704.8" font-family="Times,serif" font-size="14.00"> 23.79s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N16 -->
|
||||
<g id="node16" class="node">
|
||||
<title>N16</title>
|
||||
<g id="a_node16"><a xlink:title="github.com/ii64/gouring.io_uring_enter2 (22.69s)">
|
||||
<polygon fill="#edd8d5" stroke="#b21400" points="694,-211 589,-211 589,-163 694,-163 694,-211"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-199.8" font-family="Times,serif" font-size="9.00">gouring</text>
|
||||
<text text-anchor="middle" x="641.5" y="-189.8" font-family="Times,serif" font-size="9.00">io_uring_enter2</text>
|
||||
<text text-anchor="middle" x="641.5" y="-179.8" font-family="Times,serif" font-size="9.00">0.01s (0.029%)</text>
|
||||
<text text-anchor="middle" x="641.5" y="-169.8" font-family="Times,serif" font-size="9.00">of 22.69s (66.25%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N16->N2 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>N16->N2</title>
|
||||
<g id="a_edge8"><a xlink:title="github.com/ii64/gouring.io_uring_enter2 -> syscall.Syscall6 (22.68s)">
|
||||
<path fill="none" stroke="#b21400" stroke-width="4" d="M641.5,-162.94C641.5,-151.4 641.5,-136.79 641.5,-122.13"></path>
|
||||
<polygon fill="#b21400" stroke="#b21400" stroke-width="4" points="645,-122.02 641.5,-112.02 638,-122.02 645,-122.02"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge8-label"><a xlink:title="github.com/ii64/gouring.io_uring_enter2 -> syscall.Syscall6 (22.68s)">
|
||||
<text text-anchor="middle" x="668" y="-133.8" font-family="Times,serif" font-size="14.00"> 22.68s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N18 -->
|
||||
<g id="node18" class="node">
|
||||
<title>N18</title>
|
||||
<g id="a_node18"><a xlink:title="github.com/ii64/gouring.io_uring_enter (22.69s)">
|
||||
<polygon fill="#edd8d5" stroke="#b21400" points="691.5,-298 591.5,-298 591.5,-262 691.5,-262 691.5,-298"></polygon>
|
||||
<text text-anchor="middle" x="641.5" y="-287.1" font-family="Times,serif" font-size="8.00">gouring</text>
|
||||
<text text-anchor="middle" x="641.5" y="-278.1" font-family="Times,serif" font-size="8.00">io_uring_enter</text>
|
||||
<text text-anchor="middle" x="641.5" y="-269.1" font-family="Times,serif" font-size="8.00">0 of 22.69s (66.25%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N17->N18 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>N17->N18</title>
|
||||
<g id="a_edge6"><a xlink:title="github.com/ii64/gouring.enter -> github.com/ii64/gouring.io_uring_enter (22.69s)">
|
||||
<path fill="none" stroke="#b21400" stroke-width="4" d="M641.5,-363.58C641.5,-348.38 641.5,-326.07 641.5,-308.46"></path>
|
||||
<polygon fill="#b21400" stroke="#b21400" stroke-width="4" points="645,-308.22 641.5,-298.22 638,-308.22 645,-308.22"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge6-label"><a xlink:title="github.com/ii64/gouring.enter -> github.com/ii64/gouring.io_uring_enter (22.69s)">
|
||||
<text text-anchor="middle" x="669" y="-334.8" font-family="Times,serif" font-size="14.00"> 22.69s</text>
|
||||
<text text-anchor="middle" x="669" y="-319.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N18->N16 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>N18->N16</title>
|
||||
<g id="a_edge7"><a xlink:title="github.com/ii64/gouring.io_uring_enter -> github.com/ii64/gouring.io_uring_enter2 (22.69s)">
|
||||
<path fill="none" stroke="#b21400" stroke-width="4" d="M641.5,-261.88C641.5,-250.48 641.5,-235.11 641.5,-221.34"></path>
|
||||
<polygon fill="#b21400" stroke="#b21400" stroke-width="4" points="645,-221.22 641.5,-211.22 638,-221.22 645,-221.22"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge7-label"><a xlink:title="github.com/ii64/gouring.io_uring_enter -> github.com/ii64/gouring.io_uring_enter2 (22.69s)">
|
||||
<text text-anchor="middle" x="668" y="-232.8" font-family="Times,serif" font-size="14.00"> 22.69s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After (image error) Size: 26 KiB |
864
assets/sqpoll.svg
Normal file
864
assets/sqpoll.svg
Normal file
|
@ -0,0 +1,864 @@
|
|||
<svg width="1728pt" height="1233pt" viewBox="0.00 0.00 1728.00 1233.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1229)">
|
||||
<title>prf</title>
|
||||
<polygon fill="white" stroke="transparent" points="-4,4 -4,-1229 1724,-1229 1724,4 -4,4"></polygon>
|
||||
<!-- N1 -->
|
||||
<g id="node1" class="node">
|
||||
<title>N1</title>
|
||||
<g id="a_node1"><a xlink:title="main.main (18.94s)">
|
||||
<polygon fill="#eddad5" stroke="#b22600" points="274.5,-1106 68.5,-1106 68.5,-1010 274.5,-1010 274.5,-1106"></polygon>
|
||||
<text text-anchor="middle" x="171.5" y="-1086" font-family="Times,serif" font-size="20.00">main</text>
|
||||
<text text-anchor="middle" x="171.5" y="-1064" font-family="Times,serif" font-size="20.00">main</text>
|
||||
<text text-anchor="middle" x="171.5" y="-1042" font-family="Times,serif" font-size="20.00">2.21s (5.24%)</text>
|
||||
<text text-anchor="middle" x="171.5" y="-1020" font-family="Times,serif" font-size="20.00">of 18.94s (44.88%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N8 -->
|
||||
<g id="node8" class="node">
|
||||
<title>N8</title>
|
||||
<g id="a_node8"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry (8.68s)">
|
||||
<polygon fill="#edded5" stroke="#b24300" points="285,-944 58,-944 58,-806 285,-806 285,-944"></polygon>
|
||||
<text text-anchor="middle" x="171.5" y="-920.8" font-family="Times,serif" font-size="24.00">queue</text>
|
||||
<text text-anchor="middle" x="171.5" y="-894.8" font-family="Times,serif" font-size="24.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="171.5" y="-868.8" font-family="Times,serif" font-size="24.00">GetSQEntry</text>
|
||||
<text text-anchor="middle" x="171.5" y="-842.8" font-family="Times,serif" font-size="24.00">4.12s (9.76%)</text>
|
||||
<text text-anchor="middle" x="171.5" y="-816.8" font-family="Times,serif" font-size="24.00">of 8.68s (20.57%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N8 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>N1->N8</title>
|
||||
<g id="a_edge5"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetSQEntry (8.68s)">
|
||||
<path fill="none" stroke="#b24300" stroke-width="2" d="M171.5,-1009.92C171.5,-992.96 171.5,-973.33 171.5,-954.43"></path>
|
||||
<polygon fill="#b24300" stroke="#b24300" stroke-width="2" points="175,-954.32 171.5,-944.32 168,-954.32 175,-954.32"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge5-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetSQEntry (8.68s)">
|
||||
<text text-anchor="middle" x="193.5" y="-973.3" font-family="Times,serif" font-size="14.00"> 8.68s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N30 -->
|
||||
<g id="node30" class="node">
|
||||
<title>N30</title>
|
||||
<g id="a_node30"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry (6s)">
|
||||
<polygon fill="#ede3dc" stroke="#b26b33" points="391.5,-904 303.5,-904 303.5,-846 391.5,-846 391.5,-904"></polygon>
|
||||
<text text-anchor="middle" x="347.5" y="-892.8" font-family="Times,serif" font-size="9.00">queue</text>
|
||||
<text text-anchor="middle" x="347.5" y="-882.8" font-family="Times,serif" font-size="9.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="347.5" y="-872.8" font-family="Times,serif" font-size="9.00">GetCQEntry</text>
|
||||
<text text-anchor="middle" x="347.5" y="-862.8" font-family="Times,serif" font-size="9.00">0.01s (0.024%)</text>
|
||||
<text text-anchor="middle" x="347.5" y="-852.8" font-family="Times,serif" font-size="9.00">of 6s (14.22%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N30 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>N1->N30</title>
|
||||
<g id="a_edge7"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetCQEntry (6s)">
|
||||
<path fill="none" stroke="#b26b33" d="M226.04,-1009.75C247.74,-990.12 272.5,-966.66 293.5,-944 302.64,-934.14 311.96,-922.9 320.23,-912.44"></path>
|
||||
<polygon fill="#b26b33" stroke="#b26b33" points="323.22,-914.29 326.61,-904.25 317.7,-909.99 323.22,-914.29"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge7-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).GetCQEntry (6s)">
|
||||
<text text-anchor="middle" x="303" y="-980.8" font-family="Times,serif" font-size="14.00"> 6s</text>
|
||||
<text text-anchor="middle" x="303" y="-965.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N33 -->
|
||||
<g id="node33" class="node">
|
||||
<title>N33</title>
|
||||
<g id="a_node33"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit (2.05s)">
|
||||
<polygon fill="#edeae7" stroke="#b2a187" points="586,-897 497,-897 497,-853 586,-853 586,-897"></polygon>
|
||||
<text text-anchor="middle" x="541.5" y="-886.6" font-family="Times,serif" font-size="8.00">queue</text>
|
||||
<text text-anchor="middle" x="541.5" y="-877.6" font-family="Times,serif" font-size="8.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="541.5" y="-868.6" font-family="Times,serif" font-size="8.00">Submit</text>
|
||||
<text text-anchor="middle" x="541.5" y="-859.6" font-family="Times,serif" font-size="8.00">0 of 2.05s (4.86%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N1->N33 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>N1->N33</title>
|
||||
<g id="a_edge20"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).Submit (2.05s)">
|
||||
<path fill="none" stroke="#b2a187" d="M274.55,-1018.29C294.64,-1010.07 315.39,-1001.12 334.5,-992 392.69,-964.24 457.11,-927.06 498.38,-902.36"></path>
|
||||
<polygon fill="#b2a187" stroke="#b2a187" points="500.31,-905.28 507.08,-897.13 496.71,-899.28 500.31,-905.28"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge20-label"><a xlink:title="main.main -> github.com/ii64/gouring/queue.(*Queue).Submit (2.05s)">
|
||||
<text text-anchor="middle" x="421" y="-980.8" font-family="Times,serif" font-size="14.00"> 2.05s</text>
|
||||
<text text-anchor="middle" x="421" y="-965.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2 -->
|
||||
<g id="node2" class="node">
|
||||
<title>N2</title>
|
||||
<g id="a_node2"><a xlink:title="runtime.goschedImpl (21.46s)">
|
||||
<polygon fill="#edd9d5" stroke="#b22000" points="1335.5,-909 1183.5,-909 1183.5,-841 1335.5,-841 1335.5,-909"></polygon>
|
||||
<text text-anchor="middle" x="1259.5" y="-893.8" font-family="Times,serif" font-size="14.00">runtime</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-878.8" font-family="Times,serif" font-size="14.00">goschedImpl</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-863.8" font-family="Times,serif" font-size="14.00">0.51s (1.21%)</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-848.8" font-family="Times,serif" font-size="14.00">of 21.46s (50.85%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3 -->
|
||||
<g id="node3" class="node">
|
||||
<title>N3</title>
|
||||
<g id="a_node3"><a xlink:title="runtime.schedule (13.81s)">
|
||||
<polygon fill="#eddcd5" stroke="#b23200" points="1353.5,-730 1165.5,-730 1165.5,-642 1353.5,-642 1353.5,-730"></polygon>
|
||||
<text text-anchor="middle" x="1259.5" y="-711.6" font-family="Times,serif" font-size="18.00">runtime</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-691.6" font-family="Times,serif" font-size="18.00">schedule</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-671.6" font-family="Times,serif" font-size="18.00">1.51s (3.58%)</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-651.6" font-family="Times,serif" font-size="18.00">of 13.81s (32.73%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2->N3 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>N2->N3</title>
|
||||
<g id="a_edge4"><a xlink:title="runtime.goschedImpl -> runtime.schedule (13.80s)">
|
||||
<path fill="none" stroke="#b23200" stroke-width="2" d="M1259.5,-841C1259.5,-813.18 1259.5,-772.85 1259.5,-740.43"></path>
|
||||
<polygon fill="#b23200" stroke="#b23200" stroke-width="2" points="1263,-740.22 1259.5,-730.22 1256,-740.22 1263,-740.22"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge4-label"><a xlink:title="runtime.goschedImpl -> runtime.schedule (13.80s)">
|
||||
<text text-anchor="middle" x="1286" y="-776.8" font-family="Times,serif" font-size="14.00"> 13.80s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N7 -->
|
||||
<g id="node7" class="node">
|
||||
<title>N7</title>
|
||||
<g id="a_node7"><a xlink:title="runtime.casgstatus (5.16s)">
|
||||
<polygon fill="#ede5de" stroke="#b27845" points="885.5,-387 671.5,-387 671.5,-283 885.5,-283 885.5,-387"></polygon>
|
||||
<text text-anchor="middle" x="778.5" y="-365.4" font-family="Times,serif" font-size="22.00">runtime</text>
|
||||
<text text-anchor="middle" x="778.5" y="-341.4" font-family="Times,serif" font-size="22.00">casgstatus</text>
|
||||
<text text-anchor="middle" x="778.5" y="-317.4" font-family="Times,serif" font-size="22.00">3.11s (7.37%)</text>
|
||||
<text text-anchor="middle" x="778.5" y="-293.4" font-family="Times,serif" font-size="22.00">of 5.16s (12.23%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2->N7 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>N2->N7</title>
|
||||
<g id="a_edge15"><a xlink:title="runtime.goschedImpl -> runtime.casgstatus (2.75s)">
|
||||
<path fill="none" stroke="#b29878" d="M1183.06,-845.07C1076.14,-800.14 885.21,-702.64 797.5,-551 770.64,-504.56 767.88,-442.82 770.67,-397.41"></path>
|
||||
<polygon fill="#b29878" stroke="#b29878" points="774.16,-397.63 771.38,-387.41 767.18,-397.13 774.16,-397.63"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge15-label"><a xlink:title="runtime.goschedImpl -> runtime.casgstatus (2.75s)">
|
||||
<text text-anchor="middle" x="848.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 2.75s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N16 -->
|
||||
<g id="node16" class="node">
|
||||
<title>N16</title>
|
||||
<g id="a_node16"><a xlink:title="runtime.unlock (3.78s)">
|
||||
<polygon fill="#ede7e2" stroke="#b28b62" points="1488,-361 1391,-361 1391,-309 1488,-309 1488,-361"></polygon>
|
||||
<text text-anchor="middle" x="1439.5" y="-349" font-family="Times,serif" font-size="10.00">runtime</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-338" font-family="Times,serif" font-size="10.00">unlock</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-327" font-family="Times,serif" font-size="10.00">0.06s (0.14%)</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-316" font-family="Times,serif" font-size="10.00">of 3.78s (8.96%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2->N16 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>N2->N16</title>
|
||||
<g id="a_edge18"><a xlink:title="runtime.goschedImpl -> runtime.unlock (2.06s)">
|
||||
<path fill="none" stroke="#b2a086" d="M1296.12,-840.94C1318.53,-818.75 1345.97,-787.67 1362.5,-755 1431.41,-618.76 1420.6,-571.62 1438.5,-420 1440.37,-404.15 1440.83,-386.5 1440.73,-371.49"></path>
|
||||
<polygon fill="#b2a086" stroke="#b2a086" points="1444.23,-371.03 1440.58,-361.08 1437.23,-371.13 1444.23,-371.03"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge18-label"><a xlink:title="runtime.goschedImpl -> runtime.unlock (2.06s)">
|
||||
<text text-anchor="middle" x="1450" y="-587.8" font-family="Times,serif" font-size="14.00"> 2.06s</text>
|
||||
<text text-anchor="middle" x="1450" y="-572.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N19 -->
|
||||
<g id="node19" class="node">
|
||||
<title>N19</title>
|
||||
<g id="a_node19"><a xlink:title="runtime.lock (3.09s)">
|
||||
<polygon fill="#ede9e4" stroke="#b29471" points="1617,-353 1528,-353 1528,-317 1617,-317 1617,-353"></polygon>
|
||||
<text text-anchor="middle" x="1572.5" y="-342.1" font-family="Times,serif" font-size="8.00">runtime</text>
|
||||
<text text-anchor="middle" x="1572.5" y="-333.1" font-family="Times,serif" font-size="8.00">lock</text>
|
||||
<text text-anchor="middle" x="1572.5" y="-324.1" font-family="Times,serif" font-size="8.00">0 of 3.09s (7.32%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N2->N19 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>N2->N19</title>
|
||||
<g id="a_edge17"><a xlink:title="runtime.goschedImpl -> runtime.lock (2.06s)">
|
||||
<path fill="none" stroke="#b2a086" d="M1308.95,-840.76C1338.74,-818.94 1375.93,-788.34 1402.5,-755 1503.24,-628.57 1551.91,-434.42 1567.09,-363.31"></path>
|
||||
<polygon fill="#b2a086" stroke="#b2a086" points="1570.56,-363.86 1569.17,-353.35 1563.7,-362.43 1570.56,-363.86"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge17-label"><a xlink:title="runtime.goschedImpl -> runtime.lock (2.06s)">
|
||||
<text text-anchor="middle" x="1526.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 2.06s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6 -->
|
||||
<g id="node6" class="node">
|
||||
<title>N6</title>
|
||||
<g id="a_node6"><a xlink:title="runtime.findrunnable (6.46s)">
|
||||
<polygon fill="#ede2da" stroke="#b26429" points="1340.5,-534.5 1178.5,-534.5 1178.5,-454.5 1340.5,-454.5 1340.5,-534.5"></polygon>
|
||||
<text text-anchor="middle" x="1259.5" y="-517.7" font-family="Times,serif" font-size="16.00">runtime</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-499.7" font-family="Times,serif" font-size="16.00">findrunnable</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-481.7" font-family="Times,serif" font-size="16.00">1s (2.37%)</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-463.7" font-family="Times,serif" font-size="16.00">of 6.46s (15.31%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3->N6 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>N3->N6</title>
|
||||
<g id="a_edge6"><a xlink:title="runtime.schedule -> runtime.findrunnable (6.46s)">
|
||||
<path fill="none" stroke="#b26429" d="M1259.5,-642C1259.5,-613.18 1259.5,-575.15 1259.5,-545.06"></path>
|
||||
<polygon fill="#b26429" stroke="#b26429" points="1263,-544.78 1259.5,-534.78 1256,-544.78 1263,-544.78"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge6-label"><a xlink:title="runtime.schedule -> runtime.findrunnable (6.46s)">
|
||||
<text text-anchor="middle" x="1281.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 6.46s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N13 -->
|
||||
<g id="node13" class="node">
|
||||
<title>N13</title>
|
||||
<g id="a_node13"><a xlink:title="runtime.execute (4.68s)">
|
||||
<polygon fill="#ede6df" stroke="#b27f4f" points="1000.5,-542.5 806.5,-542.5 806.5,-446.5 1000.5,-446.5 1000.5,-542.5"></polygon>
|
||||
<text text-anchor="middle" x="903.5" y="-522.5" font-family="Times,serif" font-size="20.00">runtime</text>
|
||||
<text text-anchor="middle" x="903.5" y="-500.5" font-family="Times,serif" font-size="20.00">execute</text>
|
||||
<text text-anchor="middle" x="903.5" y="-478.5" font-family="Times,serif" font-size="20.00">2.20s (5.21%)</text>
|
||||
<text text-anchor="middle" x="903.5" y="-456.5" font-family="Times,serif" font-size="20.00">of 4.68s (11.09%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3->N13 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>N3->N13</title>
|
||||
<g id="a_edge9"><a xlink:title="runtime.schedule -> runtime.execute (4.68s)">
|
||||
<path fill="none" stroke="#b27f4f" d="M1165.46,-671.84C1107.4,-660.12 1033.71,-638.45 978.5,-599 960.97,-586.47 945.94,-568.56 934.05,-551.14"></path>
|
||||
<polygon fill="#b27f4f" stroke="#b27f4f" points="936.89,-549.09 928.46,-542.66 931.04,-552.94 936.89,-549.09"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge9-label"><a xlink:title="runtime.schedule -> runtime.execute (4.68s)">
|
||||
<text text-anchor="middle" x="1000.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 4.68s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N15 -->
|
||||
<g id="node15" class="node">
|
||||
<title>N15</title>
|
||||
<g id="a_node15"><a xlink:title="runtime.checkTimers (2.02s)">
|
||||
<polygon fill="#edeae7" stroke="#b2a187" points="1055.5,-375 903.5,-375 903.5,-295 1055.5,-295 1055.5,-375"></polygon>
|
||||
<text text-anchor="middle" x="979.5" y="-358.2" font-family="Times,serif" font-size="16.00">runtime</text>
|
||||
<text text-anchor="middle" x="979.5" y="-340.2" font-family="Times,serif" font-size="16.00">checkTimers</text>
|
||||
<text text-anchor="middle" x="979.5" y="-322.2" font-family="Times,serif" font-size="16.00">0.88s (2.09%)</text>
|
||||
<text text-anchor="middle" x="979.5" y="-304.2" font-family="Times,serif" font-size="16.00">of 2.02s (4.79%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3->N15 -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>N3->N15</title>
|
||||
<g id="a_edge30"><a xlink:title="runtime.schedule -> runtime.checkTimers (0.89s)">
|
||||
<path fill="none" stroke="#b2ac9f" d="M1165.72,-642C1126.04,-619.74 1082.23,-589.16 1052.5,-551 1042.02,-537.55 1012.37,-444.1 994.24,-384.91"></path>
|
||||
<polygon fill="#b2ac9f" stroke="#b2ac9f" points="997.49,-383.55 991.22,-375.01 990.79,-385.59 997.49,-383.55"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge30-label"><a xlink:title="runtime.schedule -> runtime.checkTimers (0.89s)">
|
||||
<text text-anchor="middle" x="1074.5" y="-490.8" font-family="Times,serif" font-size="14.00"> 0.89s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N24 -->
|
||||
<g id="node24" class="node">
|
||||
<title>N24</title>
|
||||
<g id="a_node24"><a xlink:title="runtime.runqget (0.45s)">
|
||||
<polygon fill="#edeceb" stroke="#b2b0a8" points="1189.5,-361.5 1073.5,-361.5 1073.5,-308.5 1189.5,-308.5 1189.5,-361.5"></polygon>
|
||||
<text text-anchor="middle" x="1131.5" y="-346.3" font-family="Times,serif" font-size="14.00">runtime</text>
|
||||
<text text-anchor="middle" x="1131.5" y="-331.3" font-family="Times,serif" font-size="14.00">runqget</text>
|
||||
<text text-anchor="middle" x="1131.5" y="-316.3" font-family="Times,serif" font-size="14.00">0.45s (1.07%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N3->N24 -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>N3->N24</title>
|
||||
<g id="a_edge35"><a xlink:title="runtime.schedule -> runtime.runqget (0.20s)">
|
||||
<path fill="none" stroke="#b2b1ae" d="M1201.55,-641.9C1174,-618.21 1143.27,-586.44 1125.5,-551 1096.17,-492.5 1095.18,-469.45 1106.5,-405 1108.49,-393.66 1112.19,-381.73 1116.14,-371.04"></path>
|
||||
<polygon fill="#b2b1ae" stroke="#b2b1ae" points="1119.44,-372.21 1119.8,-361.63 1112.92,-369.68 1119.44,-372.21"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge35-label"><a xlink:title="runtime.schedule -> runtime.runqget (0.20s)">
|
||||
<text text-anchor="middle" x="1147.5" y="-490.8" font-family="Times,serif" font-size="14.00"> 0.20s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4 -->
|
||||
<g id="node4" class="node">
|
||||
<title>N4</title>
|
||||
<g id="a_node4"><a xlink:title="runtime.mcall (22.18s)">
|
||||
<polygon fill="#edd9d5" stroke="#b21f00" points="1335.5,-1225 1183.5,-1225 1183.5,-1157 1335.5,-1157 1335.5,-1225"></polygon>
|
||||
<text text-anchor="middle" x="1259.5" y="-1209.8" font-family="Times,serif" font-size="14.00">runtime</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1194.8" font-family="Times,serif" font-size="14.00">mcall</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1179.8" font-family="Times,serif" font-size="14.00">0.41s (0.97%)</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1164.8" font-family="Times,serif" font-size="14.00">of 22.18s (52.56%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N21 -->
|
||||
<g id="node21" class="node">
|
||||
<title>N21</title>
|
||||
<g id="a_node21"><a xlink:title="runtime.gosched_m (21.76s)">
|
||||
<polygon fill="#edd9d5" stroke="#b22000" points="1330.5,-1090 1188.5,-1090 1188.5,-1026 1330.5,-1026 1330.5,-1090"></polygon>
|
||||
<text text-anchor="middle" x="1259.5" y="-1075.6" font-family="Times,serif" font-size="13.00">runtime</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1061.6" font-family="Times,serif" font-size="13.00">gosched_m</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1047.6" font-family="Times,serif" font-size="13.00">0.30s (0.71%)</text>
|
||||
<text text-anchor="middle" x="1259.5" y="-1033.6" font-family="Times,serif" font-size="13.00">of 21.76s (51.56%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N4->N21 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>N4->N21</title>
|
||||
<g id="a_edge1"><a xlink:title="runtime.mcall -> runtime.gosched_m (21.76s)">
|
||||
<path fill="none" stroke="#b22000" stroke-width="3" d="M1259.5,-1156.94C1259.5,-1139.76 1259.5,-1118.58 1259.5,-1100.32"></path>
|
||||
<polygon fill="#b22000" stroke="#b22000" stroke-width="3" points="1263,-1100.24 1259.5,-1090.24 1256,-1100.24 1263,-1100.24"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge1-label"><a xlink:title="runtime.mcall -> runtime.gosched_m (21.76s)">
|
||||
<text text-anchor="middle" x="1286" y="-1127.8" font-family="Times,serif" font-size="14.00"> 21.76s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N5 -->
|
||||
<g id="node5" class="node">
|
||||
<title>N5</title>
|
||||
<g id="a_node5"><a xlink:title="runtime.main (18.94s)">
|
||||
<polygon fill="#eddad5" stroke="#b22600" points="221.5,-1209 121.5,-1209 121.5,-1173 221.5,-1173 221.5,-1209"></polygon>
|
||||
<text text-anchor="middle" x="171.5" y="-1198.1" font-family="Times,serif" font-size="8.00">runtime</text>
|
||||
<text text-anchor="middle" x="171.5" y="-1189.1" font-family="Times,serif" font-size="8.00">main</text>
|
||||
<text text-anchor="middle" x="171.5" y="-1180.1" font-family="Times,serif" font-size="8.00">0 of 18.94s (44.88%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N5->N1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>N5->N1</title>
|
||||
<g id="a_edge3"><a xlink:title="runtime.main -> main.main (18.94s)">
|
||||
<path fill="none" stroke="#b22600" stroke-width="3" d="M171.5,-1172.87C171.5,-1158.4 171.5,-1136.8 171.5,-1116.29"></path>
|
||||
<polygon fill="#b22600" stroke="#b22600" stroke-width="3" points="175,-1116.03 171.5,-1106.03 168,-1116.03 175,-1116.03"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge3-label"><a xlink:title="runtime.main -> main.main (18.94s)">
|
||||
<text text-anchor="middle" x="198" y="-1127.8" font-family="Times,serif" font-size="14.00"> 18.94s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N15 -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>N6->N15</title>
|
||||
<g id="a_edge28"><a xlink:title="runtime.findrunnable -> runtime.checkTimers (1.13s)">
|
||||
<path fill="none" stroke="#b2aa9a" d="M1193.85,-454.49C1184.06,-448.87 1174.05,-443.22 1164.5,-438 1120.72,-414.07 1108.14,-411.18 1064.5,-387 1060.58,-384.83 1056.59,-382.57 1052.56,-380.27"></path>
|
||||
<polygon fill="#b2aa9a" stroke="#b2aa9a" points="1054.15,-377.15 1043.74,-375.18 1050.65,-383.21 1054.15,-377.15"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge28-label"><a xlink:title="runtime.findrunnable -> runtime.checkTimers (1.13s)">
|
||||
<text text-anchor="middle" x="1150.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 1.13s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N16 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>N6->N16</title>
|
||||
<g id="a_edge24"><a xlink:title="runtime.findrunnable -> runtime.unlock (1.68s)">
|
||||
<path fill="none" stroke="#b2a48e" d="M1282.11,-454.25C1293.74,-437.04 1309.31,-417.87 1327.5,-405 1348.49,-390.14 1360.22,-399.85 1382.5,-387 1391.56,-381.78 1400.44,-374.94 1408.39,-367.98"></path>
|
||||
<polygon fill="#b2a48e" stroke="#b2a48e" points="1410.98,-370.35 1416.01,-361.03 1406.26,-365.18 1410.98,-370.35"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge24-label"><a xlink:title="runtime.findrunnable -> runtime.unlock (1.68s)">
|
||||
<text text-anchor="middle" x="1349.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 1.68s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N19 -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>N6->N19</title>
|
||||
<g id="a_edge29"><a xlink:title="runtime.findrunnable -> runtime.lock (1.01s)">
|
||||
<path fill="none" stroke="#b2ab9d" d="M1340.55,-461.43C1387.4,-441.86 1446.9,-415.23 1497.5,-387 1512.39,-378.69 1528.1,-368.29 1541.28,-359.05"></path>
|
||||
<polygon fill="#b2ab9d" stroke="#b2ab9d" points="1543.41,-361.82 1549.53,-353.18 1539.35,-356.12 1543.41,-361.82"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge29-label"><a xlink:title="runtime.findrunnable -> runtime.lock (1.01s)">
|
||||
<text text-anchor="middle" x="1481.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 1.01s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N20 -->
|
||||
<g id="node20" class="node">
|
||||
<title>N20</title>
|
||||
<g id="a_node20"><a xlink:title="runtime.globrunqget (1.39s)">
|
||||
<polygon fill="#edebe9" stroke="#b2a795" points="1373,-379 1208,-379 1208,-291 1373,-291 1373,-379"></polygon>
|
||||
<text text-anchor="middle" x="1290.5" y="-360.6" font-family="Times,serif" font-size="18.00">runtime</text>
|
||||
<text text-anchor="middle" x="1290.5" y="-340.6" font-family="Times,serif" font-size="18.00">globrunqget</text>
|
||||
<text text-anchor="middle" x="1290.5" y="-320.6" font-family="Times,serif" font-size="18.00">1.34s (3.18%)</text>
|
||||
<text text-anchor="middle" x="1290.5" y="-300.6" font-family="Times,serif" font-size="18.00">of 1.39s (3.29%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N20 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>N6->N20</title>
|
||||
<g id="a_edge25"><a xlink:title="runtime.findrunnable -> runtime.globrunqget (1.38s)">
|
||||
<path fill="none" stroke="#b2a895" d="M1256.62,-454.36C1256.34,-438.84 1257.09,-420.93 1260.5,-405 1261.64,-399.65 1263.22,-394.21 1265.05,-388.84"></path>
|
||||
<polygon fill="#b2a895" stroke="#b2a895" points="1268.39,-389.89 1268.58,-379.3 1261.82,-387.46 1268.39,-389.89"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge25-label"><a xlink:title="runtime.findrunnable -> runtime.globrunqget (1.38s)">
|
||||
<text text-anchor="middle" x="1282.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 1.38s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N6->N24 -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>N6->N24</title>
|
||||
<g id="a_edge32"><a xlink:title="runtime.findrunnable -> runtime.runqget (0.25s)">
|
||||
<path fill="none" stroke="#b2b1ad" d="M1227.53,-454.16C1206.37,-428.13 1178.93,-394.36 1158.8,-369.59"></path>
|
||||
<polygon fill="#b2b1ad" stroke="#b2b1ad" points="1161.29,-367.11 1152.27,-361.56 1155.86,-371.53 1161.29,-367.11"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge32-label"><a xlink:title="runtime.findrunnable -> runtime.runqget (0.25s)">
|
||||
<text text-anchor="middle" x="1221.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 0.25s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N10 -->
|
||||
<g id="node10" class="node">
|
||||
<title>N10</title>
|
||||
<g id="a_node10"><a xlink:title="runtime.nanotime (2.97s)">
|
||||
<polygon fill="#ede9e4" stroke="#b29673" points="864,-217 693,-217 693,-137 864,-137 864,-217"></polygon>
|
||||
<text text-anchor="middle" x="778.5" y="-195.4" font-family="Times,serif" font-size="22.00">runtime</text>
|
||||
<text text-anchor="middle" x="778.5" y="-171.4" font-family="Times,serif" font-size="22.00">nanotime</text>
|
||||
<text text-anchor="middle" x="778.5" y="-147.4" font-family="Times,serif" font-size="22.00">2.97s (7.04%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N7->N10 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>N7->N10</title>
|
||||
<g id="a_edge22"><a xlink:title="runtime.casgstatus -> runtime.nanotime (1.83s)">
|
||||
<path fill="none" stroke="#b2a38b" d="M778.5,-282.92C778.5,-265.09 778.5,-245.13 778.5,-227.44"></path>
|
||||
<polygon fill="#b2a38b" stroke="#b2a38b" points="782,-227.31 778.5,-217.32 775,-227.32 782,-227.31"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge22-label"><a xlink:title="runtime.casgstatus -> runtime.nanotime (1.83s)">
|
||||
<text text-anchor="middle" x="806" y="-253.8" font-family="Times,serif" font-size="14.00"> 1.83s</text>
|
||||
<text text-anchor="middle" x="806" y="-238.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N28 -->
|
||||
<g id="node28" class="node">
|
||||
<title>N28</title>
|
||||
<g id="a_node28"><a xlink:title="runtime.(*timeHistogram).record (0.22s)">
|
||||
<polygon fill="#ededec" stroke="#b2b1ad" points="674.5,-207 552.5,-207 552.5,-147 674.5,-147 674.5,-207"></polygon>
|
||||
<text text-anchor="middle" x="613.5" y="-193.4" font-family="Times,serif" font-size="12.00">runtime</text>
|
||||
<text text-anchor="middle" x="613.5" y="-180.4" font-family="Times,serif" font-size="12.00">(*timeHistogram)</text>
|
||||
<text text-anchor="middle" x="613.5" y="-167.4" font-family="Times,serif" font-size="12.00">record</text>
|
||||
<text text-anchor="middle" x="613.5" y="-154.4" font-family="Times,serif" font-size="12.00">0.22s (0.52%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N7->N28 -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>N7->N28</title>
|
||||
<g id="a_edge34"><a xlink:title="runtime.casgstatus -> runtime.(*timeHistogram).record (0.22s)">
|
||||
<path fill="none" stroke="#b2b1ad" d="M724.47,-282.92C700.76,-260.5 673.48,-234.71 651.9,-214.3"></path>
|
||||
<polygon fill="#b2b1ad" stroke="#b2b1ad" points="654.19,-211.65 644.52,-207.33 649.38,-216.74 654.19,-211.65"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge34-label"><a xlink:title="runtime.casgstatus -> runtime.(*timeHistogram).record (0.22s)">
|
||||
<text text-anchor="middle" x="729" y="-253.8" font-family="Times,serif" font-size="14.00"> 0.22s</text>
|
||||
<text text-anchor="middle" x="729" y="-238.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N12 -->
|
||||
<g id="node12" class="node">
|
||||
<title>N12</title>
|
||||
<g id="a_node12"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry (4.56s)">
|
||||
<polygon fill="#ede6e0" stroke="#b28152" points="215.5,-750 1.5,-750 1.5,-622 215.5,-622 215.5,-750"></polygon>
|
||||
<text text-anchor="middle" x="108.5" y="-728.4" font-family="Times,serif" font-size="22.00">queue</text>
|
||||
<text text-anchor="middle" x="108.5" y="-704.4" font-family="Times,serif" font-size="22.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="108.5" y="-680.4" font-family="Times,serif" font-size="22.00">_getSQEntry</text>
|
||||
<text text-anchor="middle" x="108.5" y="-656.4" font-family="Times,serif" font-size="22.00">2.83s (6.71%)</text>
|
||||
<text text-anchor="middle" x="108.5" y="-632.4" font-family="Times,serif" font-size="22.00">of 4.56s (10.81%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N8->N12 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>N8->N12</title>
|
||||
<g id="a_edge10"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry -> github.com/ii64/gouring/queue.(*Queue)._getSQEntry (4.56s)">
|
||||
<path fill="none" stroke="#b28152" d="M148.58,-805.96C143.53,-790.97 138.16,-775.03 133.05,-759.86"></path>
|
||||
<polygon fill="#b28152" stroke="#b28152" points="136.24,-758.37 129.73,-750.02 129.61,-760.61 136.24,-758.37"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge10-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetSQEntry -> github.com/ii64/gouring/queue.(*Queue)._getSQEntry (4.56s)">
|
||||
<text text-anchor="middle" x="164.5" y="-776.8" font-family="Times,serif" font-size="14.00"> 4.56s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N9 -->
|
||||
<g id="node9" class="node">
|
||||
<title>N9</title>
|
||||
<g id="a_node9"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.99s)">
|
||||
<polygon fill="#ede3dc" stroke="#b26b33" points="461,-755 234,-755 234,-617 461,-617 461,-755"></polygon>
|
||||
<text text-anchor="middle" x="347.5" y="-731.8" font-family="Times,serif" font-size="24.00">queue</text>
|
||||
<text text-anchor="middle" x="347.5" y="-705.8" font-family="Times,serif" font-size="24.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="347.5" y="-679.8" font-family="Times,serif" font-size="24.00">GetCQEntryWait</text>
|
||||
<text text-anchor="middle" x="347.5" y="-653.8" font-family="Times,serif" font-size="24.00">3.83s (9.08%)</text>
|
||||
<text text-anchor="middle" x="347.5" y="-627.8" font-family="Times,serif" font-size="24.00">of 5.99s (14.19%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N23 -->
|
||||
<g id="node23" class="node">
|
||||
<title>N23</title>
|
||||
<g id="a_node23"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).cqPeek (1.16s)">
|
||||
<polygon fill="#edece9" stroke="#b2aa99" points="301.5,-536.5 167.5,-536.5 167.5,-452.5 301.5,-452.5 301.5,-536.5"></polygon>
|
||||
<text text-anchor="middle" x="234.5" y="-518.9" font-family="Times,serif" font-size="17.00">queue</text>
|
||||
<text text-anchor="middle" x="234.5" y="-499.9" font-family="Times,serif" font-size="17.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="234.5" y="-480.9" font-family="Times,serif" font-size="17.00">cqPeek</text>
|
||||
<text text-anchor="middle" x="234.5" y="-461.9" font-family="Times,serif" font-size="17.00">1.16s (2.75%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N9->N23 -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>N9->N23</title>
|
||||
<g id="a_edge26"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqPeek (1.16s)">
|
||||
<path fill="none" stroke="#b2aa99" d="M306.86,-616.85C292.79,-593.26 277.3,-567.27 264.26,-545.42"></path>
|
||||
<polygon fill="#b2aa99" stroke="#b2aa99" points="267.16,-543.43 259.03,-536.63 261.14,-547.02 267.16,-543.43"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge26-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqPeek (1.16s)">
|
||||
<text text-anchor="middle" x="322" y="-587.8" font-family="Times,serif" font-size="14.00"> 1.16s</text>
|
||||
<text text-anchor="middle" x="322" y="-572.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N25 -->
|
||||
<g id="node25" class="node">
|
||||
<title>N25</title>
|
||||
<g id="a_node25"><a xlink:title="github.com/ii64/gouring.SQRing.IsCQOverflow (0.59s)">
|
||||
<polygon fill="#edeceb" stroke="#b2afa6" points="441.5,-532.5 319.5,-532.5 319.5,-456.5 441.5,-456.5 441.5,-532.5"></polygon>
|
||||
<text text-anchor="middle" x="380.5" y="-516.5" font-family="Times,serif" font-size="15.00">gouring</text>
|
||||
<text text-anchor="middle" x="380.5" y="-499.5" font-family="Times,serif" font-size="15.00">SQRing</text>
|
||||
<text text-anchor="middle" x="380.5" y="-482.5" font-family="Times,serif" font-size="15.00">IsCQOverflow</text>
|
||||
<text text-anchor="middle" x="380.5" y="-465.5" font-family="Times,serif" font-size="15.00">0.59s (1.40%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N9->N25 -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>N9->N25</title>
|
||||
<g id="a_edge31"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring.SQRing.IsCQOverflow (0.59s)">
|
||||
<path fill="none" stroke="#b2afa6" d="M359.37,-616.85C363.66,-592.19 368.41,-564.92 372.32,-542.48"></path>
|
||||
<polygon fill="#b2afa6" stroke="#b2afa6" points="375.78,-542.99 374.05,-532.54 368.89,-541.79 375.78,-542.99"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge31-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring.SQRing.IsCQOverflow (0.59s)">
|
||||
<text text-anchor="middle" x="395" y="-587.8" font-family="Times,serif" font-size="14.00"> 0.59s</text>
|
||||
<text text-anchor="middle" x="395" y="-572.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N27 -->
|
||||
<g id="node27" class="node">
|
||||
<title>N27</title>
|
||||
<g id="a_node27"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.24s)">
|
||||
<polygon fill="#ededec" stroke="#b2b1ad" points="559,-524.5 460,-524.5 460,-464.5 559,-464.5 559,-524.5"></polygon>
|
||||
<text text-anchor="middle" x="509.5" y="-510.9" font-family="Times,serif" font-size="12.00">queue</text>
|
||||
<text text-anchor="middle" x="509.5" y="-497.9" font-family="Times,serif" font-size="12.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="509.5" y="-484.9" font-family="Times,serif" font-size="12.00">cqAdvance</text>
|
||||
<text text-anchor="middle" x="509.5" y="-471.9" font-family="Times,serif" font-size="12.00">0.24s (0.57%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N9->N27 -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>N9->N27</title>
|
||||
<g id="a_edge33"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.24s)">
|
||||
<path fill="none" stroke="#b2b1ad" d="M410.88,-616.84C416.21,-610.85 421.48,-604.85 426.5,-599 444.96,-577.5 464.85,-552.75 480.53,-532.85"></path>
|
||||
<polygon fill="#b2b1ad" stroke="#b2b1ad" points="483.33,-534.95 486.76,-524.92 477.83,-530.63 483.33,-534.95"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge33-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait -> github.com/ii64/gouring/queue.(*Queue).cqAdvance (0.24s)">
|
||||
<text text-anchor="middle" x="478" y="-587.8" font-family="Times,serif" font-size="14.00"> 0.24s</text>
|
||||
<text text-anchor="middle" x="478" y="-572.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N11 -->
|
||||
<g id="node11" class="node">
|
||||
<title>N11</title>
|
||||
<g id="a_node11"><a xlink:title="runtime.unlock2 (3.69s)">
|
||||
<polygon fill="#ede8e2" stroke="#b28c64" points="1530.5,-86 1348.5,-86 1348.5,0 1530.5,0 1530.5,-86"></polygon>
|
||||
<text text-anchor="middle" x="1439.5" y="-62.8" font-family="Times,serif" font-size="24.00">runtime</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-36.8" font-family="Times,serif" font-size="24.00">unlock2</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-10.8" font-family="Times,serif" font-size="24.00">3.69s (8.74%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N18 -->
|
||||
<g id="node18" class="node">
|
||||
<title>N18</title>
|
||||
<g id="a_node18"><a xlink:title="github.com/ii64/gouring.(*SQEntry).Reset (1.73s)">
|
||||
<polygon fill="#edebe8" stroke="#b2a48d" points="149,-540.5 0,-540.5 0,-448.5 149,-448.5 149,-540.5"></polygon>
|
||||
<text text-anchor="middle" x="74.5" y="-521.3" font-family="Times,serif" font-size="19.00">gouring</text>
|
||||
<text text-anchor="middle" x="74.5" y="-500.3" font-family="Times,serif" font-size="19.00">(*SQEntry)</text>
|
||||
<text text-anchor="middle" x="74.5" y="-479.3" font-family="Times,serif" font-size="19.00">Reset</text>
|
||||
<text text-anchor="middle" x="74.5" y="-458.3" font-family="Times,serif" font-size="19.00">1.73s (4.10%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N12->N18 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>N12->N18</title>
|
||||
<g id="a_edge23"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry -> github.com/ii64/gouring.(*SQEntry).Reset (1.73s)">
|
||||
<path fill="none" stroke="#b2a48d" d="M97.18,-621.9C93.04,-598.84 88.4,-572.95 84.39,-550.64"></path>
|
||||
<polygon fill="#b2a48d" stroke="#b2a48d" points="87.81,-549.88 82.6,-540.66 80.92,-551.12 87.81,-549.88"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge23-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue)._getSQEntry -> github.com/ii64/gouring.(*SQEntry).Reset (1.73s)">
|
||||
<text text-anchor="middle" x="115.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 1.73s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N13->N7 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>N13->N7</title>
|
||||
<g id="a_edge16"><a xlink:title="runtime.execute -> runtime.casgstatus (2.41s)">
|
||||
<path fill="none" stroke="#b29c7f" d="M866,-446.24C853.27,-430.2 838.88,-412.08 825.5,-395.22"></path>
|
||||
<polygon fill="#b29c7f" stroke="#b29c7f" points="827.99,-392.72 819.03,-387.06 822.5,-397.07 827.99,-392.72"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge16-label"><a xlink:title="runtime.execute -> runtime.casgstatus (2.41s)">
|
||||
<text text-anchor="middle" x="867.5" y="-408.8" font-family="Times,serif" font-size="14.00"> 2.41s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N14 -->
|
||||
<g id="node14" class="node">
|
||||
<title>N14</title>
|
||||
<g id="a_node14"><a xlink:title="runtime.lock2 (3.08s)">
|
||||
<polygon fill="#ede9e4" stroke="#b29471" points="1720,-83 1549,-83 1549,-3 1720,-3 1720,-83"></polygon>
|
||||
<text text-anchor="middle" x="1634.5" y="-61.4" font-family="Times,serif" font-size="22.00">runtime</text>
|
||||
<text text-anchor="middle" x="1634.5" y="-37.4" font-family="Times,serif" font-size="22.00">lock2</text>
|
||||
<text text-anchor="middle" x="1634.5" y="-13.4" font-family="Times,serif" font-size="22.00">3.08s (7.30%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N15->N10 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>N15->N10</title>
|
||||
<g id="a_edge27"><a xlink:title="runtime.checkTimers -> runtime.nanotime (1.14s)">
|
||||
<path fill="none" stroke="#b2aa9a" d="M929.04,-294.84C901.08,-273.14 866.19,-246.06 837.04,-223.44"></path>
|
||||
<polygon fill="#b2aa9a" stroke="#b2aa9a" points="839.03,-220.55 828.98,-217.18 834.74,-226.08 839.03,-220.55"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge27-label"><a xlink:title="runtime.checkTimers -> runtime.nanotime (1.14s)">
|
||||
<text text-anchor="middle" x="913" y="-253.8" font-family="Times,serif" font-size="14.00"> 1.14s</text>
|
||||
<text text-anchor="middle" x="913" y="-238.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N29 -->
|
||||
<g id="node29" class="node">
|
||||
<title>N29</title>
|
||||
<g id="a_node29"><a xlink:title="runtime.unlockWithRank (3.72s)">
|
||||
<polygon fill="#ede8e2" stroke="#b28c63" points="1489.5,-203 1389.5,-203 1389.5,-151 1489.5,-151 1489.5,-203"></polygon>
|
||||
<text text-anchor="middle" x="1439.5" y="-191" font-family="Times,serif" font-size="10.00">runtime</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-180" font-family="Times,serif" font-size="10.00">unlockWithRank</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-169" font-family="Times,serif" font-size="10.00">0.03s (0.071%)</text>
|
||||
<text text-anchor="middle" x="1439.5" y="-158" font-family="Times,serif" font-size="10.00">of 3.72s (8.82%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N16->N29 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>N16->N29</title>
|
||||
<g id="a_edge11"><a xlink:title="runtime.unlock -> runtime.unlockWithRank (3.72s)">
|
||||
<path fill="none" stroke="#b28c63" d="M1439.5,-308.94C1439.5,-283.01 1439.5,-242.31 1439.5,-213.17"></path>
|
||||
<polygon fill="#b28c63" stroke="#b28c63" points="1443,-213 1439.5,-203 1436,-213 1443,-213"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge11-label"><a xlink:title="runtime.unlock -> runtime.unlockWithRank (3.72s)">
|
||||
<text text-anchor="middle" x="1461.5" y="-246.3" font-family="Times,serif" font-size="14.00"> 3.72s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N17 -->
|
||||
<g id="node17" class="node">
|
||||
<title>N17</title>
|
||||
<g id="a_node17"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).sqFlush (2.04s)">
|
||||
<polygon fill="#edeae7" stroke="#b2a187" points="750,-551 577,-551 577,-438 750,-438 750,-551"></polygon>
|
||||
<text text-anchor="middle" x="663.5" y="-531.8" font-family="Times,serif" font-size="19.00">queue</text>
|
||||
<text text-anchor="middle" x="663.5" y="-510.8" font-family="Times,serif" font-size="19.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="663.5" y="-489.8" font-family="Times,serif" font-size="19.00">sqFlush</text>
|
||||
<text text-anchor="middle" x="663.5" y="-468.8" font-family="Times,serif" font-size="19.00">1.86s (4.41%)</text>
|
||||
<text text-anchor="middle" x="663.5" y="-447.8" font-family="Times,serif" font-size="19.00">of 2.04s (4.83%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N31 -->
|
||||
<g id="node31" class="node">
|
||||
<title>N31</title>
|
||||
<g id="a_node31"><a xlink:title="runtime.lockWithRank (3.09s)">
|
||||
<polygon fill="#ede9e4" stroke="#b29471" points="1641,-201 1548,-201 1548,-153 1641,-153 1641,-201"></polygon>
|
||||
<text text-anchor="middle" x="1594.5" y="-189.8" font-family="Times,serif" font-size="9.00">runtime</text>
|
||||
<text text-anchor="middle" x="1594.5" y="-179.8" font-family="Times,serif" font-size="9.00">lockWithRank</text>
|
||||
<text text-anchor="middle" x="1594.5" y="-169.8" font-family="Times,serif" font-size="9.00">0.01s (0.024%)</text>
|
||||
<text text-anchor="middle" x="1594.5" y="-159.8" font-family="Times,serif" font-size="9.00">of 3.09s (7.32%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N19->N31 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>N19->N31</title>
|
||||
<g id="a_edge13"><a xlink:title="runtime.lock -> runtime.lockWithRank (3.09s)">
|
||||
<path fill="none" stroke="#b29471" d="M1574.94,-316.71C1578.51,-291.41 1585.22,-243.8 1589.78,-211.5"></path>
|
||||
<polygon fill="#b29471" stroke="#b29471" points="1593.3,-211.58 1591.23,-201.19 1586.37,-210.6 1593.3,-211.58"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge13-label"><a xlink:title="runtime.lock -> runtime.lockWithRank (3.09s)">
|
||||
<text text-anchor="middle" x="1613" y="-253.8" font-family="Times,serif" font-size="14.00"> 3.09s</text>
|
||||
<text text-anchor="middle" x="1613" y="-238.8" font-family="Times,serif" font-size="14.00"> (inline)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N21->N2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>N21->N2</title>
|
||||
<g id="a_edge2"><a xlink:title="runtime.gosched_m -> runtime.goschedImpl (21.46s)">
|
||||
<path fill="none" stroke="#b22000" stroke-width="3" d="M1259.5,-1025.88C1259.5,-996.52 1259.5,-952.21 1259.5,-919.38"></path>
|
||||
<polygon fill="#b22000" stroke="#b22000" stroke-width="3" points="1263,-919.16 1259.5,-909.16 1256,-919.16 1263,-919.16"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge2-label"><a xlink:title="runtime.gosched_m -> runtime.goschedImpl (21.46s)">
|
||||
<text text-anchor="middle" x="1286" y="-973.3" font-family="Times,serif" font-size="14.00"> 21.46s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N22 -->
|
||||
<g id="node22" class="node">
|
||||
<title>N22</title>
|
||||
<g id="a_node22"><a xlink:title="runtime.nanotime1 (0.81s)">
|
||||
<polygon fill="#edecea" stroke="#b2ada1" points="1485,-1222 1354,-1222 1354,-1160 1485,-1160 1485,-1222"></polygon>
|
||||
<text text-anchor="middle" x="1419.5" y="-1205.2" font-family="Times,serif" font-size="16.00">runtime</text>
|
||||
<text text-anchor="middle" x="1419.5" y="-1187.2" font-family="Times,serif" font-size="16.00">nanotime1</text>
|
||||
<text text-anchor="middle" x="1419.5" y="-1169.2" font-family="Times,serif" font-size="16.00">0.81s (1.92%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N26 -->
|
||||
<g id="node26" class="node">
|
||||
<title>N26</title>
|
||||
<g id="a_node26"><a xlink:title="gogo (0.26s)">
|
||||
<polygon fill="#edecec" stroke="#b2b1ad" points="1612,-1209 1503,-1209 1503,-1173 1612,-1173 1612,-1209"></polygon>
|
||||
<text text-anchor="middle" x="1557.5" y="-1194.6" font-family="Times,serif" font-size="13.00">gogo</text>
|
||||
<text text-anchor="middle" x="1557.5" y="-1180.6" font-family="Times,serif" font-size="13.00">0.26s (0.62%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N29->N11 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>N29->N11</title>
|
||||
<g id="a_edge12"><a xlink:title="runtime.unlockWithRank -> runtime.unlock2 (3.69s)">
|
||||
<path fill="none" stroke="#b28c64" d="M1439.5,-150.86C1439.5,-135.46 1439.5,-115.17 1439.5,-96.41"></path>
|
||||
<polygon fill="#b28c64" stroke="#b28c64" points="1443,-96.18 1439.5,-86.18 1436,-96.18 1443,-96.18"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge12-label"><a xlink:title="runtime.unlockWithRank -> runtime.unlock2 (3.69s)">
|
||||
<text text-anchor="middle" x="1461.5" y="-107.8" font-family="Times,serif" font-size="14.00"> 3.69s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N30->N9 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>N30->N9</title>
|
||||
<g id="a_edge8"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry -> github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.99s)">
|
||||
<path fill="none" stroke="#b26b33" d="M347.5,-845.6C347.5,-824.31 347.5,-794.07 347.5,-765.7"></path>
|
||||
<polygon fill="#b26b33" stroke="#b26b33" points="351,-765.35 347.5,-755.35 344,-765.35 351,-765.35"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge8-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).GetCQEntry -> github.com/ii64/gouring/queue.(*Queue).GetCQEntryWait (5.99s)">
|
||||
<text text-anchor="middle" x="369.5" y="-776.8" font-family="Times,serif" font-size="14.00"> 5.99s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N31->N14 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>N31->N14</title>
|
||||
<g id="a_edge14"><a xlink:title="runtime.lockWithRank -> runtime.lock2 (3.08s)">
|
||||
<path fill="none" stroke="#b29471" d="M1601.56,-152.7C1606.57,-136.17 1613.48,-113.36 1619.68,-92.91"></path>
|
||||
<polygon fill="#b29471" stroke="#b29471" points="1623.1,-93.68 1622.65,-83.09 1616.4,-91.65 1623.1,-93.68"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge14-label"><a xlink:title="runtime.lockWithRank -> runtime.lock2 (3.08s)">
|
||||
<text text-anchor="middle" x="1637.5" y="-107.8" font-family="Times,serif" font-size="14.00"> 3.08s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N32 -->
|
||||
<g id="node32" class="node">
|
||||
<title>N32</title>
|
||||
<g id="a_node32"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (2.05s)">
|
||||
<polygon fill="#edeae7" stroke="#b2a187" points="680,-715 587,-715 587,-657 680,-657 680,-715"></polygon>
|
||||
<text text-anchor="middle" x="633.5" y="-703.8" font-family="Times,serif" font-size="9.00">queue</text>
|
||||
<text text-anchor="middle" x="633.5" y="-693.8" font-family="Times,serif" font-size="9.00">(*Queue)</text>
|
||||
<text text-anchor="middle" x="633.5" y="-683.8" font-family="Times,serif" font-size="9.00">SubmitAndWait</text>
|
||||
<text text-anchor="middle" x="633.5" y="-673.8" font-family="Times,serif" font-size="9.00">0.01s (0.024%)</text>
|
||||
<text text-anchor="middle" x="633.5" y="-663.8" font-family="Times,serif" font-size="9.00">of 2.05s (4.86%)</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N32->N17 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>N32->N17</title>
|
||||
<g id="a_edge21"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring/queue.(*Queue).sqFlush (2.04s)">
|
||||
<path fill="none" stroke="#b2a187" d="M637.99,-656.63C641.98,-631.46 647.95,-593.73 653.11,-561.11"></path>
|
||||
<polygon fill="#b2a187" stroke="#b2a187" points="656.58,-561.59 654.69,-551.16 649.67,-560.49 656.58,-561.59"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge21-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).SubmitAndWait -> github.com/ii64/gouring/queue.(*Queue).sqFlush (2.04s)">
|
||||
<text text-anchor="middle" x="673.5" y="-580.3" font-family="Times,serif" font-size="14.00"> 2.04s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- N33->N32 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>N33->N32</title>
|
||||
<g id="a_edge19"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit -> github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (2.05s)">
|
||||
<path fill="none" stroke="#b2a187" d="M551.87,-852.91C567.17,-821.83 595.99,-763.23 614.97,-724.66"></path>
|
||||
<polygon fill="#b2a187" stroke="#b2a187" points="618.3,-725.83 619.57,-715.31 612.02,-722.74 618.3,-725.83"></polygon>
|
||||
</a>
|
||||
</g>
|
||||
<g id="a_edge19-label"><a xlink:title="github.com/ii64/gouring/queue.(*Queue).Submit -> github.com/ii64/gouring/queue.(*Queue).SubmitAndWait (2.05s)">
|
||||
<text text-anchor="middle" x="612.5" y="-776.8" font-family="Times,serif" font-size="14.00"> 2.05s</text>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After (image error) Size: 46 KiB |
25
core.go
25
core.go
|
@ -6,11 +6,17 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
func New(entries uint, params *IOUringParams) (*Ring, error) {
|
||||
func New(entries uint, params *IOUringParams, options ...Option) (*Ring, error) {
|
||||
r := &Ring{}
|
||||
if params != nil {
|
||||
r.params = *params
|
||||
r.params = *params // copy
|
||||
}
|
||||
|
||||
// option reconfiguring
|
||||
for _, opt := range options {
|
||||
opt(&r.params)
|
||||
}
|
||||
|
||||
var err error
|
||||
if r.fd, err = setup(r, entries, &r.params); err != nil {
|
||||
err = errors.Wrap(err, "setup")
|
||||
|
@ -19,6 +25,7 @@ func New(entries uint, params *IOUringParams) (*Ring, error) {
|
|||
return r, nil
|
||||
}
|
||||
|
||||
// Close ring
|
||||
func (r *Ring) Close() (err error) {
|
||||
if err = unsetup(r); err != nil {
|
||||
err = errors.Wrap(err, "close")
|
||||
|
@ -33,6 +40,7 @@ func (r *Ring) Close() (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Register
|
||||
func (r *Ring) Register(opcode UringRegisterOpcode, arg uintptr, nrArg uint) (ret int, err error) {
|
||||
ret, err = register(r, opcode, arg, nrArg)
|
||||
if err != nil {
|
||||
|
@ -42,6 +50,7 @@ func (r *Ring) Register(opcode UringRegisterOpcode, arg uintptr, nrArg uint) (re
|
|||
return
|
||||
}
|
||||
|
||||
// Enter
|
||||
func (r *Ring) Enter(toSubmit, minComplete uint, flags UringEnterFlag, sig *Sigset_t) (ret int, err error) {
|
||||
ret, err = enter(r, toSubmit, minComplete, flags, sig)
|
||||
if err != nil {
|
||||
|
@ -53,18 +62,22 @@ func (r *Ring) Enter(toSubmit, minComplete uint, flags UringEnterFlag, sig *Sigs
|
|||
|
||||
//
|
||||
|
||||
// Params
|
||||
func (r *Ring) Params() *IOUringParams {
|
||||
return &r.params
|
||||
}
|
||||
|
||||
// Fd of io uring
|
||||
func (r *Ring) Fd() int {
|
||||
return r.fd
|
||||
}
|
||||
|
||||
func (r *Ring) SQ() *SQRing {
|
||||
return &r.sq
|
||||
// SQ Ring
|
||||
func (r *Ring) SQ() SQRing {
|
||||
return r.sq
|
||||
}
|
||||
|
||||
func (r *Ring) CQ() *CQRing {
|
||||
return &r.cq
|
||||
// CQ Ring
|
||||
func (r *Ring) CQ() CQRing {
|
||||
return r.cq
|
||||
}
|
||||
|
|
21
core_test.go
21
core_test.go
|
@ -23,10 +23,11 @@ func TestCore(t *testing.T) {
|
|||
sq := ring.SQ()
|
||||
n := 5
|
||||
for i := 0; i < n; i++ {
|
||||
sqTail := *sq.Tail()
|
||||
sqIdx := sqTail & *sq.RingMask()
|
||||
sqTail := *sq.Tail
|
||||
sqIdx := sqTail & *sq.RingMask
|
||||
|
||||
sqe := sq.Get(sqIdx)
|
||||
sqe := &sq.Event[sqIdx]
|
||||
sqe.Reset()
|
||||
|
||||
m := mkdata(i)
|
||||
|
||||
|
@ -37,8 +38,8 @@ func TestCore(t *testing.T) {
|
|||
sqe.SetOffset(0)
|
||||
sqe.SetAddr(&m[0])
|
||||
|
||||
*sq.Array().Get(sqIdx) = *sq.Head() & *sq.RingMask()
|
||||
*sq.Tail()++
|
||||
*sq.Array.Get(sqIdx) = *sq.Head & *sq.RingMask
|
||||
*sq.Tail++
|
||||
|
||||
done, err := ring.Enter(1, 1, IORING_ENTER_GETEVENTS, nil)
|
||||
assert.NoError(t, err, "ring enter")
|
||||
|
@ -47,13 +48,13 @@ func TestCore(t *testing.T) {
|
|||
|
||||
// get cq
|
||||
cq := ring.CQ()
|
||||
for i := 0; i < int(*cq.Tail()); i++ {
|
||||
cqHead := *cq.Head()
|
||||
cqIdx := cqHead & *cq.RingMask()
|
||||
for i := 0; i < int(*cq.Tail); i++ {
|
||||
cqHead := *cq.Head
|
||||
cqIdx := cqHead & *cq.RingMask
|
||||
|
||||
cqe := cq.Get(cqIdx)
|
||||
cqe := cq.Event[cqIdx]
|
||||
|
||||
*cq.Head()++
|
||||
*cq.Head++
|
||||
t.Logf("CQE %+#v", cqe)
|
||||
}
|
||||
|
||||
|
|
45
mem_util.go
45
mem_util.go
|
@ -1,6 +1,7 @@
|
|||
package gouring
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
|
@ -18,6 +19,7 @@ func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int6
|
|||
//go:linkname munmap syscall.munmap
|
||||
func munmap(addr uintptr, length uintptr) (err error)
|
||||
|
||||
// io uring setup
|
||||
func setup(r *Ring, entries uint, parmas *IOUringParams) (ringFd int, err error) {
|
||||
var sq = &r.sq
|
||||
var cq = &r.cq
|
||||
|
@ -68,15 +70,14 @@ func setup(r *Ring, entries uint, parmas *IOUringParams) (ringFd int, err error)
|
|||
r.sqRingPtr = sqRingPtr
|
||||
r.cqRingPtr = cqRingPtr
|
||||
|
||||
//
|
||||
// SQ
|
||||
|
||||
// address Go's ring with base+offset allocated
|
||||
sq.head = sqRingPtr + uintptr(p.SQOff.Head)
|
||||
sq.tail = sqRingPtr + uintptr(p.SQOff.Tail)
|
||||
sq.ringMask = sqRingPtr + uintptr(p.SQOff.RingMask)
|
||||
sq.ringEntries = sqRingPtr + uintptr(p.SQOff.RingEntries)
|
||||
sq.flags = sqRingPtr + uintptr(p.SQOff.Flags)
|
||||
sq.array = uint32Array(sqRingPtr + uintptr(p.SQOff.Array))
|
||||
sq.Head = (*uint32)(unsafe.Pointer(sqRingPtr + uintptr(p.SQOff.Head)))
|
||||
sq.Tail = (*uint32)(unsafe.Pointer(sqRingPtr + uintptr(p.SQOff.Tail)))
|
||||
sq.RingMask = (*uint32)(unsafe.Pointer(sqRingPtr + uintptr(p.SQOff.RingMask)))
|
||||
sq.RingEntries = (*uint32)(unsafe.Pointer(sqRingPtr + uintptr(p.SQOff.RingEntries)))
|
||||
sq.Flags = (*uint32)(unsafe.Pointer(sqRingPtr + uintptr(p.SQOff.Flags)))
|
||||
sq.Array = uint32Array(sqRingPtr + uintptr(p.SQOff.Array)) // non fixed array size, controlled by ring mask
|
||||
r.sqesPtr, err = mmap(0, uintptr(p.SQEntries*uint32(_sz_sqe)),
|
||||
syscall.PROT_READ|syscall.PROT_WRITE,
|
||||
syscall.MAP_SHARED|syscall.MAP_POPULATE,
|
||||
|
@ -85,19 +86,31 @@ func setup(r *Ring, entries uint, parmas *IOUringParams) (ringFd int, err error)
|
|||
err = errors.Wrap(err, "mmap sqes")
|
||||
return
|
||||
}
|
||||
sq.sqes = sqeArray(r.sqesPtr)
|
||||
|
||||
//
|
||||
sq.Event = *(*[]SQEntry)(unsafe.Pointer(&reflect.SliceHeader{
|
||||
Data: r.sqesPtr,
|
||||
Len: int(p.SQEntries),
|
||||
Cap: int(p.SQEntries),
|
||||
}))
|
||||
|
||||
cq.head = cqRingPtr + uintptr(p.CQOff.Head)
|
||||
cq.tail = cqRingPtr + uintptr(p.CQOff.Tail)
|
||||
cq.ringMask = cqRingPtr + uintptr(p.CQOff.RingMask)
|
||||
cq.ringEntries = cqRingPtr + uintptr(p.CQOff.RingEntries)
|
||||
cq.cqes = cqeArray(cqRingPtr + uintptr(p.CQOff.CQEs))
|
||||
// CQ
|
||||
|
||||
cq.Head = (*uint32)(unsafe.Pointer(cqRingPtr + uintptr(p.CQOff.Head)))
|
||||
cq.Tail = (*uint32)(unsafe.Pointer(cqRingPtr + uintptr(p.CQOff.Tail)))
|
||||
cq.RingMask = (*uint32)(unsafe.Pointer(cqRingPtr + uintptr(p.CQOff.RingMask)))
|
||||
cq.RingEntries = (*uint32)(unsafe.Pointer(cqRingPtr + uintptr(p.CQOff.RingEntries)))
|
||||
cqesPtr := cqRingPtr + uintptr(p.CQOff.CQEs)
|
||||
|
||||
cq.Event = *(*[]CQEntry)(unsafe.Pointer(&reflect.SliceHeader{
|
||||
Data: cqesPtr,
|
||||
Len: int(p.CQEntries),
|
||||
Cap: int(p.CQEntries),
|
||||
}))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// io uring unsetup
|
||||
func unsetup(r *Ring) (err error) {
|
||||
if r.sqesPtr != 0 {
|
||||
if err = munmap(r.sqesPtr, uintptr(r.params.SQEntries)); err != nil {
|
||||
|
@ -119,6 +132,7 @@ func unsetup(r *Ring) (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// io uring register fd
|
||||
func register(r *Ring, opcode UringRegisterOpcode, arg uintptr, nrArg uint) (ret int, err error) {
|
||||
if ret, err = io_uring_register(r.fd, opcode, arg, nrArg); err != nil {
|
||||
err = errors.Wrap(err, "io_uring_register")
|
||||
|
@ -127,6 +141,7 @@ func register(r *Ring, opcode UringRegisterOpcode, arg uintptr, nrArg uint) (ret
|
|||
return
|
||||
}
|
||||
|
||||
// io uirng enter
|
||||
func enter(r *Ring, toSubmit, minComplete uint, flags UringEnterFlag, sig *Sigset_t) (ret int, err error) {
|
||||
if ret, err = io_uring_enter(r.fd, toSubmit, minComplete, uint(flags), sig); err != nil {
|
||||
err = errors.Wrap(err, "io_uring_enter")
|
||||
|
|
13
options.go
Normal file
13
options.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package gouring
|
||||
|
||||
// Option
|
||||
type Option func(p *IOUringParams)
|
||||
|
||||
// SQThread option
|
||||
func SQThread(cpu, idleMS uint32) Option {
|
||||
return func(p *IOUringParams) {
|
||||
p.SQThreadCPU = cpu
|
||||
p.SQThreadIdle = idleMS
|
||||
p.Flags |= IORING_SETUP_SQPOLL
|
||||
}
|
||||
}
|
1
queue/helper.go
Normal file
1
queue/helper.go
Normal file
|
@ -0,0 +1 @@
|
|||
package queue
|
|
@ -20,8 +20,8 @@ type QueueCQEHandler func(cqe *gouring.CQEntry) (err error)
|
|||
|
||||
type Queue struct {
|
||||
ring *gouring.Ring
|
||||
sq *gouring.SQRing
|
||||
cq *gouring.CQRing
|
||||
sq gouring.SQRing
|
||||
cq gouring.CQRing
|
||||
|
||||
sqeHead uint32
|
||||
sqeTail uint32
|
||||
|
@ -59,11 +59,12 @@ func (q *Queue) precheck() error {
|
|||
|
||||
//
|
||||
|
||||
// SQEntry ptr returned is passed by value
|
||||
func (q *Queue) _getSQEntry() *gouring.SQEntry {
|
||||
head := atomic.LoadUint32(q.sq.Head())
|
||||
head := atomic.LoadUint32(q.sq.Head)
|
||||
next := q.sqeTail + 1
|
||||
if (next - head) <= atomic.LoadUint32(q.sq.RingEntries()) {
|
||||
sqe := q.sq.Get(q.sqeTail & atomic.LoadUint32(q.sq.RingMask()))
|
||||
if (next - head) <= atomic.LoadUint32(q.sq.RingEntries) {
|
||||
sqe := &q.sq.Event[q.sqeTail&(*q.sq.RingMask)]
|
||||
q.sqeTail = next
|
||||
sqe.Reset()
|
||||
return sqe
|
||||
|
@ -77,6 +78,7 @@ func (q *Queue) GetSQEntry() (sqe *gouring.SQEntry) {
|
|||
if sqe != nil {
|
||||
return
|
||||
}
|
||||
|
||||
runtime.Gosched()
|
||||
}
|
||||
}
|
||||
|
@ -86,27 +88,29 @@ func (q *Queue) sqFallback(d uint32) {
|
|||
}
|
||||
|
||||
func (q *Queue) sqFlush() uint32 {
|
||||
khead := atomic.LoadUint32(q.sq.Head)
|
||||
ktail := atomic.LoadUint32(q.sq.Tail)
|
||||
|
||||
// if sq head equals sq tail
|
||||
if q.sqeHead == q.sqeTail {
|
||||
return atomic.LoadUint32(q.sq.Tail()) - atomic.LoadUint32(q.sq.Head())
|
||||
return ktail - khead
|
||||
}
|
||||
|
||||
ktail := atomic.LoadUint32(q.sq.Tail())
|
||||
for toSubmit := q.sqeTail - q.sqeHead; toSubmit > 0; toSubmit-- {
|
||||
*q.sq.Array().Get(ktail & (*q.sq.RingMask())) = q.sqeHead & (*q.sq.RingMask())
|
||||
*q.sq.Array.Get(ktail & (*q.sq.RingMask)) = q.sqeHead & (*q.sq.RingMask)
|
||||
ktail++
|
||||
q.sqeHead++
|
||||
}
|
||||
|
||||
atomic.StoreUint32(q.sq.Tail(), ktail)
|
||||
return ktail - *q.sq.Head()
|
||||
atomic.StoreUint32(q.sq.Tail, ktail)
|
||||
return ktail - khead
|
||||
}
|
||||
|
||||
func (q *Queue) isNeedEnter(flags *uint32) bool {
|
||||
if (q.ring.Params().Features & gouring.IORING_SETUP_SQPOLL) > 0 {
|
||||
if (q.ring.Params().Flags & gouring.IORING_SETUP_SQPOLL) == 0 {
|
||||
return true
|
||||
}
|
||||
if q.sq.IsNeedWakeup() {
|
||||
*flags |= gouring.IORING_SQ_NEED_WAKEUP
|
||||
*flags |= gouring.IORING_ENTER_SQ_WAKEUP
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
@ -125,6 +129,7 @@ func (q *Queue) SubmitAndWait(waitNr uint) (ret int, err error) {
|
|||
|
||||
var flags uint32
|
||||
if !q.isNeedEnter(&flags) || submitted == 0 {
|
||||
ret = int(submitted)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -139,16 +144,16 @@ func (q *Queue) SubmitAndWait(waitNr uint) (ret int, err error) {
|
|||
//
|
||||
|
||||
func (q *Queue) cqPeek() (cqe *gouring.CQEntry) {
|
||||
head := atomic.LoadUint32(q.cq.Head())
|
||||
if head != atomic.LoadUint32(q.cq.Tail()) {
|
||||
cqe = q.cq.Get(head & atomic.LoadUint32(q.cq.RingMask()))
|
||||
khead := atomic.LoadUint32(q.cq.Head)
|
||||
if khead != atomic.LoadUint32(q.cq.Tail) {
|
||||
cqe = &q.cq.Event[khead&atomic.LoadUint32(q.cq.RingMask)]
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (q *Queue) cqAdvance(d uint32) {
|
||||
if d != 0 {
|
||||
atomic.AddUint32(q.cq.Head(), d) // mark readed
|
||||
atomic.AddUint32(q.cq.Head, d) // mark readed
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -162,7 +167,7 @@ func (q *Queue) GetCQEntryWait(wait bool, waitNr uint) (cqe *gouring.CQEntry, er
|
|||
if err = q.precheck(); err != nil {
|
||||
return
|
||||
}
|
||||
var tryPeeks int
|
||||
// var tryPeeks int
|
||||
for {
|
||||
if cqe = q.cqPeek(); cqe != nil {
|
||||
q.cqAdvance(1)
|
||||
|
@ -180,17 +185,17 @@ func (q *Queue) GetCQEntryWait(wait bool, waitNr uint) (cqe *gouring.CQEntry, er
|
|||
}
|
||||
|
||||
if q.sq.IsCQOverflow() {
|
||||
_, err = q.ring.Enter(0, waitNr, gouring.IORING_ENTER_GETEVENTS, nil)
|
||||
_, err = q.ring.Enter(0, 0, gouring.IORING_ENTER_GETEVENTS, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if tryPeeks++; tryPeeks < 3 {
|
||||
runtime.Gosched()
|
||||
continue
|
||||
}
|
||||
// if tryPeeks++; tryPeeks < 3 {
|
||||
runtime.Gosched()
|
||||
// continue
|
||||
// }
|
||||
// implement interrupt
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
"unsafe"
|
||||
|
||||
"github.com/ii64/gouring"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
@ -25,6 +26,66 @@ func mkdata(i int) []byte {
|
|||
return []byte("queue pls" + strings.Repeat("!", i) + fmt.Sprintf("%d", i) + "\n")
|
||||
}
|
||||
|
||||
func TestQueueSQPoll(t *testing.T) {
|
||||
ring, err := gouring.New(256, &gouring.IOUringParams{
|
||||
Flags: gouring.IORING_SETUP_SQPOLL,
|
||||
SQThreadIdle: 70 * 1000,
|
||||
})
|
||||
assert.NoError(t, err, "create ring")
|
||||
defer func() {
|
||||
err := ring.Close()
|
||||
assert.NoError(t, err, "close ring")
|
||||
}()
|
||||
|
||||
N := 64 + 64
|
||||
var wg sync.WaitGroup
|
||||
btests := [][]byte{}
|
||||
for i := 0; i < N; i++ {
|
||||
btests = append(btests, mkdata(i))
|
||||
}
|
||||
wg.Add(N)
|
||||
|
||||
// create new queue
|
||||
q := New(ring)
|
||||
defer func() {
|
||||
err := q.Close()
|
||||
assert.NoError(t, err, "close queue")
|
||||
}()
|
||||
|
||||
//
|
||||
|
||||
go func() {
|
||||
for i, b := range btests {
|
||||
sqe := q.GetSQEntry()
|
||||
sqe.UserData = uint64(i)
|
||||
// sqe.Flags = gouring.IOSQE_IO_DRAIN
|
||||
write(sqe, syscall.Stdout, b)
|
||||
if (i+1)%2 == 0 {
|
||||
n, err := q.Submit()
|
||||
assert.NoError(t, err, "queue submit")
|
||||
// assert.Equal(t, 2, n, "submit count mismatch") // may varies due to kernel thread consumng submission queue process time
|
||||
fmt.Printf("submitted %d\n", n)
|
||||
}
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
q.Run(true, func(cqe *gouring.CQEntry) (err error) {
|
||||
defer wg.Done()
|
||||
fmt.Printf("cqe: %+#v\n", cqe)
|
||||
assert.Condition(t, func() (success bool) {
|
||||
return cqe.UserData < uint64(len(btests))
|
||||
}, "userdata is set with the btest index")
|
||||
assert.Conditionf(t, func() (success bool) {
|
||||
return len(btests[cqe.UserData]) == int(cqe.Res)
|
||||
}, "OP_WRITE result mismatch: %+#v", cqe)
|
||||
|
||||
return nil
|
||||
})
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func TestQueue(t *testing.T) {
|
||||
ring, err := gouring.New(256, nil)
|
||||
assert.NoError(t, err, "create ring")
|
||||
|
@ -43,7 +104,13 @@ func TestQueue(t *testing.T) {
|
|||
|
||||
// create new queue
|
||||
q := New(ring)
|
||||
defer q.Close()
|
||||
defer func() {
|
||||
err := q.Close()
|
||||
assert.NoError(t, err, "close queue")
|
||||
}()
|
||||
|
||||
//
|
||||
|
||||
go func() {
|
||||
for i, b := range btests {
|
||||
sqe := q.GetSQEntry()
|
||||
|
@ -53,7 +120,7 @@ func TestQueue(t *testing.T) {
|
|||
if (i+1)%2 == 0 {
|
||||
n, err := q.Submit()
|
||||
assert.NoError(t, err, "queue submit")
|
||||
assert.Equal(t, n, 2, "submit count mismatch")
|
||||
assert.Equal(t, 2, n, "submit count mismatch")
|
||||
fmt.Printf("submitted %d\n", n)
|
||||
}
|
||||
}
|
||||
|
@ -85,7 +152,12 @@ func TestQueuePolling(t *testing.T) {
|
|||
}()
|
||||
|
||||
q := New(ring)
|
||||
defer q.Close()
|
||||
defer func() {
|
||||
err := q.Close()
|
||||
assert.NoError(t, err, "close queue")
|
||||
}()
|
||||
|
||||
// test data
|
||||
|
||||
var tb = []byte("write me on stdout\n")
|
||||
var tu uint64 = 0xfafa
|
||||
|
@ -117,3 +189,71 @@ func TestQueuePolling(t *testing.T) {
|
|||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
var (
|
||||
Entries = 512
|
||||
ring *gouring.Ring
|
||||
q *Queue
|
||||
)
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
ring, err = gouring.New(uint(Entries), nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
q = New(ring)
|
||||
}
|
||||
|
||||
func BenchmarkQueueBatchingNOP(b *testing.B) {
|
||||
var sqe *gouring.SQEntry
|
||||
for j := 0; j < b.N; j++ {
|
||||
for i := 0; i < Entries; i++ {
|
||||
sqe = q.GetSQEntry()
|
||||
sqe.Opcode = gouring.IORING_OP_NOP
|
||||
sqe.UserData = uint64(i)
|
||||
}
|
||||
n, err := q.SubmitAndWait(uint(Entries))
|
||||
assert.NoError(b, err, "submit")
|
||||
assert.Equal(b, Entries, n, "submit result entries")
|
||||
for i := 0; i < Entries; i++ {
|
||||
v := uint64(i)
|
||||
cqe, err := q.GetCQEntry(true)
|
||||
assert.NoError(b, err, "cqe wait error")
|
||||
assert.Equal(b, int32(0), cqe.Res)
|
||||
assert.Equal(b, v, cqe.UserData)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
var (
|
||||
_sqe StructTest
|
||||
_sz_sqe = unsafe.Sizeof(_sqe)
|
||||
_sqe_mm = make([]byte, _sz_sqe)
|
||||
|
||||
m = &StructTest{}
|
||||
)
|
||||
|
||||
type StructTest = gouring.SQEntry
|
||||
|
||||
func BenchmarkSetPtrVal(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
*m = _sqe
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSetPtrValEmpty(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
*m = StructTest{}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSetPtrCpy(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
copy(*(*[]byte)(unsafe.Pointer(m)), _sqe_mm)
|
||||
}
|
||||
}
|
||||
|
|
100
ring.go
100
ring.go
|
@ -20,48 +20,20 @@ type Ring struct {
|
|||
//-- SQ
|
||||
|
||||
type SQRing struct {
|
||||
head uintptr
|
||||
tail uintptr
|
||||
ringMask uintptr
|
||||
ringEntries uintptr
|
||||
flags uintptr
|
||||
array uint32Array
|
||||
sqes sqeArray
|
||||
}
|
||||
|
||||
func (sq SQRing) Get(idx uint32) *SQEntry {
|
||||
if uintptr(idx) >= uintptr(*sq.RingEntries()) {
|
||||
return nil
|
||||
}
|
||||
return sq.sqes.Get(uintptr(idx))
|
||||
}
|
||||
func (sq SQRing) Head() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(sq.head))
|
||||
}
|
||||
func (sq SQRing) Tail() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(sq.tail))
|
||||
}
|
||||
func (sq SQRing) RingMask() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(sq.ringMask))
|
||||
}
|
||||
func (sq SQRing) RingEntries() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(sq.ringEntries))
|
||||
}
|
||||
func (sq SQRing) Flags() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(sq.flags))
|
||||
}
|
||||
func (sq SQRing) Array() uint32Array {
|
||||
return sq.array
|
||||
}
|
||||
func (sq SQRing) Event() sqeArray {
|
||||
return sq.sqes
|
||||
Head *uint32
|
||||
Tail *uint32
|
||||
RingMask *uint32
|
||||
RingEntries *uint32
|
||||
Flags *uint32
|
||||
Array uint32Array
|
||||
Event []SQEntry
|
||||
}
|
||||
|
||||
func (sq SQRing) IsCQOverflow() bool {
|
||||
return atomic.LoadUint32(sq.Flags())&IORING_SQ_CQ_OVERFLOW > 0
|
||||
return atomic.LoadUint32(sq.Flags)&IORING_SQ_CQ_OVERFLOW > 0
|
||||
}
|
||||
func (sq SQRing) IsNeedWakeup() bool {
|
||||
return atomic.LoadUint32(sq.Flags())&IORING_SQ_NEED_WAKEUP > 0
|
||||
return atomic.LoadUint32(sq.Flags)&IORING_SQ_NEED_WAKEUP > 0
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -75,57 +47,13 @@ func (a uint32Array) Set(idx uint32, v uint32) {
|
|||
atomic.StoreUint32(a.Get(idx), v)
|
||||
}
|
||||
|
||||
type sqeArray uintptr
|
||||
|
||||
func (sa sqeArray) Get(idx uintptr) *SQEntry {
|
||||
return (*SQEntry)(unsafe.Pointer(uintptr(sa) + idx*_sz_sqe))
|
||||
}
|
||||
|
||||
func (sa sqeArray) Set(idx uintptr, v SQEntry) {
|
||||
*sa.Get(idx) = v
|
||||
}
|
||||
|
||||
//
|
||||
//-- CQ
|
||||
|
||||
type CQRing struct {
|
||||
head uintptr
|
||||
tail uintptr
|
||||
ringMask uintptr
|
||||
ringEntries uintptr
|
||||
cqes cqeArray
|
||||
}
|
||||
|
||||
func (cq CQRing) Get(idx uint32) *CQEntry {
|
||||
if uintptr(idx) >= uintptr(*cq.RingEntries()) { // avoid lookup overflow
|
||||
return nil
|
||||
}
|
||||
return cq.cqes.Get(uintptr(idx))
|
||||
}
|
||||
func (cq CQRing) Head() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(cq.head))
|
||||
}
|
||||
func (cq CQRing) Tail() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(cq.tail))
|
||||
}
|
||||
func (cq CQRing) RingMask() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(cq.ringMask))
|
||||
}
|
||||
func (cq CQRing) RingEntries() *uint32 {
|
||||
return (*uint32)(unsafe.Pointer(cq.ringEntries))
|
||||
}
|
||||
func (cq CQRing) Event() cqeArray {
|
||||
return cq.cqes
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
type cqeArray uintptr
|
||||
|
||||
func (ca cqeArray) Get(idx uintptr) *CQEntry {
|
||||
return (*CQEntry)(unsafe.Pointer(uintptr(ca) + idx*_sz_cqe))
|
||||
}
|
||||
|
||||
func (ca cqeArray) Set(idx uintptr, v CQEntry) {
|
||||
*ca.Get(idx) = v
|
||||
Head *uint32
|
||||
Tail *uint32
|
||||
RingMask *uint32
|
||||
RingEntries *uint32
|
||||
Event []CQEntry
|
||||
}
|
||||
|
|
|
@ -17,27 +17,79 @@ var (
|
|||
//-- SQEntry
|
||||
|
||||
type SQEntry struct {
|
||||
// type of operation for this sqe
|
||||
Opcode UringOpcode
|
||||
Flags UringSQEFlag
|
||||
|
||||
// IOSQE_ flags
|
||||
Flags UringSQEFlag
|
||||
|
||||
// ioprio for the request
|
||||
Ioprio uint16
|
||||
Fd int32
|
||||
|
||||
off__addr2 uint64 // union { off, addr2 }
|
||||
addr__splice_off_in uint64 // union { addr, splice_off_in }
|
||||
// file descriptor to do IO on
|
||||
Fd int32
|
||||
|
||||
/* union {
|
||||
off, // offset into file
|
||||
addr2;
|
||||
} */
|
||||
off__addr2 uint64
|
||||
|
||||
/* union {
|
||||
addr, // pointer to buffer or iovecs
|
||||
splice_off_in
|
||||
} */
|
||||
addr__splice_off_in uint64
|
||||
|
||||
// buffer size or number iovecs
|
||||
Len uint32
|
||||
|
||||
opcode__flags_events uint32 // union of events and flags for opcode
|
||||
/* union of events and flags for Opcode
|
||||
union {
|
||||
__kernel_rwf_t rw_flags;
|
||||
__u32 fsync_flags;
|
||||
__u16 poll_events; // compatibility
|
||||
__u32 poll32_events; // word-reversed for BE
|
||||
__u32 sync_range_flags;
|
||||
__u32 msg_flags;
|
||||
__u32 timeout_flags;
|
||||
__u32 accept_flags;
|
||||
__u32 cancel_flags;
|
||||
__u32 open_flags;
|
||||
__u32 statx_flags;
|
||||
__u32 fadvise_advice;
|
||||
__u32 splice_flags;
|
||||
__u32 rename_flags;
|
||||
__u32 unlink_flags;
|
||||
__u32 hardlink_flags;
|
||||
__u32 xattr_flags;
|
||||
} */
|
||||
opcode__flags_events uint32
|
||||
|
||||
// data to be passed back at completion time
|
||||
UserData uint64
|
||||
|
||||
buf__index_group uint16 // union {buf_index, buf_group}
|
||||
/* pack this to avoid bogus arm OABI complaints
|
||||
union {
|
||||
// index into fixed buffers, if used
|
||||
__u16 buf_index;
|
||||
// for grouped buffer selection
|
||||
__u16 buf_group;
|
||||
} __attribute__((packed)); */
|
||||
buf__index_group uint16
|
||||
|
||||
// personality to use, if used
|
||||
Personality uint16
|
||||
|
||||
splice_fd_in__file_index int32 // union { __s32 splice_fd_in, __u32 file_index }
|
||||
/* -
|
||||
union {
|
||||
__s32 splice_fd_in;
|
||||
__u32 file_index;
|
||||
} */
|
||||
splice_fd_in__file_index int32
|
||||
|
||||
pad2 [2]uint64
|
||||
addr3 uint64
|
||||
pad2 [1]uint64
|
||||
}
|
||||
|
||||
func (sqe *SQEntry) Offset() *uint64 {
|
||||
|
@ -84,10 +136,17 @@ func (sqe *SQEntry) FileIndex() *uint32 {
|
|||
return (*uint32)(unsafe.Pointer(&sqe.splice_fd_in__file_index))
|
||||
}
|
||||
|
||||
func (sqe *SQEntry) Addr3() *uint64 {
|
||||
return (*uint64)(unsafe.Pointer(&sqe.addr3))
|
||||
}
|
||||
func (sqe *SQEntry) SetAddr3(v interface{}) {
|
||||
*sqe.Addr3() = (uint64)(reflect.ValueOf(v).Pointer())
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
func (sqe *SQEntry) Reset() {
|
||||
*sqe = _sqe
|
||||
*sqe = SQEntry{}
|
||||
}
|
||||
|
||||
//-- CQEntry
|
||||
|
@ -99,5 +158,5 @@ type CQEntry struct {
|
|||
}
|
||||
|
||||
func (cqe *CQEntry) Reset() {
|
||||
*cqe = _cqe
|
||||
*cqe = CQEntry{}
|
||||
}
|
||||
|
|
19
syscall/epoll.go
Normal file
19
syscall/epoll.go
Normal file
|
@ -0,0 +1,19 @@
|
|||
package syscall
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/ii64/gouring"
|
||||
)
|
||||
|
||||
var _ = syscall.EpollCtl
|
||||
|
||||
// EpollCtl
|
||||
func EpollCtl(sqe *gouring.SQEntry, epfd int, op int, fd int, event *syscall.EpollEvent) {
|
||||
sqe.Opcode = gouring.IORING_OP_EPOLL_CTL
|
||||
sqe.Fd = int32(epfd)
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(event)))
|
||||
sqe.Len = uint32(op)
|
||||
*sqe.Offset() = uint64(fd)
|
||||
}
|
11
syscall/helper.go
Normal file
11
syscall/helper.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package syscall
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
_ "unsafe"
|
||||
)
|
||||
|
||||
var _zero uintptr
|
||||
|
||||
//go:linkname anyToSockaddr syscall.anyToSockaddr
|
||||
func anyToSockaddr(rsa *syscall.RawSockaddrAny) (syscall.Sockaddr, error)
|
64
syscall/io.go
Normal file
64
syscall/io.go
Normal file
|
@ -0,0 +1,64 @@
|
|||
package syscall
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/ii64/gouring"
|
||||
)
|
||||
|
||||
var (
|
||||
_ = syscall.Accept
|
||||
|
||||
_ = syscall.Read
|
||||
_ = syscall.Write
|
||||
|
||||
_ = syscall.Close
|
||||
)
|
||||
|
||||
// Accept
|
||||
func Accept(sqe *gouring.SQEntry, lisFd int, raw *syscall.RawSockaddrAny) {
|
||||
sqe.Opcode = gouring.IORING_OP_ACCEPT
|
||||
sqe.Fd = int32(lisFd)
|
||||
var len uintptr = syscall.SizeofSockaddrAny
|
||||
*sqe.Addr2() = uint64(uintptr(unsafe.Pointer(&len)))
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(raw)))
|
||||
}
|
||||
|
||||
// Read
|
||||
func Read(sqe *gouring.SQEntry, fd int, b []byte) {
|
||||
sqe.Opcode = gouring.IORING_OP_READ
|
||||
sqe.Fd = int32(fd)
|
||||
sqe.Len = uint32(len(b))
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(&b[0])))
|
||||
}
|
||||
|
||||
// Readv
|
||||
func Readv(sqe *gouring.SQEntry, fd int, iovs []syscall.Iovec) {
|
||||
sqe.Opcode = gouring.IORING_OP_READV
|
||||
sqe.Fd = int32(fd)
|
||||
sqe.Len = uint32(len(iovs))
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(&iovs[0])))
|
||||
}
|
||||
|
||||
// Write
|
||||
func Write(sqe *gouring.SQEntry, fd int, b []byte) {
|
||||
sqe.Opcode = gouring.IORING_OP_WRITE
|
||||
sqe.Fd = int32(fd)
|
||||
sqe.Len = uint32(len(b))
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(&b[0])))
|
||||
}
|
||||
|
||||
// Writev
|
||||
func Writev(sqe *gouring.SQEntry, fd int, iovs []syscall.Iovec) {
|
||||
sqe.Opcode = gouring.IORING_OP_WRITEV
|
||||
sqe.Fd = int32(fd)
|
||||
sqe.Len = uint32(len(iovs))
|
||||
*sqe.Addr() = uint64(uintptr(unsafe.Pointer(&iovs[0])))
|
||||
}
|
||||
|
||||
// Close
|
||||
func Close(sqe *gouring.SQEntry, fd int) {
|
||||
sqe.Opcode = gouring.IORING_OP_CLOSE
|
||||
sqe.Fd = int32(fd)
|
||||
}
|
166
syscall/io_test.go
Normal file
166
syscall/io_test.go
Normal file
|
@ -0,0 +1,166 @@
|
|||
package syscall
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"syscall"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/ii64/gouring"
|
||||
"github.com/ii64/gouring/queue"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func initRing(t *testing.T) (ring *gouring.Ring, q *queue.Queue, cq chan *gouring.CQEntry) {
|
||||
ring, err := gouring.New(128, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
q = queue.New(ring)
|
||||
|
||||
cq = make(chan *gouring.CQEntry)
|
||||
|
||||
go q.RunPoll(true, 1, func(cqe *gouring.CQEntry) (err error) {
|
||||
fmt.Printf("got cqe: %+#v\n", cqe)
|
||||
cq <- cqe
|
||||
return nil
|
||||
})
|
||||
|
||||
go func() {
|
||||
<-time.After(5 * time.Second)
|
||||
t.Logf("timeout")
|
||||
t.Fail()
|
||||
}()
|
||||
return
|
||||
}
|
||||
|
||||
// func TestAccept(t *testing.T) {
|
||||
// sqe := q.GetSQEntry()
|
||||
// }
|
||||
|
||||
func TestRead(t *testing.T) {
|
||||
ring, q, cq := initRing(t)
|
||||
defer q.Close()
|
||||
defer ring.Close()
|
||||
|
||||
var f *os.File
|
||||
var err error
|
||||
f, err = os.Open("/dev/urandom")
|
||||
assert.NoError(t, err, "urandom")
|
||||
fd := f.Fd()
|
||||
defer f.Close()
|
||||
|
||||
b := make([]byte, 25)
|
||||
ud := uint64(gouring.IORING_OP_READ)
|
||||
sqe := q.GetSQEntry()
|
||||
Read(sqe, int(fd), b)
|
||||
sqe.UserData = ud
|
||||
|
||||
ret, err := q.Submit()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, ret, "mismatch submit return value")
|
||||
|
||||
cqe := <-cq
|
||||
assert.Equal(t, ud, cqe.UserData)
|
||||
assert.Equal(t, len(b), int(cqe.Res))
|
||||
}
|
||||
|
||||
func TestReadv(t *testing.T) {
|
||||
ring, q, cq := initRing(t)
|
||||
defer q.Close()
|
||||
defer ring.Close()
|
||||
|
||||
var f *os.File
|
||||
var err error
|
||||
f, err = os.Open("/dev/urandom")
|
||||
assert.NoError(t, err, "urandom")
|
||||
fd := f.Fd()
|
||||
defer f.Close()
|
||||
|
||||
bs := [][]byte{}
|
||||
bN := 25
|
||||
iovs := []syscall.Iovec{}
|
||||
iovN := 5
|
||||
for i := 0; i < iovN; i++ {
|
||||
b := make([]byte, bN)
|
||||
bs = append(bs, b)
|
||||
iovs = append(iovs, syscall.Iovec{
|
||||
Base: &b[0],
|
||||
Len: uint64(len(b)),
|
||||
})
|
||||
}
|
||||
|
||||
ud := uint64(gouring.IORING_OP_READV)
|
||||
sqe := q.GetSQEntry()
|
||||
Readv(sqe, int(fd), iovs)
|
||||
sqe.UserData = ud
|
||||
|
||||
ret, err := q.Submit()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, ret, "mismatch submit return value")
|
||||
|
||||
cqe := <-cq
|
||||
assert.Equal(t, ud, cqe.UserData)
|
||||
assert.Equal(t, bN*iovN, int(cqe.Res))
|
||||
|
||||
eb := make([]byte, bN)
|
||||
for i := 0; i < iovN; i++ {
|
||||
if bytes.Compare(bs[i], eb) == 0 {
|
||||
assert.NotEqual(t, eb, bs[i], "read urandom")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWrite(t *testing.T) {
|
||||
ring, q, cq := initRing(t)
|
||||
defer q.Close()
|
||||
defer ring.Close()
|
||||
|
||||
wr := "hello"
|
||||
ud := uint64(gouring.IORING_OP_WRITE)
|
||||
sqe := q.GetSQEntry()
|
||||
Write(sqe, syscall.Stdout, []byte(wr))
|
||||
sqe.UserData = ud
|
||||
|
||||
ret, err := q.Submit()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, ret, "mismatch submit return value")
|
||||
|
||||
cqe := <-cq
|
||||
assert.Equal(t, ud, cqe.UserData)
|
||||
assert.Equal(t, len(wr), int(cqe.Res))
|
||||
}
|
||||
|
||||
func TestWritev(t *testing.T) {
|
||||
ring, q, cq := initRing(t)
|
||||
defer q.Close()
|
||||
defer ring.Close()
|
||||
|
||||
wr := "hello\n"
|
||||
bs := [][]byte{}
|
||||
iovs := []syscall.Iovec{}
|
||||
iovN := 5
|
||||
for i := 0; i < iovN; i++ {
|
||||
b := []byte(wr)
|
||||
bs = append(bs, b)
|
||||
iovs = append(iovs, syscall.Iovec{
|
||||
Base: &b[0],
|
||||
Len: uint64(len(b)),
|
||||
})
|
||||
}
|
||||
|
||||
ud := uint64(gouring.IORING_OP_WRITEV)
|
||||
sqe := q.GetSQEntry()
|
||||
Writev(sqe, syscall.Stdout, iovs)
|
||||
sqe.UserData = ud
|
||||
|
||||
ret, err := q.Submit()
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 1, ret, "mismatch submit retrun value")
|
||||
|
||||
cqe := <-cq
|
||||
assert.Equal(t, ud, cqe.UserData)
|
||||
assert.Equal(t, len(wr)*iovN, int(cqe.Res))
|
||||
}
|
25
syscall/mem.go
Normal file
25
syscall/mem.go
Normal file
|
@ -0,0 +1,25 @@
|
|||
package syscall
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/ii64/gouring"
|
||||
)
|
||||
|
||||
var _ = syscall.Madvise
|
||||
|
||||
// Madvise
|
||||
func Madvise(sqe *gouring.SQEntry, b []byte, advice int) {
|
||||
var ptr unsafe.Pointer
|
||||
if len(b) > 0 {
|
||||
ptr = unsafe.Pointer(&b[0])
|
||||
} else {
|
||||
ptr = unsafe.Pointer(&_zero)
|
||||
}
|
||||
sqe.Opcode = gouring.IORING_OP_MADVISE
|
||||
sqe.Fd = -1
|
||||
*sqe.Addr() = uint64(uintptr(ptr))
|
||||
sqe.Len = uint32(len(b))
|
||||
*sqe.Offset() = 0
|
||||
}
|
21
sysnum.go
21
sysnum.go
|
@ -6,14 +6,14 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
// uring syscall no.
|
||||
|
||||
SYS_IO_URING_SETUP = 425
|
||||
SYS_IO_URING_ENTER = 426
|
||||
SYS_IO_URING_REGISTER = 427
|
||||
)
|
||||
|
||||
//go:linkname errnoErr syscall.errnoErr
|
||||
func errnoErr(e syscall.Errno) error
|
||||
|
||||
// SQOffsets represents submission queue
|
||||
type SQOffsets struct {
|
||||
Head uint32
|
||||
Tail uint32
|
||||
|
@ -26,6 +26,7 @@ type SQOffsets struct {
|
|||
Resv2 uint64
|
||||
}
|
||||
|
||||
// CQOffsets represents completion queue
|
||||
type CQOffsets struct {
|
||||
Head uint32
|
||||
Tail uint32
|
||||
|
@ -38,6 +39,7 @@ type CQOffsets struct {
|
|||
Resv2 uint64
|
||||
}
|
||||
|
||||
// IOUringParams io_uring_setup params
|
||||
type IOUringParams struct {
|
||||
SQEntries uint32 // sq_entries
|
||||
CQEntries uint32 // cq_entries
|
||||
|
@ -54,33 +56,36 @@ type IOUringParams struct {
|
|||
}
|
||||
|
||||
//go:inline
|
||||
func io_uring_setup(entries uint, params *IOUringParams) (fd int, err error) {
|
||||
func io_uring_setup(entries uint, params *IOUringParams) (ret int, err error) {
|
||||
r1, _, e1 := syscall.Syscall(SYS_IO_URING_SETUP, uintptr(entries), uintptr(unsafe.Pointer(params)), 0)
|
||||
fd = int(r1)
|
||||
ret = int(r1)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
err = syscall.Errno(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//go:inline
|
||||
func io_uring_enter(ringFd int, toSubmit uint, minComplete uint, flags uint, sig *Sigset_t) (ret int, err error) {
|
||||
return io_uring_enter2(ringFd, toSubmit, minComplete, flags, sig, NSIG/8)
|
||||
}
|
||||
|
||||
//go:inline
|
||||
func io_uring_enter2(ringFd int, toSubmit uint, minComplete uint, flags uint, sig *Sigset_t, sz int) (ret int, err error) {
|
||||
r1, _, e1 := syscall.Syscall6(SYS_IO_URING_ENTER, uintptr(ringFd), uintptr(toSubmit), uintptr(minComplete), uintptr(flags), uintptr(unsafe.Pointer(sig)), uintptr(sz))
|
||||
ret = int(r1)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
err = syscall.Errno(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
//go:inline
|
||||
func io_uring_register(ringFd int, opcode uint /*const*/, arg uintptr, nrArgs uint) (ret int, err error) {
|
||||
r1, _, e1 := syscall.Syscall6(SYS_IO_URING_REGISTER, uintptr(ringFd), uintptr(opcode), arg, uintptr(nrArgs), 0, 0)
|
||||
ret = int(r1)
|
||||
if e1 != 0 {
|
||||
err = errnoErr(e1)
|
||||
err = syscall.Errno(e1)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue