Compare commits

1 Commits

Author SHA1 Message Date
user 10a8be72e3 chore: preserve current FreeRTOS and C card updates 2026-07-21 19:14:19 +02:00
37 changed files with 2857 additions and 1571 deletions
+25 -1
View File
@@ -76,11 +76,29 @@ stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
## Debugowanie Task 3
Automatyczny start: `heap4_fragmented_checkpoint`.
Automatyczny start: `heap4_reset_checkpoint`. Karta prowadzi po ośmiu
powtarzalnych stanach jednego procesu:
| Event | Symbol | Najważniejszy dowód Hazard3 |
|---|---|---|
| E01 | `heap4_reset_checkpoint` | `free=largest=4080`, 1 blok |
| E02 | `heap4_alloc_a_checkpoint` | A(24), `consumed=48`, `free=4032` |
| E03 | `heap4_alloc_b_checkpoint` | B(40), `consumed=64`, `free=3968` |
| E04 | `heap4_alloc_c_checkpoint` | C(16), `consumed=32`, `free=3936` |
| E05 | `heap4_free_a_checkpoint` | `free=3984`, 2 bloki |
| E06 | `heap4_fragmented_checkpoint` | `free=4016`, 2 bloki, `free>largest` |
| E07 | `heap4_coalesced_checkpoint` | `free=largest=4080`, 1 blok |
| E08 | `task03_debug_checkpoint` | OOM `NULL`, hook=1, asserts=0, PASS=1 |
`BlockLink_t` ma na RV32 8 B, ale port wymaga wyrównania 16 B, dlatego
`xHeapStructSize` wynosi 16 B. To rozróżnienie tłumaczy zużycie 48/64/32 B.
```gdb
p g_fragmented_stats
p g_final_stats
p g_a_consumed
p g_b_consumed
p g_c_consumed
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
p xStart
@@ -91,6 +109,12 @@ b pvPortMalloc
b vPortFree
```
Scalanie sprawdzamy z replay E06: zatrzymujemy się przed `vPortFree(g_b)`,
ustawiamy tymczasowy breakpoint na `prvInsertBlockIntoFreeList` i krokujemy.
Upstream V11.3.0 scala najpierw poprzedni/lewy, a potem następny/prawy blok.
Pełna macierz kroków diagramów jest w
[`doc/hazard3-iteration-plan.md`](doc/hazard3-iteration-plan.md).
W UI: Termdebug po lewej; źródło i listing po prawej; bash pod Neovimem.
`F5` continue, `F9` breakpoint, `F10` next, `F11` step, `Shift-F11`
finish, `F8` stepi, `:StudentStack`, `:StudentMemory`, `:StudentLst`.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB

+18 -13
View File
@@ -8,41 +8,46 @@ skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
title A2 STRUCTURE — RV32 header, split and two-sided coalescing
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
raw sizeof = 8 bytes on RV32
aligned xHeapStructSize = 16
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
02 A: header + 24 byte request
aligned total = 48 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
free = 4032 bytes after A
}
HEADER *-- ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
ALLOC -down-> REM : first-fit + split
class "04 Address-ordered free list" as LIST {
previous < inserted < current
A < B < C+tail
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
class "05 Previous / left neighbour" as LEFT {
previous + previous.size == inserted
merge previous first
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
class "06 Next / right neighbour" as RIGHT {
merged + merged.size == current
merge next second
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
LIST -down-> LEFT : heap_4 tests first
LEFT -down-> RIGHT : then tests next
note right of LIST
Ordering makes both physical
neighbours locally visible.
Address order exposes both physical
neighbours without scanning the arena.
end note
@enduml
+65 -60
View File
@@ -1,63 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2921px" preserveAspectRatio="none" style="width:295px;height:620px;" version="1.1" viewBox="0 0 295 620" width="295.9262px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="202.1522" x="49.1929" y="8.2167">A2 STRUCTURE — in-band metadata and address order</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="54.7579" id="HEADER" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="81.4758" x="29.5926" y="16.4642"/><ellipse cx="39.5849" cy="27.2252" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.5698,29.7593 Q40.3055,29.8914 40.0173,29.9515 Q39.7291,30.0235 39.4048,30.0235 Q38.2758,30.0235 37.6753,29.2789 Q37.0869,28.5343 37.0869,27.1171 Q37.0869,25.6999 37.6753,24.9553 Q38.2758,24.2107 39.4048,24.2107 Q39.7291,24.2107 40.0173,24.2828 Q40.3175,24.3428 40.5698,24.4749 L40.5698,25.7119 Q40.2815,25.4477 40.0053,25.3276 Q39.7411,25.2075 39.4648,25.2075 Q38.8523,25.2075 38.5401,25.6879 Q38.2278,26.1683 38.2278,27.1171 Q38.2278,28.0659 38.5401,28.5463 Q38.8523,29.0267 39.4648,29.0267 Q39.7411,29.0267 40.0053,28.9066 Q40.2815,28.7865 40.5698,28.5223 L40.5698,29.7593 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="48.8086" y="30.2075">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="37.9862" y2="37.9862"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="34.2045" y="49.2775">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="42.2752" x="34.2045" y="59.7463">size : size_t</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="65.073" y2="65.073"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="65.2267" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="128.8701"/><ellipse cx="39.6618" cy="139.631" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.6466,142.1652 Q40.3824,142.2973 40.0942,142.3573 Q39.8059,142.4294 39.4816,142.4294 Q38.3527,142.4294 37.7522,141.6848 Q37.1637,140.9401 37.1637,139.523 Q37.1637,138.1058 37.7522,137.3612 Q38.3527,136.6165 39.4816,136.6165 Q39.8059,136.6165 40.0942,136.6886 Q40.3944,136.7486 40.6466,136.8808 L40.6466,138.1178 Q40.3584,137.8536 40.0821,137.7335 Q39.8179,137.6134 39.5417,137.6134 Q38.9292,137.6134 38.6169,138.0938 Q38.3047,138.5742 38.3047,139.523 Q38.3047,140.4717 38.6169,140.9521 Q38.9292,141.4325 39.5417,141.4325 Q39.8179,141.4325 40.0821,141.3124 Q40.3584,141.1923 40.6466,140.9281 L40.6466,142.1652 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="56.1107" x="52.5749" y="142.6134">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="150.392" y2="150.392"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="161.6833">02 header + 13 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="88.3935" x="17.6787" y="172.1522">aligned total = 32 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="104.535" x="17.6787" y="182.621">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="187.9477" y2="187.9477"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="54.7579" id="REM" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="89.9308" x="25.3651" y="251.7448"/><ellipse cx="35.3574" cy="262.5058" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M36.3422,265.0399 Q36.078,265.172 35.7898,265.232 Q35.5015,265.3041 35.1773,265.3041 Q34.0483,265.3041 33.4478,264.5595 Q32.8593,263.8148 32.8593,262.3977 Q32.8593,260.9805 33.4478,260.2359 Q34.0483,259.4913 35.1773,259.4913 Q35.5015,259.4913 35.7898,259.5633 Q36.09,259.6234 36.3422,259.7555 L36.3422,260.9925 Q36.054,260.7283 35.7778,260.6082 Q35.5135,260.4881 35.2373,260.4881 Q34.6248,260.4881 34.3125,260.9685 Q34.0003,261.4489 34.0003,262.3977 Q34.0003,263.3465 34.3125,263.8269 Q34.6248,264.3073 35.2373,264.3073 Q35.5135,264.3073 35.7778,264.1872 Q36.054,264.0671 36.3422,263.8028 L36.3422,265.0399 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="44.5811" y="265.4881">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="273.2667" y2="273.2667"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="43.8125" x="29.9769" y="284.558">own header</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="29.9769" y="295.0269">size = 224 bytes</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="300.3535" y2="300.3535"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="44.289" id="LIST" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="124.5196" x="8.0707" y="364.1506"/><ellipse cx="18.063" cy="374.9116" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M19.0478,377.4457 Q18.7836,377.5778 18.4954,377.6379 Q18.2071,377.7099 17.8829,377.7099 Q16.7539,377.7099 16.1534,376.9653 Q15.565,376.2207 15.565,374.8035 Q15.565,373.3863 16.1534,372.6417 Q16.7539,371.8971 17.8829,371.8971 Q18.2071,371.8971 18.4954,371.9692 Q18.7956,372.0292 19.0478,372.1613 L19.0478,373.3983 Q18.7596,373.1341 18.4834,373.014 Q18.2192,372.8939 17.9429,372.8939 Q17.3304,372.8939 17.0182,373.3743 Q16.7059,373.8547 16.7059,374.8035 Q16.7059,375.7523 17.0182,376.2327 Q17.3304,376.7131 17.9429,376.7131 Q18.2192,376.7131 18.4834,376.593 Q18.7596,376.4729 19.0478,376.2087 L19.0478,377.4457 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="102.9977" x="27.2867" y="377.8939">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="385.6726" y2="385.6726"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="107.6095" x="12.6826" y="396.9639">previous &lt; inserted &lt; current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="402.2905" y2="402.2905"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="44.289" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="466.0876"/><ellipse cx="33.0899" cy="476.8486" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M34.0748,479.3827 Q33.8105,479.5148 33.5223,479.5748 Q33.2341,479.6469 32.9098,479.6469 Q31.7808,479.6469 31.1803,478.9023 Q30.5919,478.1577 30.5919,476.7405 Q30.5919,475.3233 31.1803,474.5787 Q31.7808,473.8341 32.9098,473.8341 Q33.2341,473.8341 33.5223,473.9061 Q33.8225,473.9662 34.0748,474.0983 L34.0748,475.3353 Q33.7865,475.0711 33.5103,474.951 Q33.2461,474.8309 32.9698,474.8309 Q32.3573,474.8309 32.0451,475.3113 Q31.7328,475.7917 31.7328,476.7405 Q31.7328,477.6893 32.0451,478.1697 Q32.3573,478.6501 32.9698,478.6501 Q33.2461,478.6501 33.5103,478.53 Q33.7865,478.4099 34.0748,478.1457 L34.0748,479.3827 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="44.5427" y="479.8309">05 Right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="487.6095" y2="487.6095"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="498.9008">block + block.size == current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="504.2275" y2="504.2275"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="44.289" id="LEFT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="131.4374" x="4.6118" y="568.0246"/><ellipse cx="34.7809" cy="578.7855" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M35.7658,581.3197 Q35.5015,581.4518 35.2133,581.5118 Q34.9251,581.5839 34.6008,581.5839 Q33.4718,581.5839 32.8713,580.8393 Q32.2829,580.0946 32.2829,578.6775 Q32.2829,577.2603 32.8713,576.5157 Q33.4718,575.771 34.6008,575.771 Q34.9251,575.771 35.2133,575.8431 Q35.5135,575.9032 35.7658,576.0353 L35.7658,577.2723 Q35.4775,577.0081 35.2013,576.888 Q34.9371,576.7679 34.6608,576.7679 Q34.0483,576.7679 33.7361,577.2483 Q33.4238,577.7287 33.4238,578.6775 Q33.4238,579.6262 33.7361,580.1066 Q34.0483,580.587 34.6608,580.587 Q34.9371,580.587 35.2013,580.4669 Q35.4775,580.3468 35.7658,580.0826 L35.7658,581.3197 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="48.2321" y="581.7679">06 Left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="589.5465" y2="589.5465"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="122.2137" x="9.2237" y="600.8378">previous + previous.size == block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="606.1645" y2="606.1645"/><path d="M159.877,371.9831 L159.877,383.2206 L132.7671,386.2952 L159.877,389.3697 L159.877,400.6072 A0,0 0 0 0 159.877,400.6072 L286.7025,400.6072 A0,0 0 0 0 286.7025,400.6072 L286.7025,379.6695 L279.0161,371.9831 L159.877,371.9831 A0,0 0 0 0 159.877,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><path d="M279.0161,371.9831 L279.0161,379.6695 L286.7025,379.6695 L279.0161,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="110.6841" x="164.4889" y="384.043">Ordering makes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="96.0799" x="164.4889" y="394.5119">neighbours locally visible.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.3305,82.6749 C70.3305,97.5173 70.3305,114.3505 70.3305,128.5626 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,72.7056,67.256,77.3174,70.3305,81.9293,73.4051,77.3174,70.3305,72.7056" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="71.0992" y="103.2667">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.3305,194.2813 C70.3305,210.5842 70.3305,230.3382 70.3305,246.6026 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,250.3689,73.4051,243.4512,70.3305,246.5257,67.256,243.4512,70.3305,250.3689" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="71.0992" y="226.1414">split preserves 256</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.3305,306.8178 C70.3305,322.8901 70.3305,343.1975 70.3305,359.1622 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,362.8055,73.4051,355.8878,70.3305,358.9623,67.256,355.8878,70.3305,362.8055" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="63.7971" x="71.0992" y="338.5473">insert by address</text><!--MD5=[6bd3103bbaa36e7d502940b82c286473]
link LIST to RIGHT--><path d="M70.3305,408.6011 C70.3305,423.9508 70.3305,444.681 70.3305,461.0377 " fill="none" id="LIST-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,464.7963,73.4051,457.8786,70.3305,460.9531,67.256,457.8786,70.3305,464.7963" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="30.7456" x="71.0992" y="440.4842">join first</text><!--MD5=[f41c07ebada6943a8deaf240fd528885]
link RIGHT to LEFT--><path d="M70.3305,510.538 C70.3305,525.8878 70.3305,546.618 70.3305,562.9746 " fill="none" id="RIGHT-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,566.7333,73.4051,559.8155,70.3305,562.8901,67.256,559.8155,70.3305,566.7333" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="47.6557" x="71.0992" y="542.4212">then join left</text><!--MD5=[83344144544ae5f259c61315a4ceaf0d]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2694px" preserveAspectRatio="none" style="width:312px;height:620px;" version="1.1" viewBox="0 0 312 620" width="312.6158px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="211.9549" x="52.4571" y="7.5779">A2 STRUCTURE — RV32 header, split and two-sided coalescing</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="69.8104" id="HEADER" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="107.7497" x="16.3042" y="15.1133"/><ellipse cx="40.1935" cy="25.0376" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M41.1017,27.3747 Q40.858,27.4965 40.5922,27.5519 Q40.3264,27.6184 40.0273,27.6184 Q38.9861,27.6184 38.4323,26.9316 Q37.8896,26.2449 37.8896,24.9379 Q37.8896,23.6309 38.4323,22.9442 Q38.9861,22.2575 40.0273,22.2575 Q40.3264,22.2575 40.5922,22.3239 Q40.8691,22.3793 41.1017,22.5011 L41.1017,23.642 Q40.8359,23.3983 40.5811,23.2876 Q40.3374,23.1768 40.0827,23.1768 Q39.5178,23.1768 39.2298,23.6198 Q38.9418,24.0629 38.9418,24.9379 Q38.9418,25.8129 39.2298,26.256 Q39.5178,26.699 40.0827,26.699 Q40.3374,26.699 40.5811,26.5883 Q40.8359,26.4775 41.1017,26.2338 L41.1017,27.3747 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="55.2926" x="51.9609" y="27.7881">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="17.0131" x2="123.345" y1="34.9619" y2="34.9619"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="63.0903" x="20.5575" y="45.3753">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="38.9884" x="20.5575" y="55.0303">size : size_t</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="97.8253" x="20.5575" y="64.6852">raw sizeof = 8 bytes on RV32</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="99.2431" x="20.5575" y="74.3401">aligned xHeapStructSize = 16</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="17.0131" x2="123.345" y1="79.2527" y2="79.2527"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="60.1555" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="114.1296" x="13.1143" y="138.0897"/><ellipse cx="41.6467" cy="148.014" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M42.5549,150.3511 Q42.3112,150.4729 42.0454,150.5283 Q41.7796,150.5948 41.4805,150.5948 Q40.4393,150.5948 39.8855,149.908 Q39.3428,149.2213 39.3428,147.9143 Q39.3428,146.6073 39.8855,145.9206 Q40.4393,145.2339 41.4805,145.2339 Q41.7796,145.2339 42.0454,145.3003 Q42.3223,145.3557 42.5549,145.4775 L42.5549,146.6184 Q42.2891,146.3747 42.0343,146.2639 Q41.7906,146.1532 41.5359,146.1532 Q40.971,146.1532 40.683,146.5962 Q40.395,147.0393 40.395,147.9143 Q40.395,148.7893 40.683,149.2324 Q40.971,149.6754 41.5359,149.6754 Q41.7906,149.6754 42.0343,149.5647 Q42.2891,149.4539 42.5549,149.2102 L42.5549,150.3511 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="51.7482" x="54.052" y="150.7644">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.8231" x2="126.535" y1="157.9383" y2="157.9383"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="105.623" x="17.3675" y="168.3517">02 A: header + 24 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="81.5211" x="17.3675" y="178.0067">aligned total = 48 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="96.4076" x="17.3675" y="187.6616">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.8231" x2="126.535" y1="192.5741" y2="192.5741"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="50.5005" id="REM" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="92.8632" x="23.7475" y="251.4111"/><ellipse cx="37.4288" cy="261.3354" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M38.3371,263.6725 Q38.0934,263.7944 37.8276,263.8497 Q37.5617,263.9162 37.2627,263.9162 Q36.2215,263.9162 35.6677,263.2295 Q35.125,262.5427 35.125,261.2357 Q35.125,259.9287 35.6677,259.242 Q36.2215,258.5553 37.2627,258.5553 Q37.5617,258.5553 37.8276,258.6218 Q38.1045,258.6771 38.3371,258.799 L38.3371,259.9398 Q38.0712,259.6961 37.8165,259.5854 Q37.5728,259.4746 37.3181,259.4746 Q36.7532,259.4746 36.4652,259.9177 Q36.1772,260.3607 36.1772,261.2357 Q36.1772,262.1108 36.4652,262.5538 Q36.7532,262.9969 37.3181,262.9969 Q37.5728,262.9969 37.8165,262.8861 Q38.0712,262.7753 38.3371,262.5317 L38.3371,263.6725 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="63.0903" x="46.9278" y="264.0859">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="24.4563" x2="115.9018" y1="271.2597" y2="271.2597"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="40.4061" x="28.0007" y="281.6732">own header</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="84.3566" x="28.0007" y="291.3281">free = 4032 bytes after A</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="24.4563" x2="115.9018" y1="296.2406" y2="296.2406"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="50.5005" id="LIST" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="114.8384" x="12.7598" y="355.0776"/><ellipse cx="21.9753" cy="365.0019" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M22.8835,367.339 Q22.6398,367.4609 22.374,367.5162 Q22.1082,367.5827 21.8091,367.5827 Q20.7679,367.5827 20.2141,366.896 Q19.6714,366.2093 19.6714,364.9023 Q19.6714,363.5953 20.2141,362.9085 Q20.7679,362.2218 21.8091,362.2218 Q22.1082,362.2218 22.374,362.2883 Q22.6509,362.3436 22.8835,362.4655 L22.8835,363.6063 Q22.6177,363.3627 22.3629,363.2519 Q22.1192,363.1411 21.8645,363.1411 Q21.2996,363.1411 21.0116,363.5842 Q20.7236,364.0272 20.7236,364.9023 Q20.7236,365.7773 21.0116,366.2203 Q21.2996,366.6634 21.8645,366.6634 Q22.1192,366.6634 22.3629,366.5526 Q22.6177,366.4419 22.8835,366.1982 L22.8835,367.339 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="94.9898" x="30.4818" y="367.7524">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.4687" x2="126.8894" y1="374.9263" y2="374.9263"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="99.2431" x="17.0131" y="385.3397">previous &lt; inserted &lt; current</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="46.0772" x="17.0131" y="394.9946">A &lt; B &lt; C+tail</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.4687" x2="126.8894" y1="399.9071" y2="399.9071"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="50.5005" id="LEFT" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="131.8515" x="4.2533" y="458.7441"/><ellipse cx="21.1246" cy="468.6684" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M22.0329,471.0055 Q21.7892,471.1274 21.5233,471.1828 Q21.2575,471.2492 20.9585,471.2492 Q19.9173,471.2492 19.3635,470.5625 Q18.8207,469.8758 18.8207,468.5688 Q18.8207,467.2618 19.3635,466.575 Q19.9173,465.8883 20.9585,465.8883 Q21.2575,465.8883 21.5233,465.9548 Q21.8003,466.0102 22.0329,466.132 L22.0329,467.2728 Q21.767,467.0292 21.5123,466.9184 Q21.2686,466.8076 21.0138,466.8076 Q20.449,466.8076 20.161,467.2507 Q19.873,467.6937 19.873,468.5688 Q19.873,469.4438 20.161,469.8868 Q20.449,470.3299 21.0138,470.3299 Q21.2686,470.3299 21.5123,470.2191 Q21.767,470.1084 22.0329,469.8647 L22.0329,471.0055 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="94.9898" x="31.3325" y="471.4189">05 Previous / left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="4.9622" x2="135.3959" y1="478.5928" y2="478.5928"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="123.345" x="8.5066" y="489.0062">previous + previous.size == inserted</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="68.7613" x="8.5066" y="498.6611">merge previous first</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="4.9622" x2="135.3959" y1="503.5736" y2="503.5736"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="50.5005" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="122.6361" x="8.861" y="562.4106"/><ellipse cx="25.0943" cy="572.335" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M26.0026,574.672 Q25.7589,574.7939 25.4931,574.8493 Q25.2272,574.9157 24.9282,574.9157 Q23.887,574.9157 23.3332,574.229 Q22.7905,573.5423 22.7905,572.2353 Q22.7905,570.9283 23.3332,570.2415 Q23.887,569.5548 24.9282,569.5548 Q25.2272,569.5548 25.4931,569.6213 Q25.77,569.6767 26.0026,569.7985 L26.0026,570.9394 Q25.7367,570.6957 25.482,570.5849 Q25.2383,570.4741 24.9836,570.4741 Q24.4187,570.4741 24.1307,570.9172 Q23.8427,571.3602 23.8427,572.2353 Q23.8427,573.1103 24.1307,573.5533 Q24.4187,573.9964 24.9836,573.9964 Q25.2383,573.9964 25.482,573.8856 Q25.7367,573.7749 26.0026,573.5312 L26.0026,574.672 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="87.1922" x="35.1604" y="575.0854">06 Next / right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="9.5699" x2="130.7882" y1="582.2593" y2="582.2593"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="114.1296" x="13.1143" y="592.6727">merged + merged.size == current</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="65.2169" x="13.1143" y="602.3276">merge next second</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="9.5699" x2="130.7882" y1="607.2402" y2="607.2402"/><path d="M152.409,367.1286 L152.409,377.4924 L127.9173,380.3279 L152.409,383.1634 L152.409,393.5272 A0,0 0 0 0 152.409,393.5272 L304.1092,393.5272 A0,0 0 0 0 304.1092,393.5272 L304.1092,374.2174 L297.0204,367.1286 L152.409,367.1286 A0,0 0 0 0 152.409,367.1286 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7088792948590754;"/><path d="M297.0204,367.1286 L297.0204,374.2174 L304.1092,374.2174 L297.0204,367.1286 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="124.7628" x="156.6623" y="378.2509">Address order exposes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="136.8137" x="156.6623" y="387.9058">neighbours without scanning the arena.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.1791,95.245 C70.1791,109.5006 70.1791,124.9329 70.1791,137.8557 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,86.1926,67.3435,90.4459,70.1791,94.6992,73.0146,90.4459,70.1791,86.1926" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="60.2547" x="70.8879" y="114.4769">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.1791,198.4224 C70.1791,213.4506 70.1791,231.6688 70.1791,246.6687 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,250.1422,73.0146,243.7623,70.1791,246.5978,67.3435,243.7623,70.1791,250.1422" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="46.0772" x="70.8879" y="227.7983">first-fit + split</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.1791,302.1243 C70.1791,316.5855 70.1791,334.9242 70.1791,350.1297 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,353.667,73.0146,347.287,70.1791,350.1226,67.3435,347.287,70.1791,353.667" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="58.837" x="70.8879" y="331.4649">insert by address</text><!--MD5=[cc3605e5f4ba919f564e1d79e1300518]
link LIST to LEFT--><path d="M70.1791,405.7909 C70.1791,420.252 70.1791,438.5907 70.1791,453.7962 " fill="none" id="LIST-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,457.3335,73.0146,450.9536,70.1791,453.7891,67.3435,450.9536,70.1791,457.3335" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="58.837" x="70.8879" y="435.1314">heap_4 tests first</text><!--MD5=[e8df39c6ef374d140d6cfa6fe0b5ac87]
link LEFT to RIGHT--><path d="M70.1791,509.4574 C70.1791,523.9185 70.1791,542.2572 70.1791,557.4627 " fill="none" id="LEFT-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,561,73.0146,554.6201,70.1791,557.4556,67.3435,554.6201,70.1791,561" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="51.7482" x="70.8879" y="538.7979">then tests next</text><!--MD5=[d8b34fb36bd2f73cd895320cbfc22e63]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — RV32 header, split and two-sided coalescing
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
raw sizeof = 8 bytes on RV32
aligned xHeapStructSize = 16
}
class "Allocated block" as ALLOC {
02 A: header + 24 byte request
aligned total = 48 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
free = 4032 bytes after A
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : first-fit + split
class "04 Address-ordered free list" as LIST {
previous < inserted < current
A < B < C+tail
}
class "05 Previous / left neighbour" as LEFT {
previous + previous.size == inserted
merge previous first
}
class "06 Next / right neighbour" as RIGHT {
merged + merged.size == current
merge next second
}
REM -down-> LIST : insert by address
LIST -down-> LEFT : heap_4 tests first
LEFT -down-> RIGHT : then tests next
note right of LIST
Address order exposes both physical
neighbours without scanning the arena.
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 31 KiB

+13 -13
View File
@@ -8,22 +8,22 @@ skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
title A5 FLOW — eight deterministic Hazard3 replay states
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
rectangle "01 E01 RESET\n1 block · free=4080\nraw header=8 · aligned=16" as S1
rectangle "02 E02 ALLOC A(24)\nconsumed=48\nfree=4032" as S2
rectangle "03 E03 ALLOC B(40)\nconsumed=64\nfree=3968" as S3
rectangle "04 E04 ALLOC C(16)\nconsumed=32\nfree=3936" as S4
rectangle "05 E05 FREE A\n2 free blocks\nfree=3984" as S5
rectangle "06 E06 FREE C\n2 blocks · fragmented\nfree=4016" as S6
rectangle "07 E07 FREE B\nmerge left + right\n1 block · free=4080" as S7
rectangle "08 E08 OOM / VERIFY\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S3 -right-> S4 : split remainder
S4 -down-> S5 : vPortFree(A)
S5 -left-> S6 : vPortFree(C)
S6 -left-> S7 : vPortFree(B)
S7 -left-> S8 : oversized request
@enduml
+45 -45
View File
@@ -1,48 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="263.7004px" preserveAspectRatio="none" style="width:811px;height:263px;" version="1.1" viewBox="0 0 811 263" width="811.5712px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="231.1894" x="294.4053" y="11.5848">A5 FLOW — allocate, fragment, coalesce, verify</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="108.37" x="7.2247" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="45.7562" x="19.2658" y="55.942">01 RESET</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="19.2658" y="70.7021">initial free = 4080</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="104.7577" x="224.5668" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="236.6079" y="48.5608">02 ALLOC A</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="80.6755" x="236.6079" y="63.3209">24 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="63.8179" x="236.6079" y="78.081">first-fit + split</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="127.6358" x="450.3377" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="74.6549" x="462.3789" y="48.5608">03 ALLOC B / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="103.5536" x="462.3789" y="63.3209">40 + 16 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="462.3789" y="78.081">after = 3952</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="671.2922" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="683.3333" y="55.942">04 FREE A / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="683.3333" y="70.7021">B remains allocated</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="132.4523" x="665.8737" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="108.37" x="677.9148" y="206.0345">05 E01 FRAGMENTED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="62.6138" x="677.9148" y="220.7946">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="677.9148" y="235.5547">current &gt; largest</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="111.9824" x="465.3891" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="477.4302" y="206.0345">06 FREE B</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="87.9001" x="477.4302" y="220.7946">insert by address</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="72.2467" x="477.4302" y="235.5547">join right + left</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="258.2819" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="270.3231" y="206.0345">07 E02 COALESCED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="57.7974" x="270.3231" y="220.7946">1 free block</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="270.3231" y="235.5547">final = initial</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="115.5947" x="8.4288" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="79.4714" x="20.4699" y="206.0345">08 OOM CHECK</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="73.4508" x="20.4699" y="220.7946">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="91.5125" x="20.4699" y="235.5547">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M115.7994,59.1196 C146.5043,59.1196 184.9515,59.1196 216.5956,59.1196 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="222.2429,59.1196,211.4059,54.3031,216.2223,59.1196,211.4059,63.936,222.2429,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="137.5698" y="51.4386">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M329.5894,59.1196 C362.7266,59.1196 405.9181,59.1196 442.1979,59.1196 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="448.0018,59.1196,437.1648,54.3031,441.9812,59.1196,437.1648,63.936,448.0018,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="77.0631" x="351.2996" y="51.4386">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M578.3709,59.1196 C605.1142,59.1196 636.2044,59.1196 663.4053,59.1196 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="669.1369,59.1196,658.2999,54.3031,663.1163,59.1196,658.2999,63.936,669.1369,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="599.9486" y="51.4386">vPortFree</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M732.0999,86.2723 C732.0999,110.3906 732.0999,146.6826 732.0999,174.6541 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="732.0999,180.494,736.9163,169.657,732.0999,174.4735,727.2834,169.657,732.0999,180.494" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="51.7768" x="733.304" y="142.2166">heap stats</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M585.5595,216.5812 C610.8338,216.5812 639.8529,216.5812 665.368,216.5812 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="579.6714,216.5812,590.5084,221.3977,585.6919,216.5812,590.5084,211.7648,579.6714,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="44.5521" x="599.3465" y="208.9003">continue</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M388.0009,216.5812 C413.0223,216.5812 440.9938,216.5812 464.8352,216.5812 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="382.1489,216.5812,392.9996,221.3667,388.1694,216.564,392.9721,211.7339,382.1489,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="40.9398" x="402.1733" y="208.9003">coalesce</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M132.1994,216.5812 C171.0802,216.5812 219.9551,216.5812 257.9689,216.5812 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="126.3836,216.5812,137.2206,221.3977,132.4041,216.5812,137.2206,211.7648,126.3836,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="90.3084" x="145.9985" y="208.9003">oversized request</text><!--MD5=[2e2dc33d46c2ffc454d35cea5ea70934]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="236.6008px" preserveAspectRatio="none" style="width:812px;height:236px;" version="1.1" viewBox="0 0 812 236" width="812.4374px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="239.8419" x="290.0791" y="10.3943">A5 FLOW — eight deterministic Hazard3 replay states</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="142.6087" x="6.4822" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="59.4203" x="17.2859" y="43.5704">01 E01 RESET</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="83.1884" x="17.2859" y="56.8136">1 block · free=4080</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="121.0013" x="17.2859" y="70.0569">raw header=8 · aligned=16</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="247.4045" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="258.2082" y="43.5704">02 E02 ALLOC A(24)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="258.2082" y="56.8136">consumed=48</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="258.2082" y="70.0569">free=4032</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="466.7194" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="477.5231" y="43.5704">03 E03 ALLOC B(40)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="477.5231" y="56.8136">consumed=64</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="477.5231" y="70.0569">free=3968</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="686.0343" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="696.8379" y="43.5704">04 E04 ALLOC C(16)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="696.8379" y="56.8136">consumed=32</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="696.8379" y="70.0569">free=3936</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="84.2688" x="698.9987" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="709.8024" y="184.861">05 E05 FREE A</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="56.1792" x="709.8024" y="198.1043">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="709.8024" y="211.3475">free=3984</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="118.8406" x="484.0053" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="494.809" y="184.861">06 E06 FREE C</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="97.2332" x="494.809" y="198.1043">2 blocks · fragmented</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="494.809" y="211.3475">free=4016</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="104.7958" x="282.5165" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="293.3202" y="184.861">07 E07 FREE B</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="78.8669" x="293.3202" y="198.1043">merge left + right</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="83.1884" x="293.3202" y="211.3475">1 block · free=4080</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="115.5995" x="46.996" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="93.9921" x="57.7997" y="184.861">08 E08 OOM / VERIFY</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="65.9025" x="57.7997" y="198.1043">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="82.108" x="57.7997" y="211.3475">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M149.5014,53.044 C178.639,53.044 211.9792,53.044 240.0796,53.044 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="245.4706,53.044,235.7473,48.7226,240.0688,53.044,235.7473,57.3655,245.4706,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="58.3399" x="169.0777" y="46.1524">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M358.1315,53.044 C389.0516,53.044 427.6208,53.044 459.5457,53.044 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="464.6126,53.044,454.8893,48.7226,459.2108,53.044,454.8893,57.3655,464.6126,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="69.1436" x="377.5889" y="46.1524">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M577.4464,53.044 C608.3665,53.044 646.9357,53.044 678.8606,53.044 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="683.9275,53.044,674.2042,48.7226,678.5257,53.044,674.2042,57.3655,683.9275,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="69.1436" x="596.9038" y="46.1524">split remainder</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M741.1331,83.9642 C741.1331,105.2367 741.1331,133.9637 741.1331,156.6298 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="741.1331,161.8156,745.4545,152.0923,741.1331,156.4137,736.8116,152.0923,741.1331,161.8156" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="742.2134" y="127.6015">vPortFree(A)</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M610.2356,194.3239 C639.492,194.3239 672.9618,194.3239 698.7286,194.3239 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="604.9202,194.3239,614.6435,198.6454,610.322,194.3239,614.6435,190.0024,604.9202,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="622.2925" y="187.4323">vPortFree(C)</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M394.7668,194.3239 C422.6403,194.3239 455.7212,194.3239 483.5947,194.3239 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="389.4406,194.3239,399.1639,198.6454,394.8424,194.3239,399.1639,190.0024,389.4406,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="407.029" y="187.4323">vPortFree(B)</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M169.8448,194.3239 C205.3025,194.3239 248.6253,194.3239 281.9871,194.3239 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="164.497,194.3239,174.2203,198.6454,169.8988,194.3239,174.2203,190.0024,164.497,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="81.0277" x="182.0422" y="187.4323">oversized request</text><!--MD5=[9f7e06700e17220ce72e8c57ed6bc819]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — eight deterministic Hazard3 replay states
rectangle "01 E01 RESET\n1 block · free=4080\nraw header=8 · aligned=16" as S1
rectangle "02 E02 ALLOC A(24)\nconsumed=48\nfree=4032" as S2
rectangle "03 E03 ALLOC B(40)\nconsumed=64\nfree=3968" as S3
rectangle "04 E04 ALLOC C(16)\nconsumed=32\nfree=3936" as S4
rectangle "05 E05 FREE A\n2 free blocks\nfree=3984" as S5
rectangle "06 E06 FREE C\n2 blocks · fragmented\nfree=4016" as S6
rectangle "07 E07 FREE B\nmerge left + right\n1 block · free=4080" as S7
rectangle "08 E08 OOM / VERIFY\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : split remainder
S4 -down-> S5 : vPortFree(A)
S5 -left-> S6 : vPortFree(C)
S6 -left-> S7 : vPortFree(B)
S7 -left-> S8 : oversized request
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

+11 -11
View File
@@ -8,21 +8,21 @@ skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
title A6 STATE — reusable states of the same RV32 arena
[*] --> Free : 01 one list node
Free --> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated --> Fragmented : free A and C
Fragmented : 03 two free blocks
[*] --> Free : 01 E01 one list node
Free --> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936
Allocated --> Fragmented : E05 free A\nE06 free C
Fragmented : 03 E06 two free blocks
Fragmented : sum free > largest block
Fragmented --> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced --> OOMChecked : request > arena
OOMChecked : NULL + hook once
Fragmented --> Coalesced : 04 E07 free B\nmerge previous, then next
Coalesced : one free block
Coalesced : current = largest = initial
Coalesced --> OOMChecked : 05 E08 request > arena
OOMChecked : NULL · hook=1 · PASS=1
OOMChecked --> [*]
state "05 minimum-ever" as MIN
state "minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
+39 -39
View File
@@ -1,42 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2823px" preserveAspectRatio="none" style="width:346px;height:600px;" version="1.1" viewBox="0 0 346 600" width="346.9454px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="154.5281" x="99.1803" y="7.9418">A6 STATE — block state and heap statistics</text><ellipse cx="212.8476" cy="23.6993" fill="#000000" rx="7.4292" ry="7.4292" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="37.1462" x="194.2745" y="86.8478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="194.2745" x2="231.4207" y1="104.3956" y2="104.3956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="15.6014" x="205.0469" y="98.5042">Free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="48.29" x="188.7026" y="190.1142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="188.7026" x2="236.9926" y1="207.662" y2="207.662"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="33.4316" x="196.1318" y="201.7706">Allocated</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="101.0376" x="111.0671" y="282.9796"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="111.0671" x2="212.1047" y1="300.5275" y2="300.5275"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="140.0411" y="294.6361">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="65.3773" x="114.7817" y="312.1839">03 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="86.1791" x="114.7817" y="322.3025">sum free &gt; largest block</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="103.2664" x="4.4575" y="394.3142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="4.4575" x2="107.7239" y1="411.862" y2="411.862"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="36.4033" x="37.8891" y="405.9706">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="61.6627" x="8.1722" y="423.5185">04 one free block</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="88.4079" x="8.1722" y="433.6371">current free = initial free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="78.7499" x="16.7158" y="495.2478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="16.7158" x2="95.4657" y1="512.7956" y2="512.7956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="48.29" x="31.9457" y="506.9042">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="63.8914" x="20.4304" y="524.4521">NULL + hook once</text><ellipse cx="56.0907" cy="585.1415" fill="none" rx="7.4292" ry="7.4292" style="stroke: #000000; stroke-width: 0.742923663722561;"/><ellipse cx="56.4622" cy="585.513" fill="#000000" rx="4.4575" ry="4.4575" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="77.2641" x="190.5599" y="398.3482"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="190.5599" x2="267.824" y1="415.8961" y2="415.8961"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="62.4056" x="197.9892" y="410.0047">05 minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M212.8476,31.2845 C212.8476,42.3689 212.8476,64.7384 212.8476,81.885 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,85.4436,215.8193,78.7573,212.8476,81.729,209.8759,78.7573,212.8476,85.4436" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.948" x="213.5906" y="62.101">01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M212.8476,124.358 C212.8476,141.3635 212.8476,166.8235 212.8476,185.1663 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,188.7843,215.8193,182.098,212.8476,185.0697,209.8759,182.098,212.8476,188.7843" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="59.4339" x="224.3629" y="154.9664">02 first-fit + split</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="80.9787" x="213.5906" y="165.085">current free decreases</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M203.0856,227.6021 C195.3518,241.9925 184.4382,262.304 175.746,278.4849 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="174.0076,281.7241,179.7784,277.2257,175.7573,278.4473,174.5357,274.4262,174.0076,281.7241" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="191.028" y="258.2328">free A and C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M110.7031,318.744 C93.6455,325.4006 76.1571,335.4523 65.0058,350.4817 C56.8188,361.5141 54.33,376.536 54.0031,389.4331 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="53.9808,392.9546,56.9907,386.2854,54.0021,389.24,51.0474,386.2514,53.9808,392.9546" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="21.5448" x="110.6956" y="359.1664">free B</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="111.4385" x="65.7487" y="369.285">address-order joins neighbours</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M56.0907,439.7959 C56.0907,454.8922 56.0907,474.8471 56.0907,490.1216 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,493.7842,59.0624,487.0979,56.0907,490.0696,53.119,487.0979,56.0907,493.7842" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.2051" x="56.8337" y="470.501">request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M56.0907,532.55 C56.0907,545.306 56.0907,562.0366 56.0907,573.0022 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,576.4716,59.0624,569.7853,56.0907,572.757,53.119,569.7853,56.0907,576.4716" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M228.8056,227.6169 C233.6049,234.1101 238.3299,241.7622 241.0787,249.548 C259.2432,300.9509 258.5449,318.5879 247.765,372.0264 C246.2941,379.3145 243.5824,386.8998 240.685,393.6827 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="239.214,396.9813,244.6551,392.0892,240.7295,393.5899,239.2288,389.6643,239.214,396.9813" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="82.4645" x="256.1378" y="308.6996">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M172.2766,328.3871 C178.8143,341.366 187.6105,357.9332 196.5033,372.0264 C201.2283,379.5151 206.8225,387.3752 212.0378,394.3513 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="214.2072,397.2338,212.5727,390.1018,211.9784,394.2621,207.818,393.6678,214.2072,397.2338" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="46.8042" x="197.2462" y="364.3669">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M108.0285,416.9213 C132.7679,416.9213 162.0242,416.9213 185.5972,416.9213 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="189.1038,416.9213,182.4175,413.9496,185.3892,416.9213,182.4175,419.893,189.1038,416.9213" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="55.7193" x="121.2823" y="412.2335">history remains</text><!--MD5=[994b73c618d067de5faae1a7c19b4f86]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] - -> Free : 01 one list node
Free - -> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated - -> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced - -> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked - -> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2775px" preserveAspectRatio="none" style="width:321px;height:600px;" version="1.1" viewBox="0 0 321 600" width="321.3164px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="184.7569" x="70.8357" y="7.8065">A6 STATE — reusable states of the same RV32 arena</text><ellipse cx="193.155" cy="23.2954" fill="#000000" rx="7.3026" ry="7.3026" style="stroke: none; stroke-width: 0.7302646103274287;"/><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="36.5132" x="174.8984" y="85.3679"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="174.8984" x2="211.4116" y1="102.6168" y2="102.6168"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="15.3356" x="185.4872" y="96.8258">Free</text><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="47.4672" x="169.4214" y="186.8747"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="169.4214" x2="216.8886" y1="204.1235" y2="204.1235"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="32.8619" x="176.724" y="198.3325">Allocated</text><rect fill="#EDF6FA" height="44.4439" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="99.316" x="93.1087" y="288.3815"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="93.1087" x2="192.4247" y1="305.6303" y2="305.6303"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="42.3553" x="121.5891" y="299.8393">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="79.5988" x="96.7601" y="317.0882">03 E06 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="84.7107" x="96.7601" y="327.0344">sum free &gt; largest block</text><rect fill="#EDF6FA" height="44.4439" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="102.9673" x="4.3816" y="397.8189"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="4.3816" x2="107.3489" y1="415.0678" y2="415.0678"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="37.9738" y="409.2768">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="49.658" x="8.0329" y="426.5256">one free block</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="88.362" x="8.0329" y="436.4718">current = largest = initial</text><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="96.3949" x="7.6678" y="497.0327"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="7.6678" x2="104.0627" y1="514.2815" y2="514.2815"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="47.4672" x="32.1316" y="508.4905">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="81.7896" x="11.3191" y="525.7394">NULL · hook=1 · PASS=1</text><ellipse cx="55.8652" cy="585.3947" fill="none" rx="7.3026" ry="7.3026" style="stroke: #000000; stroke-width: 0.7302646103274287;"/><ellipse cx="56.2304" cy="585.7598" fill="#000000" rx="4.3816" ry="4.3816" style="stroke: none; stroke-width: 0.7302646103274287;"/><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="64.9936" x="188.4083" y="401.7843"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="188.4083" x2="253.4018" y1="419.0331" y2="419.0331"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="50.3883" x="195.7109" y="413.2421">minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M193.155,30.7514 C193.155,41.647 193.155,63.6352 193.155,80.4898 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="193.155,83.9877,196.076,77.4153,193.155,80.3364,190.2339,77.4153,193.155,83.9877" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="72.2962" x="193.8853" y="61.0428">01 E01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M193.155,122.239 C193.155,138.9547 193.155,163.9809 193.155,182.0111 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="193.155,185.5675,196.076,178.9951,193.155,181.9162,190.2339,178.9951,193.155,185.5675" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="83.9804" x="193.8853" y="152.3259">02 E04 A+B+C allocated</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="67.9146" x="201.9182" y="162.2721">current free = 3936</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M184.4941,223.7385 C176.4611,240.3228 164.4191,265.181 155.3346,283.9342 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="153.8083,287.0889,159.2954,282.4391,155.3952,283.8004,154.0338,279.9002,153.8083,287.0889" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="174.6866" y="253.8327">E05 free A</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="174.6866" y="263.7789">E06 free C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M92.7509,329.6414 C81.6363,335.9582 71.0474,344.1883 63.8982,354.7333 C56.391,365.8114 54.1053,380.4606 53.8278,393.0065 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="53.8132,396.4241,56.753,389.8601,53.8236,392.7728,50.9109,389.8434,53.8132,396.4241" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="47.4672" x="87.2666" y="363.2701">04 E07 free B</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="92.7436" x="64.6284" y="373.2163">merge previous, then next</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M55.8652,442.5257 C55.8652,457.3647 55.8652,476.9796 55.8652,491.9939 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="55.8652,495.5941,58.7863,489.0217,55.8652,491.9427,52.9442,489.0217,55.8652,495.5941" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="82.5199" x="56.5955" y="472.7076">05 E08 request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M55.8652,533.6993 C55.8652,546.2379 55.8652,562.6835 55.8652,573.4622 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="55.8652,576.8725,58.7863,570.3001,55.8652,573.2212,52.9442,570.3001,55.8652,576.8725" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M206.402,223.6581 C210.5791,230.1502 214.7489,237.7595 217.2537,245.2959 C235.6199,300.555 231.8517,317.8477 227.4774,375.911 C226.9589,382.7609 225.995,390.1731 224.958,396.8988 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="224.403,400.3384,228.3223,394.3078,224.9778,396.7326,222.5531,393.3881,224.403,400.3384" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="81.0594" x="231.8006" y="313.6632">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M152.2237,332.9422 C158.409,345.9702 167.1649,362.5618 177.0892,375.911 C182.9094,383.7394 190.1317,391.4875 197.0254,398.2279 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="199.5813,400.6889,196.8641,394.0296,196.9477,398.1598,192.8176,398.2434,199.5813,400.6889" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="46.0067" x="177.8194" y="368.382">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M107.6337,420.0409 C132.2582,420.0409 161.1402,420.0409 183.5812,420.0409 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="187.1595,420.0409,180.5871,417.1198,183.5082,420.0409,180.5871,422.962,187.1595,420.0409" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="54.7698" x="120.4937" y="415.4329">history remains</text><!--MD5=[ca62bd85e5915d2f6639cfa0fa77f8b6]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — reusable states of the same RV32 arena
[*] - -> Free : 01 E01 one list node
Free - -> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936
Allocated - -> Fragmented : E05 free A\nE06 free C
Fragmented : 03 E06 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : 04 E07 free B\nmerge previous, then next
Coalesced : one free block
Coalesced : current = largest = initial
Coalesced - -> OOMChecked : 05 E08 request > arena
OOMChecked : NULL · hook=1 · PASS=1
OOMChecked - -> [*]
state "minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

+3 -3
View File
@@ -8,13 +8,13 @@ skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
title A7 RUNTIME — source identity, replay, memory and verdict
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<checkpoint E06>>\n03 fragmented\nblocks=2 · free>largest" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
rectangle "<<checkpoint E08>>\n05 verified\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC --> ELF : compile + link
ELF --> E1 : reset / load / replay
+33 -33
View File
@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82.7447px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.2079px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="190.3128" x="314.8436" y="7.9609">A7 RUNTIME — one artifact, two checkpoints, one proof</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="78.6075" x="4.9647" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="31.443" x="13.2392" y="38.0453">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="38.89" x="13.2392" y="48.1882">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="62.0585" x="13.2392" y="58.3311">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="71.9879" x="181.2109" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="32.2704" x="189.4854" y="38.0453">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="51.3017" x="189.4854" y="48.1882">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="55.439" x="189.4854" y="58.3311">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="86.0545" x="370.6963" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="378.9707" y="38.0453">«checkpoint E01»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="52.1292" x="378.9707" y="48.1882">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="69.5055" x="378.9707" y="58.3311">blocks=2 · aligned=1</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="81.0898" x="553.5621" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="37.2351" x="561.8365" y="38.0453">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="58.7487" x="561.8365" y="48.1882">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="64.5409" x="561.8365" y="58.3311">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="57.1206" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="88.5368" x="716.5691" y="16.7377"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="724.8436" y="32.9731">«checkpoint E02»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="43.0272" x="724.8436" y="43.116">05 coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="71.9879" x="724.8436" y="53.2589">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="57.0938" x="724.8436" y="63.4018">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.961,45.2929 C111.3744,45.2929 148.0054,45.2929 175.7911,45.2929 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="179.6222,45.2929,172.1752,41.9831,175.485,45.2929,172.1752,48.6027,179.6222,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="46.337" x="109.223" y="42.497">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M253.5463,45.2929 C284.8735,45.2929 330.7719,45.2929 365.2765,45.2929 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="369.2482,45.2929,361.8012,41.9831,365.111,45.2929,361.8012,48.6027,369.2482,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="66.1958" x="278.8496" y="42.497">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M457.1314,45.2929 C484.5447,45.2929 520.1332,45.2929 548.0513,45.2929 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="551.9154,45.2929,544.4684,41.9831,547.7782,45.2929,544.4684,48.6027,551.9154,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="45.5096" x="482.4016" y="42.497">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M634.8918,45.2929 C657.8783,45.2929 686.93,45.2929 711.2486,45.2929 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="715.1128,45.2929,707.6658,41.9831,710.9756,45.2929,707.6658,48.6027,715.1128,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="30.6155" x="660.3027" y="42.497">continue</text><!--MD5=[bc1681809f0cb7bb82cdf81f0385b8f2]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.26px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="204.18" x="307.91" y="7.8893">A7 RUNTIME — source identity, replay, memory and verdict</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="77.9" x="4.92" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="31.16" x="13.12" y="37.7029">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="38.54" x="13.12" y="47.7545">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="61.5" x="13.12" y="57.8062">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="71.34" x="179.58" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="31.98" x="187.78" y="37.7029">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="50.84" x="187.78" y="47.7545">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="54.94" x="187.78" y="57.8062">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="92.66" x="367.36" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="59.86" x="375.56" y="37.7029">«checkpoint E06»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="51.66" x="375.56" y="47.7545">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="76.26" x="375.56" y="57.8062">blocks=2 · free&gt;largest</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="80.36" x="555.96" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="36.9" x="564.16" y="37.7029">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="58.22" x="564.16" y="47.7545">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="63.96" x="564.16" y="57.8062">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="56.6065" style="stroke: #2C7794; stroke-width: 1.23;" width="87.74" x="717.5" y="16.587"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="59.86" x="725.7" y="32.6763">«checkpoint E08»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="36.08" x="725.7" y="42.7279">05 verified</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="71.34" x="725.7" y="52.7796">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="56.58" x="725.7" y="62.8312">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.2054,44.8852 C110.372,44.8852 146.6734,44.8852 174.209,44.8852 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="178.0056,44.8852,170.6256,41.6052,173.9056,44.8852,170.6256,48.1652,178.0056,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="45.92" x="108.24" y="42.1145">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M251.2562,44.8852 C282.0636,44.8852 327.221,44.8852 361.9726,44.8852 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="365.9988,44.8852,358.6188,41.6052,361.8988,44.8852,358.6188,48.1652,365.9988,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="65.6" x="276.34" y="42.1145">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M460.3726,44.8852 C488.0476,44.8852 523.1518,44.8852 550.6136,44.8852 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="554.4102,44.8852,547.0302,41.6052,550.3102,44.8852,547.0302,48.1652,554.4102,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="45.1" x="485.44" y="42.1145">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M636.5578,44.8852 C659.3374,44.8852 688.1276,44.8852 712.2274,44.8852 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="716.0568,44.8852,708.6768,41.6052,711.9568,44.8852,708.6768,48.1652,716.0568,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="30.34" x="661.74" y="42.1145">continue</text><!--MD5=[d3cc7590ea240485cc9ae283b10caa4d]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — source identity, replay, memory and verdict
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E06>>\n03 fragmented\nblocks=2 · free>largest" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E08>>\n05 verified\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

+26 -14
View File
@@ -64,8 +64,8 @@ Przed wejściem uczniów:
1. zbuduj Task 3 dla `pico2_w` / RP2350 RISC-V;
2. wgraj zweryfikowany obraz i otwórz sesję na tym samym ELF;
3. ustaw pierwszy breakpoint na `heap4_fragmented_checkpoint`;
4. przygotuj widok `ucHeap`, `g_fragmented_stats`, `g_final_stats`,
3. ustaw pierwszy breakpoint na `heap4_reset_checkpoint`;
4. przygotuj widok `ucHeap`, statystyk E01--E08,
`xFreeBytesRemaining` i `xMinimumEverFreeBytesRemaining`;
5. przygotuj Hazard3 jako awaryjny zamiennik — podczas lekcji użyj jednej
platformy, nigdy obu.
@@ -81,7 +81,7 @@ sprzętowym heapem ani peryferium RP2350.
| 34 min | kontekst | Jedno zdanie: FreeRTOS dostarcza wymienne implementacje tego samego API; ta karta i oficjalne przykłady Pico 2 W linkują `heap_4`. |
| 49 min | Task 1 — demo | Do żądania dodaj nagłówek, wyrównaj rozmiar, wybierz pierwszy pasujący blok i podziel go. Uczeń zapisuje `wanted` i `remainder` przed odsłonięciem wyniku. |
| 916 min | Task 2 — demo | Dla `A:48 | B:48 | C:48` pokaż listę `A -> C`, wstaw `B` po adresie i sprawdź scalenie w prawo oraz w lewo: `2 bloki / 96 B / largest 48 B -> 1 blok / 144 B / largest 144 B`. |
| 1627 min | Task 3 — RUN | Na przygotowanym Pico 2 W przejdź przez prawdziwy `heap_4.c`: trzy alokacje, free A i C, checkpoint z dwoma blokami, free B, checkpoint z jednym blokiem, OOM=`NULL` i jeden malloc-failed hook. Uczeń wypełnia tabelę relacji. |
| 1627 min | Task 3 — RUN | Na przygotowanym celu przejdź przez osiem checkpointów prawdziwego `heap_4.c`: reset, trzy alokacje, free A, free C, free B i kontrolowany OOM. Uczeń wypełnia tabelę relacji. |
| 2730 min | wyjście | Uczeń wymienia trzy dodatki ponad K&R (`header`, `free list`, `coalescing`) i wyjaśnia: suma wolnych bajtów może być większa od największego bloku, a minimum-ever nie rośnie po `free`. |
## Task 1 — model nagłówka i splitu
@@ -112,8 +112,8 @@ free list: A --------------------------------> C
vPortFree(B)
1. wstaw B pomiędzy A i C według adresu;
2. jeśli end(B) == addr(C), połącz B+C;
3. jeśli end(A) == addr(BC), połącz A+BC;
2. jeśli end(A) == addr(B), połącz A+B;
3. jeśli end(AB) == addr(C), połącz AB+C;
wynik: [ ABC:144 FREE ]
free list: A -> END
@@ -126,26 +126,32 @@ Uczeń przed odsłonięciem rysuje listę i wpisuje `2 -> 1`, `96 -> 144` oraz
```text
RESET/INIT
-> heap4_reset_checkpoint # E01: 4080 B
-> ALLOC A(24)
-> heap4_alloc_a_checkpoint # E02: 4032 B
-> ALLOC B(40)
-> heap4_alloc_b_checkpoint # E03: 3968 B
-> ALLOC C(16)
-> heap4_alloc_c_checkpoint # E04: 3936 B
-> FREE A
-> heap4_free_a_checkpoint # E05: 3984 B, 2 bloki
-> FREE C
-> heap4_fragmented_checkpoint # 2 free blocks
-> heap4_fragmented_checkpoint # E06: 4016 B, 2 bloki
-> FREE B
-> heap4_coalesced_checkpoint # E07: 4080 B, 1 blok
-> OOM request
-> task03_debug_checkpoint # 1 free block, pass=1
-> task03_debug_checkpoint # E08: NULL, hook=1, pass=1
```
Uczeń zapisuje tylko relacje, ponieważ dokładne bajty zależą od ABI i
konfiguracji:
Na Hazard3 `sizeof(BlockLink_t)=8`, ale `portBYTE_ALIGNMENT=16`, dlatego
`xHeapStructSize=16`. Główny replay ma stałe, testowane wartości:
| Obserwacja | Oczekiwany związek |
| Obserwacja | Oczekiwany wynik RV32/Hazard3 |
| --- | --- |
| po trzech alokacjach | `after_allocations < initial_free` |
| stan pofragmentowany | `free_blocks == 2`, `largest < total_free` |
| po `free(B)` | `final_free == initial_free`, `free_blocks == 1` |
| low-water mark | `minimum_ever <= after_allocations` i nie rośnie po free |
| E01--E04 | `4080 -> 4032 -> 3968 -> 3936`, zużycie `48/64/32` |
| E05--E06 | `3984 -> 4016`, nadal 2 bloki i `largest < total_free` |
| E07 | `final_free == initial_free == 4080`, `free_blocks == 1` |
| low-water mark | `minimum_ever == 3936` i nie rośnie po free |
| OOM | wynik `NULL`, hook `1`, brak uszkodzenia listy |
Minimalny dowód w GDB:
@@ -153,6 +159,9 @@ Minimalny dowód w GDB:
```gdb
p g_fragmented_stats
p g_final_stats
p g_a_consumed
p g_b_consumed
p g_c_consumed
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
p xStart
@@ -160,6 +169,9 @@ p pxEnd
x/96bx ucHeap
```
Szczegółowe mapowanie wszystkich diagramów do kodu, replay i dowodów zawiera
[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md).
## Kryterium zaliczenia
Uczeń zalicza lekcję, jeżeli:
+46 -18
View File
@@ -11,7 +11,7 @@
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry}
\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=1cm,headheight=24mm,headsep=3mm,includehead,includefoot]{geometry}
\usepackage{eso-pic}
\usepackage{marginnote}
\usepackage{array}
@@ -42,13 +42,15 @@
\newcommand{\BuildCommit}{lokalna}%
}
\newcommand{\DocumentAuthor}{M. Pabiszczak}
\newcommand{\DocumentAuthor}{Mateusz Pabiszczak}
\newcommand{\DocumentYear}{2026}
\newcommand{\CardSeries}{freertos-c}
\newcommand{\CardSeriesTitle}{FreeRTOS C}
\newcommand{\CardNumber}{01}
\newcommand{\CardCount}{15}
\newcommand{\CardSlug}{heap4-mechanics}
\newcommand{\CardVersion}{v00.01}
\newcommand{\CardStatus}{Gotowa}
\newcommand{\DocumentUUID}{87e48095-7793-54e3-9230-4e61d31bd459}
\newcommand{\EmptyCheck}{\(\square\)}
@@ -92,7 +94,7 @@
\hrule height0.35pt%
\nointerlineskip%
\begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}%
\parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 87e48095-7793-54e3-9230-4e61d31bd459}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\%
\parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily 87e48095-7793-54e3-9230-4e61d31bd459}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR Mateusz Pabiszczak}\hspace{0.35mm}}} \\%
\end{tabularx}%
\par\nointerlineskip%
\hrule height0.35pt%
@@ -119,8 +121,11 @@
\pagestyle{fancy}
\fancyhf{}
\fancyhead[C]{\ESCPageResourceHeader}
\fancyfoot[L]{{\fontsize{6.4}{7.0}\selectfont\ttfamily UUID \DocumentUUID}}
\fancyfoot[C]{{\fontsize{6.4}{7.0}\selectfont\ttfamily \DocumentAuthor}}
\fancyfoot[R]{{\fontsize{6.4}{7.0}\selectfont\ttfamily STRONA \thepage/\pageref{LastPage}}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.35pt}
\newcommand{\ESCMarginTag}[4]{%
\hspace*{#1}\textcolor{#2}{#3~#4}%
@@ -155,7 +160,7 @@
{\bfseries\textcolor{black!65}{TECH}\par}%
\vspace{0.08em}%
\hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par%
\hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń odtwarza dwa checkpointy Hazard3 i odróżnia current free, largest free block oraz\textCR minimum-ever.}}\par%
\hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń odtwarza osiem checkpointów Hazard3 i odróżnia current free, largest free block oraz\textCR minimum-ever.}}\par%
\hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~RTOS}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Łączy kod, diagram i zweryfikowany dowód.}}\par%
\end{minipage}%
}%
@@ -197,10 +202,10 @@ Uczeń przechodzi od liniowego kursora z K\&R 5.4 do wielokrotnego użycia tej s
\vspace{0.35em}
Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdziwe FreeRTOS-Kernel V11.3.0 heap\_4 na RV32I/Hazard3 i dowodzi fragmentacji, pełnego scalenia, minimum-ever oraz kontrolowanego OOM.
\vspace{0.55em}
\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{0.85cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.45cm}>{\raggedright\arraybackslash}p{1.75cm}>{\ttfamily\raggedright\arraybackslash}p{1.50cm}@{}}
\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}>{\raggedright\arraybackslash}p{1.75cm}>{\ttfamily\raggedright\arraybackslash}p{1.50cm}@{}}
\textbf{Lekcja} & \textbf{Task} & \textbf{Najważniejsza idea} & \textbf{Priorytet} & \textbf{Status} & \textbf{Version} \\ \hline
\hline
\multicolumn{1}{|l|}{\textbf{\texttt{FC01}}} & \multicolumn{1}{l|}{\textbf{\texttt{Task01}}} & \multicolumn{1}{l|}{\textbf{headers, address-ordered free list, first-fit, split, coalescing and heap statistics}} & \multicolumn{1}{l|}{\textbf{główny}} & \multicolumn{1}{l|}{\textbf{opracowane}} & \multicolumn{1}{l|}{\textbf{\texttt{v00.01}}} \\ \hline
\textbf{\texttt{FC01}} & \textbf{\texttt{Task01}} & \textbf{headers, address-ordered free list, first-fit, split, coalescing and heap statistics} & \textbf{główny} & \textbf{opracowane} & \textbf{\texttt{v00.01}} \\ \hline
\end{tabularx}
\normalsize
@@ -219,6 +224,10 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
\caption{A1 CONTEXT — od żądania aplikacji do rzeczywistych bajtów ucHeap. — część 1/1 (r1 c1).}
\label{fig:a1-context}
\end{figure}
\Needspace{6\baselineskip}
\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}]
Aplikacja korzysta z publicznego API, heap\_4 zarządza jedną areną, a Hazard3 pokazuje jej rzeczywisty stan.
\end{tcolorbox}
\ESCSectionBlockEnd
\clearpage
@@ -227,10 +236,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.44697\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a2-structure.png}}
\includegraphics[width=0.47273\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a2-structure.png}}
\caption{A2 STRUCTURE — metadane wewnątrz areny i adresowo uporządkowana lista. — część 1/1 (r1 c1).}
\label{fig:a2-structure}
\end{figure}
\Needspace{6\baselineskip}
\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}]
Każdy blok ma nagłówek, a tylko wolne bloki wykorzystują wskaźnik next do budowy listy uporządkowanej adresami.
\end{tcolorbox}
\ESCSectionBlockEnd
\clearpage
@@ -240,10 +253,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.86277\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a5-flow.png}}
\includegraphics[width=0.86383\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a5-flow.png}}
\caption{A5 FLOW — inicjalizacja, A/B/C, fragmentacja, dwustronne scalenie i OOM. — część 1/1 (r1 c1).}
\label{fig:a5-flow}
\end{figure}
\Needspace{6\baselineskip}
\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}]
Jeden przebieg A/B/C przechodzi od pustej areny przez trzy przydziały i dwa wolne obszary do ponownie scalonego bloku.
\end{tcolorbox}
\ESCSectionBlockEnd
\end{landscape}
@@ -253,10 +270,14 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
\vspace{0.35em}
\begin{figure}[H]
\centering
\includegraphics[width=0.52424\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a6-state.png}}
\includegraphics[width=0.48636\linewidth,trim=0.000bp 0.000bp 0.000bp 0.000bp,clip]{\detokenize{../assets/a6-state.png}}
\caption{A6 STATE — wolny, przydzielony, rozdzielony, scalony oraz minimum-ever. — część 1/1 (r1 c1).}
\label{fig:a6-state}
\end{figure}
\Needspace{6\baselineskip}
\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}]
Bieżąca liczba wolnych bajtów może rosnąć po free, ale minimum-ever pozostaje historycznym minimum.
\end{tcolorbox}
\ESCSectionBlockEnd
\clearpage
@@ -270,6 +291,10 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
\caption{A7 RUNTIME — kod, ELF, checkpoint, pamięć i statystyki jednego przebiegu. — część 1/1 (r1 c1).}
\label{fig:a7-runtime}
\end{figure}
\Needspace{6\baselineskip}
\begin{tcolorbox}[enhanced,arc=0pt,boxrule=0.35pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries INTERPRETACJA}]
Ten sam artefakt łączy źródło, symbole ELF, osiem checkpointów, pamięć ucHeap i końcowe asercje.
\end{tcolorbox}
\ESCSectionBlockEnd
\end{landscape}
@@ -281,20 +306,23 @@ Dwa małe modele C przygotowują przewidywanie. Główny replay uruchamia prawdz
{\scriptsize\ttfamily aea09ab7-9bfd-5368-8d1b-c8724871c1a7}\par
\begin{ESCBlockFrame}{A — przewidywanie}
Przejdź przez model nagłówka, split i porządek adresowy przed uruchomieniem prawdziwego heap\_4.
\begin{ESCStepFrame}{size · Policz rozmiar bloku.}
Dodaj nagłówek do 13 bajtów i wyrównaj wynik do ośmiu.
\begin{ESCStepFrame}{size · Policz rozmiary całych bloków.}
Rozróżnij surowy BlockLink\_t (8 bajtów) od xHeapStructSize (16 bajtów), dodaj nagłówek do żądań 24, 40 i 16 bajtów, a następnie wyrównaj wynik do 16.
\end{ESCStepFrame}
\begin{ESCStepFrame}{list · Narysuj listę po free(A,C).}
Zaznacz, dlaczego przydzielony B rozdziela dwa wolne obszary.
\end{ESCStepFrame}
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{B — replay Hazard3}
Powiąż diagram z dwoma deterministycznymi checkpointami.
\begin{ESCStepFrame}{fragmented · Sprawdź E01.}
Porównaj liczbę wolnych bloków, największy blok i bieżące wolne bajty.
Powiąż każdy stan diagramu z deterministycznym checkpointem E01--E08.
\begin{ESCStepFrame}{allocate · Sprawdź E01--E04.}
Potwierdź wartości 4080, 4032, 3968 i 3936 oraz zużycie 48/64/32 bajtów.
\end{ESCStepFrame}
\begin{ESCStepFrame}{coalesced · Sprawdź E02.}
Udowodnij pełne scalenie, zachowanie minimum-ever i kontrolowany OOM.
\begin{ESCStepFrame}{release · Sprawdź E05--E07.}
Porównaj liczbę wolnych bloków i udowodnij scalenie poprzedniego, a potem następnego sąsiada.
\end{ESCStepFrame}
\begin{ESCStepFrame}{verify · Sprawdź E08.}
Udowodnij zachowanie minimum-ever, kontrolowany OOM, brak asercji i PASS=1.
\end{ESCStepFrame}
\end{ESCBlockFrame}
\begin{ESCBlockFrame}{Ćwiczenie · Ćwiczenie — ta sama suma, inna użyteczność}
@@ -302,7 +330,7 @@ Zaproponuj dwa układy wolnych bloków o tej samej sumie bajtów, ale tylko jede
\par\textbf{Evidence:} Dwa diagramy listy, suma wolnych bajtów, rozmiar największego bloku i wynik pvPortMalloc.
\par\textbf{Acceptance:} Uczeń nie utożsamia sumy wolnej pamięci z możliwością pojedynczego dużego przydziału.
\end{ESCBlockFrame}
\tcblower\textbf{Task acceptance:} Model 13 -> 32 bajty; poprawna predykcja dwóch wolnych bloków po free(A,C) i jednego po free(B); final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.
\tcblower\textbf{Task acceptance:} Na RV32 BlockLink\_t ma 8 bajtów, lecz 16-bajtowe wyrównanie portu daje xHeapStructSize=16; A/B/C zużywają 48/64/32 bajty; po free(A,C) są dwa wolne bloki, po free(B) jeden; final free = initial free; minimum-ever nie rośnie; OOM zwraca NULL; PASS=1.
\end{ESCTaskFrame}
\begin{ESCConclusionFrame}
heap\_4 odzyskuje pamięć dzięki metadanym w arenie, adresowo uporządkowanej liście i scalaniu sąsiadów. Suma wolnych bajtów nie zastępuje informacji o największym bloku, a minimum-ever jest historią, nie bieżącym stanem.
+102
View File
@@ -0,0 +1,102 @@
# FC01 — plan iteracji diagramów w Hazard3
## Zasada
Kursor porusza się po diagramie, nie po przypadkowych liniach programu.
Każda kotwica ma jeden z dwóch kontraktów:
- `CODE` — otwiera właściwe źródło lub dowód ELF; nie uruchamia programu;
- `RUN` — odtwarza program od czystego resetu do wskazanego checkpointu,
ustawia Neovima i udostępnia zestaw wyrażeń GDB.
Ten sam snapshot może wystąpić w kilku perspektywach. Nie powtarza to
eksperymentu: A2 pyta o strukturę, A6 o stan, a A7 o jakość dowodu.
## A1 CONTEXT — granice odpowiedzialności
| Step | Tryb | Otwórz | Pytanie kontrolne |
|---|---|---|---|
| 01 Application | CODE | `main()` | Czy aplikacja dotyka metadanych allocatora? |
| 02 FreeRTOS API | CODE | wywołania `pvPortMalloc`, `vPortFree`, stats | Gdzie kończy się publiczny kontrakt? |
| 03 heap_4 | CODE | upstream `heap_4.c` | Które funkcje wybierają, dzielą i scalają blok? |
| 04 ucHeap | CODE | definicja `ucHeap[4096]` | Gdzie fizycznie leżą nagłówki i payload? |
| 05 Hazard3 | CODE | test symboli ELF | Czy debugujemy dokładnie artefakt z karty? |
A1 nie ma checkpointu: opisuje architekturę, a nie zdarzenie runtime.
## A2 STRUCTURE — nagłówek, split i scalenie
| Step | Tryb / replay | Obserwuj | Warunek zaliczenia |
|---|---|---|---|
| 01 Header | CODE | `BlockLink_t`, `portBYTE_ALIGNMENT` | raw header=8 B, alignment=16 B, `xHeapStructSize`=16 B |
| 02 Alignment | RUN E02 | `g_a`, `g_a_consumed` | A jest wyrównane, cały blok zużywa 48 B |
| 03 Split | RUN E02 | `g_after_a_stats` | pozostaje 1 wolny blok i 4032 B |
| 04 Address order | RUN E06 | `g_a`, `g_b`, `g_c`, stats | adresy rosną, a B rozdziela 2 wolne obszary |
| 05 Merge previous | RUN E06 + step | `pxIterator`, `pxBlockToInsert` | poprzedni/lewy blok jest testowany i scalany pierwszy |
| 06 Merge next | RUN E06 + step | powiększony blok i `pxNextFreeBlock` | następny/prawy blok jest scalany drugi |
Dla kroków 0506 po replay E06:
```gdb
tbreak prvInsertBlockIntoFreeList
continue # wykonaj vPortFree(g_b)
p pxIterator
p pxBlockToInsert
next # test poprzedniego/lewego sąsiada
next # test następnego/prawego sąsiada
```
## A5 FLOW — pełny przebieg
| Event | Operacja | Wartości RV32/Hazard3 | Dowód |
|---|---|---|---|
| E01 | reset/init | free=4080 | 1 blok, largest=4080 |
| E02 | alloc A(24) | consumed=48, free=4032 | A != NULL, aligned=1 |
| E03 | alloc B(40) | consumed=64, free=3968 | B != NULL, aligned=1 |
| E04 | alloc C(16) | consumed=32, free=3936 | C != NULL, aligned=1 |
| E05 | free A | free=3984 | 2 wolne bloki |
| E06 | free C | free=4016 | 2 bloki, free > largest |
| E07 | free B | free=largest=4080 | 1 wolny blok, minimum-ever=3936 |
| E08 | oversized alloc | NULL | hook=1, asserts=0, layout=1, PASS=1 |
Każdy Enter na A5 wykonuje czysty replay do dokładnie jednego eventu. Nie
kontynuujemy stanu pozostałego po poprzednim kroku.
## A6 STATE — znaczenie liczników
| Step | Replay | Hipoteza |
|---|---|---|
| 01 Free | E01 | current free i largest są równe |
| 02 Allocated | E04 | przydziały zmniejszają current free do 3936 |
| 03 Fragmented | E06 | total free może być większe od largest |
| 04 Coalesced | E07 | current, largest i initial znów są równe |
| 05 Minimum-ever | E08 | minimum-ever pozostaje 3936 mimo odzyskania areny |
## A7 RUNTIME — jakość dowodu
| Step | Tryb / replay | Co musi znaleźć się w dowodzie |
|---|---|---|
| 01 Source | CODE | blob źródła eksperymentu |
| 02 ELF | CODE | SHA artefaktu i symbole upstream/checkpointów |
| 03 Fragmented | RUN E06 | PC, 2 bloki, free=4016, largest<free |
| 04 Memory | RUN E06 | adres `ucHeap`, adresy A/B/C i bajty nagłówków |
| 05 Verdict | RUN E08 | final=initial, OOM NULL, hook=1, asserts=0, PASS=1 |
Snapshot do raportu jest kompletny dopiero wtedy, gdy łączy nazwę eventu,
tożsamość ELF, pozycję programu i wartości rozstrzygające hipotezę.
## Świadomie pominięte perspektywy
- A3 DISPATCH — allocator nie ma callbacku ani mechanizmu dispatch;
- A4 APPLICATION — konkretny eksperyment A/B/C jest pełnym A5;
- A8 PATTERNS — first-fit i intrusive address-ordered list są już mierzalne w
A2 i A5; osobny diagram powielałby materiał.
## Definition of done
1. Hostowe modele i adapter przechodzą `tests/test_host.sh`.
2. ELF RV32 zawiera upstream `heap_4` oraz osiem symboli checkpointów.
3. Hazard3 RTL kończy Task03 kodem `0`.
4. E01E08 spełniają wyrażenia z `debug_checkpoints`.
5. Wszystkie kroki RUN mają `snapshot_ref`; kroki CODE nie udają runtime.
6. SVG, HTML i TeX powstają z tego samego `json/card_source.json`.
+25 -17
View File
@@ -100,7 +100,7 @@ Czas & Tryb & Wynik \\
3--4 & kontekst & FreeRTOS linkuje jedną implementację; tutaj pracujemy tylko z \texttt{heap\_4} \\
4--9 & Demo 1 & przewidzieć nagłówek, first-fit i split \\
9--16 & Demo 2 & przewidzieć listę adresową i scalenie \texttt{2 -> 1} \\
16--27 & Task 3 RUN & dwa checkpointy prawdziwego \texttt{heap\_4.c} na Pico 2 W \\
16--27 & Task 3 RUN & osiem checkpointów E01--E08 prawdziwego \texttt{heap\_4.c} \\
27--30 & wyjście & odróżnić total free, largest free i minimum-ever \\
\bottomrule
\end{tabularx}
@@ -209,8 +209,9 @@ po: A:144 -> END blocks=1 total=144 largest=144
\end{lstlisting}
Porządek po adresie sprawia, że fizycznych sąsiadów można sprawdzić podczas
jednego wstawienia. To jest mechanizm funkcji
\texttt{prvInsertBlockIntoFreeList()} z \texttt{heap\_4.c}.
jednego wstawienia. Uproszczony Task 2 scala prawą, a następnie lewą stronę.
Właściwy \texttt{prvInsertBlockIntoFreeList()} z FreeRTOS V11.3.0 wykonuje
te same dwa testy w kolejności: poprzedni/lewy, następnie kolejny/prawy blok.
\section{Task 3 — jedyny centralny RUN (11 minut)}
@@ -224,17 +225,21 @@ stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
\begin{lstlisting}
RESET/INIT
-> ALLOC A(24) -> ALLOC B(40) -> ALLOC C(16)
-> FREE A -> FREE C
-> heap4_fragmented_checkpoint # STOP 1
-> FREE B -> OOM request
-> task03_debug_checkpoint # STOP 2
-> heap4_reset_checkpoint # E01: free=4080
-> heap4_alloc_a_checkpoint # E02: free=4032, used=48
-> heap4_alloc_b_checkpoint # E03: free=3968, used=64
-> heap4_alloc_c_checkpoint # E04: free=3936, used=32
-> heap4_free_a_checkpoint # E05: free=3984, blocks=2
-> heap4_fragmented_checkpoint # E06: free=4016, blocks=2
-> heap4_coalesced_checkpoint # E07: free=4080, blocks=1
-> task03_debug_checkpoint # E08: OOM, hook, PASS
\end{lstlisting}
\textbf{STOP 1:} zapisz liczbę bloków, sumę i largest. Przed \texttt{F5}
przewidź, co zmieni \texttt{FREE B}.
\textbf{STOP 2:} sprawdź odzyskanie areny, minimum-ever, OOM i hook.
\textbf{E01--E04:} sprawdź, że zużycie obejmuje wyrównany nagłówek całego
bloku, a nie tylko payload. \textbf{E05--E06:} porównaj sumę wolną z largest.
Przed przejściem z E06 do E07 ustaw tymczasowy breakpoint na
\texttt{prvInsertBlockIntoFreeList()} i sprawdź oba testy sąsiedztwa.
\textbf{E07--E08:} potwierdź odzyskanie areny, minimum-ever, OOM i hook.
\newpage
\section{Dowód na Pico 2 W / RP2350}
@@ -248,11 +253,14 @@ realną pamięć SRAM, w której obserwujemy ten sam algorytm.
\begin{lstlisting}
p g_fragmented_stats
p g_final_stats
p g_a_consumed
p g_b_consumed
p g_c_consumed
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
p xStart
p pxEnd
x/96bx ucHeap
x/160bx ucHeap
\end{lstlisting}
\subsection*{Tabela obserwacji}
@@ -263,10 +271,10 @@ Wielkość & Odczyt & Warunek \\
\midrule
\texttt{initial\_free} & \blank{2.3cm} & punkt odniesienia \\
\texttt{after\_allocations} & \blank{2.3cm} & mniejsze niż initial \\
STOP 1: free blocks & \blank{2.3cm} & równe 2 \\
STOP 1: total / largest & \blank{2.3cm} & largest mniejsze niż total \\
STOP 2: final free & \blank{2.3cm} & równe initial \\
STOP 2: free blocks & \blank{2.3cm} & równe 1 \\
E06: free blocks & \blank{2.3cm} & równe 2 \\
E06: total / largest & \blank{2.3cm} & largest mniejsze niż total \\
E07: final free & \blank{2.3cm} & równe initial \\
E07: free blocks & \blank{2.3cm} & równe 1 \\
minimum-ever & \blank{2.3cm} & nie rośnie po free \\
OOM / hook / asserts / pass & \blank{2.3cm} & \texttt{1 / 1 / 0 / 1} \\
\bottomrule
+39 -121
View File
@@ -1,133 +1,51 @@
# K01 `heap4` — punkt zatrzymania
# FC01 `heap_4` — stan weryfikacji
## Stan repozytorium
## Stan na 2026-07-20
- Data: `2026-07-14`.
- Commit bazowy: `8aee0b104c4f6e6ffef119ab6f57a3e724144221`.
- Gałąź robocza: `work/list-first-rp2350-debug`.
- Zmienione źródła: brak.
- Zmieniona karta PDF: brak.
- Lokalny stan `.stem/`: wygenerowany przez testy `stemctl`, nie jest częścią karty.
- Review Claude: nieukończony; dwie sesje CLI nie zwróciły wyniku i zostały zatrzymane.
Karta ma jeden centralny eksperyment na niezmodyfikowanym
`heap_4.c` z FreeRTOS-Kernel V11.3.0. Przebieg jest podzielony na osiem
deterministycznych checkpointów E01E08 i działa na RV32I/Hazard3.
## Potwierdzone
## Potwierdzone na Hazard3
- [x] `make host` buduje 10/10 programów.
- [x] Wszystkie programy hostowe uruchamiają się z kodem `0`.
- [x] `make tasks RV_ENV_ROOT=...` buduje 10/10 ELF dla RV32I.
- [x] `stemctl test native-amd64 freertos heap4 10` przechodzi.
- [x] RP2350 Probe jest wykrywany bez `sudo` po wejściu do grupy `rpdebug`.
- [x] OpenOCD wykrywa `rp2350.rv0` i `rp2350.rv1`.
- [x] Oba rdzenie raportują `XLEN=32`.
- [ ] Nie wykonano testu programu K01 na RTL Hazard3.
- [ ] Nie wgrano programu K01 na fizyczny RP2350.
| Event | Stan | Dowód |
|---|---|---|
| E01 | arena po inicjalizacji | `free=largest=4080`, 1 blok |
| E02 | `alloc A(24)` | zużyto 48, zostało 4032 |
| E03 | `alloc B(40)` | zużyto 64, zostało 3968 |
| E04 | `alloc C(16)` | zużyto 32, zostało 3936 |
| E05 | `free(A)` | 3984, 2 wolne bloki |
| E06 | `free(C)` | 4016, 2 bloki, `free > largest` |
| E07 | `free(B)` | `free=largest=4080`, 1 blok |
| E08 | kontrolowany OOM | `NULL`, hook=1, asserts=0, PASS=1 |
## Wyniki bazowe — host AMD64
Na RV32 `sizeof(BlockLink_t) == 8`, ale `portBYTE_ALIGNMENT == 16`, więc
prywatne `xHeapStructSize == 16`. To wyjaśnia zużycie 48/64/32 bajtów.
| Task | Wynik |
|---|---|
| 01 | `header=16 aligned=16 allocated=1 total=32 user=16` |
| 02 | `free=136 largest=80 count=3` |
| 03 | `offset=0 free=144 end_last=1` |
| 04 | `r1=24 r9=32 r17=40 delta=7` |
| 05 | `ok=1 allocated=120 remaining=0` |
| 06 | `allocated=48 split=128 nodes=1` |
| 07 | `order=1 count=3 total=120` |
| 08 | `count=1 size=160 merged_right=1` |
| 09 | `heap=256 adjusted=248 dynamic=1 host_trace=1` |
| 10 | `ok=1 nodes=1 free=240 min=144` |
## Diagramy i iteracja
## Braki P0
- A1 CONTEXT: pięć kroków CODE — granice odpowiedzialności.
- A2 STRUCTURE: jeden krok CODE i pięć kroków RUN — nagłówek, split,
lista adresowa oraz scalenie lewego i prawego sąsiada.
- A5 FLOW: osiem kroków RUN mapowanych 1:1 na E01E08.
- A6 STATE: pięć reprezentatywnych stanów E01, E04, E06, E07 i E08.
- A7 RUNTIME: tożsamość źródła/ELF, pamięć `ucHeap` i końcowy werdykt.
- A3, A4 i A8 są jawnie pominięte, ponieważ dublowałyby A2/A5.
- [ ] Dodać `stem-card.yaml`.
- [ ] Obsłużyć targety:
- [ ] `native` / `native-amd64`;
- [ ] `hazard3-baremetal` / `hazard3-sim`;
- [ ] `rp2350-rv` / fizyczny Hazard3.
- [ ] Naprawić `stemctl test hazard3-sim freertos heap4 10`.
- Stan obecny: `Legacy Hazard3 card/task is unsupported`.
- [ ] Dodać asercje wyniku.
- Stan obecny: każdy `main()` zwraca `0` niezależnie od wartości `g_*`.
- [ ] Dodać automatyczne porównanie wyników AMD64 i RV32.
- [ ] Dodać bezpieczne sprawdzanie przepełnienia rozmiaru żądania.
- [ ] Sprawdzić wyrównanie buforów używanych jako `HeapBlock`.
- [ ] Nie dereferencjonować wyniku alokacji przed sprawdzeniem `p != NULL`.
Szczegółowa kolejność komend, obserwacji i kryteriów znajduje się w
[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md).
## Braki debug
## Wykonane testy
- [ ] K10: dodać jawne checkpointy:
- [ ] `INIT`;
- [ ] `ALLOC_A`;
- [ ] `ALLOC_B`;
- [ ] `FREE_A`;
- [ ] `ALLOC_C`;
- [ ] `ALLOC_REJECTED`;
- [ ] `FREE_B`;
- [ ] `FREE_C`;
- [ ] `DONE`.
- [ ] K10: zapisywać przy checkpointcie:
- [ ] numer zdarzenia;
- [ ] adres bloku;
- [ ] liczbę wolnych bloków;
- [ ] sumę wolnej pamięci;
- [ ] minimum wolnej pamięci;
- [ ] status `RUNNING/PASS/FAIL`.
- [ ] Simulator:
- [ ] breakpoint na funkcji checkpointu;
- [ ] inspekcja listy i pamięci;
- [ ] bez obiecywania watchpointów — szybki stub obsługuje obecnie breakpointy wykonania.
- [ ] RP2350:
- [ ] OpenOCD `target/rp2350-riscv.cfg`;
- [ ] breakpoint `main`;
- [ ] sprzętowy watchpoint na numerze zdarzenia/statusie;
- [ ] porównanie adresów i wyników z symulatorem;
- [ ] Termdebug i DAP na tym samym ELF.
- testy hostowe Task 13;
- budowa RV32I i kontrola symboli ELF;
- Hazard3 RTL: zakończenie kodem 0 po 27308 cyklach;
- osiem checkpointów obecnych w ELF;
- walidacja JSON i odwołań `code_ref`/`snapshot_ref`;
- kontrola PlantUML, SVG, HTML, TeX i siedmiostronicowego PDF;
- TypeScript/React typecheck generatora.
## Braki materiału
- [ ] Zmniejszyć udział prozy.
- [ ] Zastąpić akapity:
- [ ] listami kontrolnymi;
- [ ] tabelami wartości;
- [ ] komendami do skopiowania;
- [ ] punktami zatrzymania GDB;
- [ ] kryteriami zaliczenia.
- [ ] Szablon każdego taska:
- [ ] `Cel` — maksymalnie 3 punkty;
- [ ] `Uruchom` — komendy;
- [ ] `Zatrzymaj` — breakpoint/watchpoint;
- [ ] `Obserwuj` — symbole i pamięć;
- [ ] `Oczekuj` — wartości host/RV32;
- [ ] `Zmień` — jeden eksperyment;
- [ ] `Zaliczenie` — mierzalna checklista.
- [ ] Przenieść pełne listingi C/ASM do dodatku.
- [ ] Pierwsze strony PDF przeznaczyć na kartę prowadzącego i przebieg lekcji.
## Kolejność wznowienia K01
1. Zamknąć wymagania w bezpośrednim poprzedniku `inf/structures`.
2. Dodać testy wyniku do K01.
3. Dodać kontrakt `stem-card.yaml`.
4. Uruchomić 10/10 tasków na Hazard3 RTL.
5. Dodać checkpointy K10.
6. Zbudować K10 dla `rp2350-rv`.
7. Wgrać i debugować K10 przez JTAG.
8. Przebudować README/PDF do formatu list-first.
9. Wykonać końcowy review techniczny i dydaktyczny.
## Bezpośredni poprzednik
- Seria: `inf`.
- Karta: `structures`.
- Repozytorium: `lab-rv32i-c-structures`.
- Przejście wymagane przed K01:
- [ ] `struct` i `typedef`;
- [ ] struktura samoreferencyjna;
- [ ] pole `next`;
- [ ] przejście po liście;
- [ ] wstawianie elementu;
- [ ] wartownik;
- [ ] `sizeof`, padding i wyrównanie na AMD64/RV32;
- [ ] niezmienniki listy;
- [ ] obserwacja w GDB.
## Pozostaje poza zakresem tej iteracji
- próba na fizycznym RP2350/Pico 2 W;
- commit i publikacja — wymagają osobnego polecenia.
+507 -176
View File
File diff suppressed because it is too large Load Diff
+539 -211
View File
File diff suppressed because it is too large Load Diff
+134 -27
View File
@@ -10,16 +10,37 @@
uint8_t ucHeap[configTOTAL_HEAP_SIZE] __attribute__((aligned(portBYTE_ALIGNMENT)));
HeapStats_t g_initial_stats;
HeapStats_t g_after_a_stats;
HeapStats_t g_after_b_stats;
HeapStats_t g_after_allocations_stats;
HeapStats_t g_after_free_a_stats;
HeapStats_t g_fragmented_stats;
HeapStats_t g_final_stats;
volatile size_t g_initial_free;
volatile size_t g_after_a_free;
volatile size_t g_after_b_free;
volatile size_t g_after_allocations;
volatile size_t g_after_free_a;
volatile size_t g_fragmented_free;
volatile size_t g_final_free;
volatile size_t g_minimum_ever_free;
volatile size_t g_a_consumed;
volatile size_t g_b_consumed;
volatile size_t g_c_consumed;
void * volatile g_probe;
void * volatile g_a;
void * volatile g_b;
void * volatile g_c;
void * volatile g_too_large;
volatile int g_a_aligned;
volatile int g_b_aligned;
volatile int g_c_aligned;
volatile int g_allocations_aligned;
volatile int g_oom_is_null;
volatile int g_malloc_failed_hooks;
volatile int g_assert_failures;
volatile int g_rv32_layout_expected;
volatile int g_task03_pass;
void vApplicationMallocFailedHook(void)
@@ -45,6 +66,41 @@ BaseType_t xTaskResumeAll(void)
}
#endif
__attribute__((noinline)) void heap4_reset_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void heap4_alloc_a_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void heap4_alloc_b_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void heap4_alloc_c_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void heap4_free_a_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void heap4_fragmented_checkpoint(void)
{
#if defined(__GNUC__)
@@ -52,6 +108,13 @@ __attribute__((noinline)) void heap4_fragmented_checkpoint(void)
#endif
}
__attribute__((noinline)) void heap4_coalesced_checkpoint(void)
{
#if defined(__GNUC__)
__asm__ volatile("" ::: "memory");
#endif
}
__attribute__((noinline)) void task03_debug_checkpoint(void)
{
#if defined(__GNUC__)
@@ -61,48 +124,88 @@ __attribute__((noinline)) void task03_debug_checkpoint(void)
int main(void)
{
void *probe;
void *a;
void *b;
void *c;
void *too_large;
vPortHeapResetState();
probe = pvPortMalloc(1U);
if (probe != NULL)
g_probe = pvPortMalloc(1U);
if (g_probe != NULL)
{
vPortFree(probe);
vPortFree(g_probe);
}
g_initial_free = xPortGetFreeHeapSize();
vPortGetHeapStats(&g_initial_stats);
heap4_reset_checkpoint();
a = pvPortMalloc(24U);
b = pvPortMalloc(40U);
c = pvPortMalloc(16U);
g_a = pvPortMalloc(24U);
g_after_a_free = xPortGetFreeHeapSize();
g_a_consumed = g_initial_free - g_after_a_free;
g_a_aligned =
g_a != NULL && ((uintptr_t)g_a % portBYTE_ALIGNMENT) == 0U;
vPortGetHeapStats(&g_after_a_stats);
heap4_alloc_a_checkpoint();
g_b = pvPortMalloc(40U);
g_after_b_free = xPortGetFreeHeapSize();
g_b_consumed = g_after_a_free - g_after_b_free;
g_b_aligned =
g_b != NULL && ((uintptr_t)g_b % portBYTE_ALIGNMENT) == 0U;
vPortGetHeapStats(&g_after_b_stats);
heap4_alloc_b_checkpoint();
g_c = pvPortMalloc(16U);
g_after_allocations = xPortGetFreeHeapSize();
g_c_consumed = g_after_b_free - g_after_allocations;
g_c_aligned =
g_c != NULL && ((uintptr_t)g_c % portBYTE_ALIGNMENT) == 0U;
g_allocations_aligned =
a != NULL && b != NULL && c != NULL &&
((uintptr_t)a % portBYTE_ALIGNMENT) == 0U &&
((uintptr_t)b % portBYTE_ALIGNMENT) == 0U &&
((uintptr_t)c % portBYTE_ALIGNMENT) == 0U;
g_a_aligned && g_b_aligned && g_c_aligned;
vPortGetHeapStats(&g_after_allocations_stats);
heap4_alloc_c_checkpoint();
vPortFree(a);
vPortFree(c);
vPortFree(g_a);
g_after_free_a = xPortGetFreeHeapSize();
vPortGetHeapStats(&g_after_free_a_stats);
heap4_free_a_checkpoint();
vPortFree(g_c);
g_fragmented_free = xPortGetFreeHeapSize();
vPortGetHeapStats(&g_fragmented_stats);
heap4_fragmented_checkpoint();
vPortFree(b);
vPortFree(g_b);
g_final_free = xPortGetFreeHeapSize();
g_minimum_ever_free = xPortGetMinimumEverFreeHeapSize();
vPortGetHeapStats(&g_final_stats);
heap4_coalesced_checkpoint();
too_large = pvPortMalloc(configTOTAL_HEAP_SIZE * 2U);
g_oom_is_null = too_large == NULL;
g_too_large = pvPortMalloc(configTOTAL_HEAP_SIZE * 2U);
g_oom_is_null = g_too_large == NULL;
#if defined(__riscv) && (__riscv_xlen == 32)
g_rv32_layout_expected =
portBYTE_ALIGNMENT == 16U &&
g_initial_free == 4080U &&
g_after_a_free == 4032U && g_a_consumed == 48U &&
g_after_b_free == 3968U && g_b_consumed == 64U &&
g_after_allocations == 3936U && g_c_consumed == 32U &&
g_after_free_a == 3984U &&
g_fragmented_free == 4016U &&
g_final_free == 4080U;
#else
g_rv32_layout_expected = 1;
#endif
g_task03_pass =
probe != NULL && g_allocations_aligned &&
g_probe != NULL && g_allocations_aligned &&
g_rv32_layout_expected &&
g_initial_stats.xNumberOfFreeBlocks == 1U &&
g_after_a_free < g_initial_free &&
g_after_b_free < g_after_a_free &&
g_initial_free > g_after_allocations &&
g_after_free_a > g_after_allocations &&
g_fragmented_free > g_after_free_a &&
g_final_free == g_initial_free &&
g_minimum_ever_free <= g_after_allocations &&
g_after_free_a_stats.xNumberOfFreeBlocks == 2U &&
g_fragmented_stats.xNumberOfFreeBlocks == 2U &&
g_fragmented_stats.xAvailableHeapSpaceInBytes >
g_fragmented_stats.xSizeOfLargestFreeBlockInBytes &&
g_final_stats.xNumberOfFreeBlocks == 1U &&
g_final_stats.xSizeOfLargestFreeBlockInBytes == g_initial_free &&
g_oom_is_null && g_malloc_failed_hooks == 1 &&
@@ -111,11 +214,15 @@ int main(void)
task03_debug_checkpoint();
#if defined(HOST_PRINTF)
printf("initial=%zu after=%zu fragmented=%zu final=%zu min=%zu "
"aligned=%d oom=%d hooks=%d asserts=%d pass=%d\n",
g_initial_free, g_after_allocations,
g_fragmented_stats.xNumberOfFreeBlocks, g_final_free,
g_minimum_ever_free, g_allocations_aligned, g_oom_is_null,
printf("initial=%zu after_a=%zu after_b=%zu after_c=%zu "
"free_a=%zu fragmented=%zu final=%zu min=%zu "
"consumed=%zu/%zu/%zu aligned=%d oom=%d hooks=%d "
"asserts=%d pass=%d\n",
g_initial_free, g_after_a_free, g_after_b_free,
g_after_allocations, g_after_free_a, g_fragmented_free,
g_final_free, g_minimum_ever_free,
g_a_consumed, g_b_consumed, g_c_consumed,
g_allocations_aligned, g_oom_is_null,
g_malloc_failed_hooks, g_assert_failures, g_task03_pass);
#endif
return g_task03_pass ? 0 : 1;
+7 -2
View File
@@ -8,8 +8,13 @@ objdump="${prefix}objdump"
test -s "$elf"
for symbol in pvPortMalloc vPortFree prvInsertBlockIntoFreeList ucHeap \
heap4_fragmented_checkpoint task03_debug_checkpoint g_task03_pass; do
heap4_reset_checkpoint heap4_alloc_a_checkpoint \
heap4_alloc_b_checkpoint heap4_alloc_c_checkpoint \
heap4_free_a_checkpoint heap4_fragmented_checkpoint \
heap4_coalesced_checkpoint task03_debug_checkpoint \
g_initial_stats g_after_allocations_stats g_fragmented_stats \
g_final_stats g_rv32_layout_expected g_task03_pass; do
"$nm" -a "$elf" | grep -E "[[:space:]]${symbol}$" >/dev/null
done
"$objdump" -d "$elf" | grep -E 'addi[[:space:]]+sp,sp,-' >/dev/null
printf 'PASS Task 3 links upstream heap_4 and observable checkpoints: %s\n' "$elf"
printf 'PASS Task 3 links upstream heap_4 and eight observable checkpoints: %s\n' "$elf"
+1 -1
View File
@@ -19,4 +19,4 @@ check_output "$root/host-build/task01_first_fit_split/prog" \
check_output "$root/host-build/task02_address_order_coalesce/prog" \
'before_nodes=2 before_total=96 before_largest=48 after_nodes=1 after_total=144 after_largest=144 pass=1'
check_output "$root/host-build/task03_freertos_heap4/prog" \
'initial=4080 after=3952 fragmented=2 final=4080 min=3952 aligned=1 oom=1 hooks=1 asserts=0 pass=1'
'initial=4080 after_a=4040 after_b=3984 after_c=3952 free_a=3992 fragmented=4024 final=4080 min=3952 consumed=40/56/32 aligned=1 oom=1 hooks=1 asserts=0 pass=1'
+7 -1
View File
@@ -105,6 +105,9 @@ build_native() {
rv_env_root() {
if [[ -n "${RV_ENV_ROOT:-}" ]]; then
printf '%s\n' "$RV_ENV_ROOT"
elif [[ -f "$root/vendor/Hazard3/test/sim/common/init.S" && \
-f "$root/vendor/lab-runtime/memops.c" ]]; then
printf '%s\n' "$root"
elif [[ -d /opt/rv-env ]]; then
printf '%s\n' /opt/rv-env
else
@@ -123,6 +126,9 @@ build_hazard3() {
"FREERTOS_KERNEL_PATH=$kernel" PROFILE=observe >&2 || return
elf="$build_dir/$task_stem/prog.elf"
test -s "$elf"
if [[ "$task_number" -eq 3 ]]; then
"$root/tests/check_task03_elf.sh" "$elf" >&2
fi
copy_artifact "$elf"
copy_artifact "${elf%.elf}.bin"
copy_artifact "${elf%.elf}.lst"
@@ -283,7 +289,7 @@ configure_debug_view() {
export STEM_DEBUG_MEMORY_EXPR='&g_coalesce_arena' STEM_DEBUG_MEMORY_LENGTH=160
;;
3)
export STEM_DEBUG_INITIAL_BREAK=heap4_fragmented_checkpoint
export STEM_DEBUG_INITIAL_BREAK=heap4_reset_checkpoint
export STEM_DEBUG_MEMORY_EXPR='ucHeap' STEM_DEBUG_MEMORY_LENGTH=160
;;
esac
+1 -1
View File
File diff suppressed because one or more lines are too long
+11 -11
View File
File diff suppressed because one or more lines are too long
+927 -534
View File
File diff suppressed because one or more lines are too long
+18 -13
View File
@@ -8,41 +8,46 @@ skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
title A2 STRUCTURE — RV32 header, split and two-sided coalescing
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
raw sizeof = 8 bytes on RV32
aligned xHeapStructSize = 16
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
02 A: header + 24 byte request
aligned total = 48 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
free = 4032 bytes after A
}
HEADER *-- ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
ALLOC -down-> REM : first-fit + split
class "04 Address-ordered free list" as LIST {
previous < inserted < current
A < B < C+tail
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
class "05 Previous / left neighbour" as LEFT {
previous + previous.size == inserted
merge previous first
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
class "06 Next / right neighbour" as RIGHT {
merged + merged.size == current
merge next second
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
LIST -down-> LEFT : heap_4 tests first
LEFT -down-> RIGHT : then tests next
note right of LIST
Ordering makes both physical
neighbours locally visible.
Address order exposes both physical
neighbours without scanning the arena.
end note
@enduml
+65 -60
View File
@@ -1,63 +1,68 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2921px" preserveAspectRatio="none" style="width:295px;height:620px;" version="1.1" viewBox="0 0 295 620" width="295.9262px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="202.1522" x="49.1929" y="8.2167">A2 STRUCTURE — in-band metadata and address order</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="54.7579" id="HEADER" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="81.4758" x="29.5926" y="16.4642"/><ellipse cx="39.5849" cy="27.2252" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.5698,29.7593 Q40.3055,29.8914 40.0173,29.9515 Q39.7291,30.0235 39.4048,30.0235 Q38.2758,30.0235 37.6753,29.2789 Q37.0869,28.5343 37.0869,27.1171 Q37.0869,25.6999 37.6753,24.9553 Q38.2758,24.2107 39.4048,24.2107 Q39.7291,24.2107 40.0173,24.2828 Q40.3175,24.3428 40.5698,24.4749 L40.5698,25.7119 Q40.2815,25.4477 40.0053,25.3276 Q39.7411,25.2075 39.4648,25.2075 Q38.8523,25.2075 38.5401,25.6879 Q38.2278,26.1683 38.2278,27.1171 Q38.2278,28.0659 38.5401,28.5463 Q38.8523,29.0267 39.4648,29.0267 Q39.7411,29.0267 40.0053,28.9066 Q40.2815,28.7865 40.5698,28.5223 L40.5698,29.7593 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="48.8086" y="30.2075">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="37.9862" y2="37.9862"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="34.2045" y="49.2775">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="42.2752" x="34.2045" y="59.7463">size : size_t</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="30.3613" x2="110.2998" y1="65.073" y2="65.073"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="65.2267" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="128.8701"/><ellipse cx="39.6618" cy="139.631" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M40.6466,142.1652 Q40.3824,142.2973 40.0942,142.3573 Q39.8059,142.4294 39.4816,142.4294 Q38.3527,142.4294 37.7522,141.6848 Q37.1637,140.9401 37.1637,139.523 Q37.1637,138.1058 37.7522,137.3612 Q38.3527,136.6165 39.4816,136.6165 Q39.8059,136.6165 40.0942,136.6886 Q40.3944,136.7486 40.6466,136.8808 L40.6466,138.1178 Q40.3584,137.8536 40.0821,137.7335 Q39.8179,137.6134 39.5417,137.6134 Q38.9292,137.6134 38.6169,138.0938 Q38.3047,138.5742 38.3047,139.523 Q38.3047,140.4717 38.6169,140.9521 Q38.9292,141.4325 39.5417,141.4325 Q39.8179,141.4325 40.0821,141.3124 Q40.3584,141.1923 40.6466,140.9281 L40.6466,142.1652 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="56.1107" x="52.5749" y="142.6134">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="150.392" y2="150.392"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="161.6833">02 header + 13 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="88.3935" x="17.6787" y="172.1522">aligned total = 32 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="104.535" x="17.6787" y="182.621">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="187.9477" y2="187.9477"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="54.7579" id="REM" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="89.9308" x="25.3651" y="251.7448"/><ellipse cx="35.3574" cy="262.5058" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M36.3422,265.0399 Q36.078,265.172 35.7898,265.232 Q35.5015,265.3041 35.1773,265.3041 Q34.0483,265.3041 33.4478,264.5595 Q32.8593,263.8148 32.8593,262.3977 Q32.8593,260.9805 33.4478,260.2359 Q34.0483,259.4913 35.1773,259.4913 Q35.5015,259.4913 35.7898,259.5633 Q36.09,259.6234 36.3422,259.7555 L36.3422,260.9925 Q36.054,260.7283 35.7778,260.6082 Q35.5135,260.4881 35.2373,260.4881 Q34.6248,260.4881 34.3125,260.9685 Q34.0003,261.4489 34.0003,262.3977 Q34.0003,263.3465 34.3125,263.8269 Q34.6248,264.3073 35.2373,264.3073 Q35.5135,264.3073 35.7778,264.1872 Q36.054,264.0671 36.3422,263.8028 L36.3422,265.0399 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="68.4089" x="44.5811" y="265.4881">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="273.2667" y2="273.2667"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="43.8125" x="29.9769" y="284.558">own header</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="59.9539" x="29.9769" y="295.0269">size = 224 bytes</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="26.1337" x2="114.5273" y1="300.3535" y2="300.3535"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="44.289" id="LIST" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="124.5196" x="8.0707" y="364.1506"/><ellipse cx="18.063" cy="374.9116" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M19.0478,377.4457 Q18.7836,377.5778 18.4954,377.6379 Q18.2071,377.7099 17.8829,377.7099 Q16.7539,377.7099 16.1534,376.9653 Q15.565,376.2207 15.565,374.8035 Q15.565,373.3863 16.1534,372.6417 Q16.7539,371.8971 17.8829,371.8971 Q18.2071,371.8971 18.4954,371.9692 Q18.7956,372.0292 19.0478,372.1613 L19.0478,373.3983 Q18.7596,373.1341 18.4834,373.014 Q18.2192,372.8939 17.9429,372.8939 Q17.3304,372.8939 17.0182,373.3743 Q16.7059,373.8547 16.7059,374.8035 Q16.7059,375.7523 17.0182,376.2327 Q17.3304,376.7131 17.9429,376.7131 Q18.2192,376.7131 18.4834,376.593 Q18.7596,376.4729 19.0478,376.2087 L19.0478,377.4457 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="102.9977" x="27.2867" y="377.8939">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="385.6726" y2="385.6726"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="107.6095" x="12.6826" y="396.9639">previous &lt; inserted &lt; current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="8.8394" x2="131.8217" y1="402.2905" y2="402.2905"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="44.289" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="114.5273" x="13.0669" y="466.0876"/><ellipse cx="33.0899" cy="476.8486" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M34.0748,479.3827 Q33.8105,479.5148 33.5223,479.5748 Q33.2341,479.6469 32.9098,479.6469 Q31.7808,479.6469 31.1803,478.9023 Q30.5919,478.1577 30.5919,476.7405 Q30.5919,475.3233 31.1803,474.5787 Q31.7808,473.8341 32.9098,473.8341 Q33.2341,473.8341 33.5223,473.9061 Q33.8225,473.9662 34.0748,474.0983 L34.0748,475.3353 Q33.7865,475.0711 33.5103,474.951 Q33.2461,474.8309 32.9698,474.8309 Q32.3573,474.8309 32.0451,475.3113 Q31.7328,475.7917 31.7328,476.7405 Q31.7328,477.6893 32.0451,478.1697 Q32.3573,478.6501 32.9698,478.6501 Q33.2461,478.6501 33.5103,478.53 Q33.7865,478.4099 34.0748,478.1457 L34.0748,479.3827 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="44.5427" y="479.8309">05 Right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="487.6095" y2="487.6095"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="105.3036" x="17.6787" y="498.9008">block + block.size == current</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="13.8355" x2="126.8255" y1="504.2275" y2="504.2275"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="44.289" id="LEFT" style="stroke: #2C7794; stroke-width: 1.1529592799906587;" width="131.4374" x="4.6118" y="568.0246"/><ellipse cx="34.7809" cy="578.7855" fill="#ADD1B2" rx="6.9178" ry="6.9178" style="stroke: #2C7794; stroke-width: 0.7686395199937726;"/><path d="M35.7658,581.3197 Q35.5015,581.4518 35.2133,581.5118 Q34.9251,581.5839 34.6008,581.5839 Q33.4718,581.5839 32.8713,580.8393 Q32.2829,580.0946 32.2829,578.6775 Q32.2829,577.2603 32.8713,576.5157 Q33.4718,575.771 34.6008,575.771 Q34.9251,575.771 35.2133,575.8431 Q35.5135,575.9032 35.7658,576.0353 L35.7658,577.2723 Q35.4775,577.0081 35.2013,576.888 Q34.9371,576.7679 34.6608,576.7679 Q34.0483,576.7679 33.7361,577.2483 Q33.4238,577.7287 33.4238,578.6775 Q33.4238,579.6262 33.7361,580.1066 Q34.0483,580.587 34.6608,580.587 Q34.9371,580.587 35.2013,580.4669 Q35.4775,580.3468 35.7658,580.0826 L35.7658,581.3197 Z "/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="48.2321" y="581.7679">06 Left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="589.5465" y2="589.5465"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="122.2137" x="9.2237" y="600.8378">previous + previous.size == block</text><line style="stroke: #2C7794; stroke-width: 1.1529592799906587;" x1="5.3805" x2="135.2806" y1="606.1645" y2="606.1645"/><path d="M159.877,371.9831 L159.877,383.2206 L132.7671,386.2952 L159.877,389.3697 L159.877,400.6072 A0,0 0 0 0 159.877,400.6072 L286.7025,400.6072 A0,0 0 0 0 286.7025,400.6072 L286.7025,379.6695 L279.0161,371.9831 L159.877,371.9831 A0,0 0 0 0 159.877,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><path d="M279.0161,371.9831 L279.0161,379.6695 L286.7025,379.6695 L279.0161,371.9831 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="110.6841" x="164.4889" y="384.043">Ordering makes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="96.0799" x="164.4889" y="394.5119">neighbours locally visible.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.3305,82.6749 C70.3305,97.5173 70.3305,114.3505 70.3305,128.5626 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,72.7056,67.256,77.3174,70.3305,81.9293,73.4051,77.3174,70.3305,72.7056" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="65.3344" x="71.0992" y="103.2667">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.3305,194.2813 C70.3305,210.5842 70.3305,230.3382 70.3305,246.6026 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,250.3689,73.4051,243.4512,70.3305,246.5257,67.256,243.4512,70.3305,250.3689" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="70.7148" x="71.0992" y="226.1414">split preserves 256</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.3305,306.8178 C70.3305,322.8901 70.3305,343.1975 70.3305,359.1622 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,362.8055,73.4051,355.8878,70.3305,358.9623,67.256,355.8878,70.3305,362.8055" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="63.7971" x="71.0992" y="338.5473">insert by address</text><!--MD5=[6bd3103bbaa36e7d502940b82c286473]
link LIST to RIGHT--><path d="M70.3305,408.6011 C70.3305,423.9508 70.3305,444.681 70.3305,461.0377 " fill="none" id="LIST-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,464.7963,73.4051,457.8786,70.3305,460.9531,67.256,457.8786,70.3305,464.7963" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="30.7456" x="71.0992" y="440.4842">join first</text><!--MD5=[f41c07ebada6943a8deaf240fd528885]
link RIGHT to LEFT--><path d="M70.3305,510.538 C70.3305,525.8878 70.3305,546.618 70.3305,562.9746 " fill="none" id="RIGHT-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><polygon fill="#8095A1" points="70.3305,566.7333,73.4051,559.8155,70.3305,562.8901,67.256,559.8155,70.3305,566.7333" style="stroke: #8095A1; stroke-width: 0.7686395199937726;"/><text fill="#000000" font-family="Monospace" font-size="7.6864" lengthAdjust="spacingAndGlyphs" textLength="47.6557" x="71.0992" y="542.4212">then join left</text><!--MD5=[83344144544ae5f259c61315a4ceaf0d]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — in-band metadata and address order
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
}
class "Allocated block" as ALLOC {
02 header + 13 byte request
aligned total = 32 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
size = 224 bytes
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : split preserves 256
class "04 Address-ordered free list" as LIST {
previous < inserted < current
}
class "05 Right neighbour" as RIGHT {
block + block.size == current
}
class "06 Left neighbour" as LEFT {
previous + previous.size == block
}
REM -down-> LIST : insert by address
LIST -down-> RIGHT : join first
RIGHT -down-> LEFT : then join left
note right of LIST
Ordering makes both physical
neighbours locally visible.
end note
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="620.2694px" preserveAspectRatio="none" style="width:312px;height:620px;" version="1.1" viewBox="0 0 312 620" width="312.6158px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="211.9549" x="52.4571" y="7.5779">A2 STRUCTURE — RV32 header, split and two-sided coalescing</text><!--MD5=[9827fb78ff6e3f59cfadf959dc26af7c]
class HEADER--><rect fill="#EDF6FA" height="69.8104" id="HEADER" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="107.7497" x="16.3042" y="15.1133"/><ellipse cx="40.1935" cy="25.0376" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M41.1017,27.3747 Q40.858,27.4965 40.5922,27.5519 Q40.3264,27.6184 40.0273,27.6184 Q38.9861,27.6184 38.4323,26.9316 Q37.8896,26.2449 37.8896,24.9379 Q37.8896,23.6309 38.4323,22.9442 Q38.9861,22.2575 40.0273,22.2575 Q40.3264,22.2575 40.5922,22.3239 Q40.8691,22.3793 41.1017,22.5011 L41.1017,23.642 Q40.8359,23.3983 40.5811,23.2876 Q40.3374,23.1768 40.0827,23.1768 Q39.5178,23.1768 39.2298,23.6198 Q38.9418,24.0629 38.9418,24.9379 Q38.9418,25.8129 39.2298,26.256 Q39.5178,26.699 40.0827,26.699 Q40.3374,26.699 40.5811,26.5883 Q40.8359,26.4775 41.1017,26.2338 L41.1017,27.3747 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="55.2926" x="51.9609" y="27.7881">01 Block header</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="17.0131" x2="123.345" y1="34.9619" y2="34.9619"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="63.0903" x="20.5575" y="45.3753">next : BlockLink_t*</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="38.9884" x="20.5575" y="55.0303">size : size_t</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="97.8253" x="20.5575" y="64.6852">raw sizeof = 8 bytes on RV32</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="99.2431" x="20.5575" y="74.3401">aligned xHeapStructSize = 16</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="17.0131" x2="123.345" y1="79.2527" y2="79.2527"/><!--MD5=[40d637119be40bcfdc4ce848efbdda9e]
class ALLOC--><rect fill="#EDF6FA" height="60.1555" id="ALLOC" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="114.1296" x="13.1143" y="138.0897"/><ellipse cx="41.6467" cy="148.014" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M42.5549,150.3511 Q42.3112,150.4729 42.0454,150.5283 Q41.7796,150.5948 41.4805,150.5948 Q40.4393,150.5948 39.8855,149.908 Q39.3428,149.2213 39.3428,147.9143 Q39.3428,146.6073 39.8855,145.9206 Q40.4393,145.2339 41.4805,145.2339 Q41.7796,145.2339 42.0454,145.3003 Q42.3223,145.3557 42.5549,145.4775 L42.5549,146.6184 Q42.2891,146.3747 42.0343,146.2639 Q41.7906,146.1532 41.5359,146.1532 Q40.971,146.1532 40.683,146.5962 Q40.395,147.0393 40.395,147.9143 Q40.395,148.7893 40.683,149.2324 Q40.971,149.6754 41.5359,149.6754 Q41.7906,149.6754 42.0343,149.5647 Q42.2891,149.4539 42.5549,149.2102 L42.5549,150.3511 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="51.7482" x="54.052" y="150.7644">Allocated block</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.8231" x2="126.535" y1="157.9383" y2="157.9383"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="105.623" x="17.3675" y="168.3517">02 A: header + 24 byte request</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="81.5211" x="17.3675" y="178.0067">aligned total = 48 bytes</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="96.4076" x="17.3675" y="187.6616">payload begins after header</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.8231" x2="126.535" y1="192.5741" y2="192.5741"/><!--MD5=[71c2adef9be32489055f250a531e7c6f]
class REM--><rect fill="#EDF6FA" height="50.5005" id="REM" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="92.8632" x="23.7475" y="251.4111"/><ellipse cx="37.4288" cy="261.3354" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M38.3371,263.6725 Q38.0934,263.7944 37.8276,263.8497 Q37.5617,263.9162 37.2627,263.9162 Q36.2215,263.9162 35.6677,263.2295 Q35.125,262.5427 35.125,261.2357 Q35.125,259.9287 35.6677,259.242 Q36.2215,258.5553 37.2627,258.5553 Q37.5617,258.5553 37.8276,258.6218 Q38.1045,258.6771 38.3371,258.799 L38.3371,259.9398 Q38.0712,259.6961 37.8165,259.5854 Q37.5728,259.4746 37.3181,259.4746 Q36.7532,259.4746 36.4652,259.9177 Q36.1772,260.3607 36.1772,261.2357 Q36.1772,262.1108 36.4652,262.5538 Q36.7532,262.9969 37.3181,262.9969 Q37.5728,262.9969 37.8165,262.8861 Q38.0712,262.7753 38.3371,262.5317 L38.3371,263.6725 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="63.0903" x="46.9278" y="264.0859">03 Free remainder</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="24.4563" x2="115.9018" y1="271.2597" y2="271.2597"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="40.4061" x="28.0007" y="281.6732">own header</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="84.3566" x="28.0007" y="291.3281">free = 4032 bytes after A</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="24.4563" x2="115.9018" y1="296.2406" y2="296.2406"/><!--MD5=[b0a0edd67d9eafaaa5639bbe6382adce]
class LIST--><rect fill="#EDF6FA" height="50.5005" id="LIST" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="114.8384" x="12.7598" y="355.0776"/><ellipse cx="21.9753" cy="365.0019" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M22.8835,367.339 Q22.6398,367.4609 22.374,367.5162 Q22.1082,367.5827 21.8091,367.5827 Q20.7679,367.5827 20.2141,366.896 Q19.6714,366.2093 19.6714,364.9023 Q19.6714,363.5953 20.2141,362.9085 Q20.7679,362.2218 21.8091,362.2218 Q22.1082,362.2218 22.374,362.2883 Q22.6509,362.3436 22.8835,362.4655 L22.8835,363.6063 Q22.6177,363.3627 22.3629,363.2519 Q22.1192,363.1411 21.8645,363.1411 Q21.2996,363.1411 21.0116,363.5842 Q20.7236,364.0272 20.7236,364.9023 Q20.7236,365.7773 21.0116,366.2203 Q21.2996,366.6634 21.8645,366.6634 Q22.1192,366.6634 22.3629,366.5526 Q22.6177,366.4419 22.8835,366.1982 L22.8835,367.339 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="94.9898" x="30.4818" y="367.7524">04 Address-ordered free list</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.4687" x2="126.8894" y1="374.9263" y2="374.9263"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="99.2431" x="17.0131" y="385.3397">previous &lt; inserted &lt; current</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="46.0772" x="17.0131" y="394.9946">A &lt; B &lt; C+tail</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="13.4687" x2="126.8894" y1="399.9071" y2="399.9071"/><!--MD5=[007d3a1820cefd008c8dbdad7e6fdec6]
class LEFT--><rect fill="#EDF6FA" height="50.5005" id="LEFT" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="131.8515" x="4.2533" y="458.7441"/><ellipse cx="21.1246" cy="468.6684" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M22.0329,471.0055 Q21.7892,471.1274 21.5233,471.1828 Q21.2575,471.2492 20.9585,471.2492 Q19.9173,471.2492 19.3635,470.5625 Q18.8207,469.8758 18.8207,468.5688 Q18.8207,467.2618 19.3635,466.575 Q19.9173,465.8883 20.9585,465.8883 Q21.2575,465.8883 21.5233,465.9548 Q21.8003,466.0102 22.0329,466.132 L22.0329,467.2728 Q21.767,467.0292 21.5123,466.9184 Q21.2686,466.8076 21.0138,466.8076 Q20.449,466.8076 20.161,467.2507 Q19.873,467.6937 19.873,468.5688 Q19.873,469.4438 20.161,469.8868 Q20.449,470.3299 21.0138,470.3299 Q21.2686,470.3299 21.5123,470.2191 Q21.767,470.1084 22.0329,469.8647 L22.0329,471.0055 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="94.9898" x="31.3325" y="471.4189">05 Previous / left neighbour</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="4.9622" x2="135.3959" y1="478.5928" y2="478.5928"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="123.345" x="8.5066" y="489.0062">previous + previous.size == inserted</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="68.7613" x="8.5066" y="498.6611">merge previous first</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="4.9622" x2="135.3959" y1="503.5736" y2="503.5736"/><!--MD5=[490fcd32b6546c9bc615869efabd094a]
class RIGHT--><rect fill="#EDF6FA" height="50.5005" id="RIGHT" style="stroke: #2C7794; stroke-width: 1.0633189422886131;" width="122.6361" x="8.861" y="562.4106"/><ellipse cx="25.0943" cy="572.335" fill="#ADD1B2" rx="6.3799" ry="6.3799" style="stroke: #2C7794; stroke-width: 0.7088792948590754;"/><path d="M26.0026,574.672 Q25.7589,574.7939 25.4931,574.8493 Q25.2272,574.9157 24.9282,574.9157 Q23.887,574.9157 23.3332,574.229 Q22.7905,573.5423 22.7905,572.2353 Q22.7905,570.9283 23.3332,570.2415 Q23.887,569.5548 24.9282,569.5548 Q25.2272,569.5548 25.4931,569.6213 Q25.77,569.6767 26.0026,569.7985 L26.0026,570.9394 Q25.7367,570.6957 25.482,570.5849 Q25.2383,570.4741 24.9836,570.4741 Q24.4187,570.4741 24.1307,570.9172 Q23.8427,571.3602 23.8427,572.2353 Q23.8427,573.1103 24.1307,573.5533 Q24.4187,573.9964 24.9836,573.9964 Q25.2383,573.9964 25.482,573.8856 Q25.7367,573.7749 26.0026,573.5312 L26.0026,574.672 Z "/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="87.1922" x="35.1604" y="575.0854">06 Next / right neighbour</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="9.5699" x2="130.7882" y1="582.2593" y2="582.2593"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="114.1296" x="13.1143" y="592.6727">merged + merged.size == current</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="65.2169" x="13.1143" y="602.3276">merge next second</text><line style="stroke: #2C7794; stroke-width: 1.0633189422886131;" x1="9.5699" x2="130.7882" y1="607.2402" y2="607.2402"/><path d="M152.409,367.1286 L152.409,377.4924 L127.9173,380.3279 L152.409,383.1634 L152.409,393.5272 A0,0 0 0 0 152.409,393.5272 L304.1092,393.5272 A0,0 0 0 0 304.1092,393.5272 L304.1092,374.2174 L297.0204,367.1286 L152.409,367.1286 A0,0 0 0 0 152.409,367.1286 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7088792948590754;"/><path d="M297.0204,367.1286 L297.0204,374.2174 L304.1092,374.2174 L297.0204,367.1286 " fill="#FBFB77" style="stroke: #A80036; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="124.7628" x="156.6623" y="378.2509">Address order exposes both physical</text><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="136.8137" x="156.6623" y="387.9058">neighbours without scanning the arena.</text><!--MD5=[fc2657b7de304bb41a5d36ac60748945]
reverse link HEADER to ALLOC--><path d="M70.1791,95.245 C70.1791,109.5006 70.1791,124.9329 70.1791,137.8557 " fill="none" id="HEADER&lt;-ALLOC" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,86.1926,67.3435,90.4459,70.1791,94.6992,73.0146,90.4459,70.1791,86.1926" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="60.2547" x="70.8879" y="114.4769">precedes payload</text><!--MD5=[bb73b5a7e21afff1a1d0c43dcbd5d11a]
link ALLOC to REM--><path d="M70.1791,198.4224 C70.1791,213.4506 70.1791,231.6688 70.1791,246.6687 " fill="none" id="ALLOC-&gt;REM" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,250.1422,73.0146,243.7623,70.1791,246.5978,67.3435,243.7623,70.1791,250.1422" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="46.0772" x="70.8879" y="227.7983">first-fit + split</text><!--MD5=[32aec76f28e14f88b0d74d9f592c80fb]
link REM to LIST--><path d="M70.1791,302.1243 C70.1791,316.5855 70.1791,334.9242 70.1791,350.1297 " fill="none" id="REM-&gt;LIST" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,353.667,73.0146,347.287,70.1791,350.1226,67.3435,347.287,70.1791,353.667" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="58.837" x="70.8879" y="331.4649">insert by address</text><!--MD5=[cc3605e5f4ba919f564e1d79e1300518]
link LIST to LEFT--><path d="M70.1791,405.7909 C70.1791,420.252 70.1791,438.5907 70.1791,453.7962 " fill="none" id="LIST-&gt;LEFT" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,457.3335,73.0146,450.9536,70.1791,453.7891,67.3435,450.9536,70.1791,457.3335" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="58.837" x="70.8879" y="435.1314">heap_4 tests first</text><!--MD5=[e8df39c6ef374d140d6cfa6fe0b5ac87]
link LEFT to RIGHT--><path d="M70.1791,509.4574 C70.1791,523.9185 70.1791,542.2572 70.1791,557.4627 " fill="none" id="LEFT-&gt;RIGHT" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><polygon fill="#8095A1" points="70.1791,561,73.0146,554.6201,70.1791,557.4556,67.3435,554.6201,70.1791,561" style="stroke: #8095A1; stroke-width: 0.7088792948590754;"/><text fill="#000000" font-family="Monospace" font-size="7.0888" lengthAdjust="spacingAndGlyphs" textLength="51.7482" x="70.8879" y="538.7979">then tests next</text><!--MD5=[d8b34fb36bd2f73cd895320cbfc22e63]
@startuml
scale 620 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam classBorderColor #2c7794
skinparam classBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A2 STRUCTURE — RV32 header, split and two-sided coalescing
class "01 Block header" as HEADER {
next : BlockLink_t*
size : size_t
raw sizeof = 8 bytes on RV32
aligned xHeapStructSize = 16
}
class "Allocated block" as ALLOC {
02 A: header + 24 byte request
aligned total = 48 bytes
payload begins after header
}
class "03 Free remainder" as REM {
own header
free = 4032 bytes after A
}
HEADER *- - ALLOC : precedes payload
ALLOC -down-> REM : first-fit + split
class "04 Address-ordered free list" as LIST {
previous < inserted < current
A < B < C+tail
}
class "05 Previous / left neighbour" as LEFT {
previous + previous.size == inserted
merge previous first
}
class "06 Next / right neighbour" as RIGHT {
merged + merged.size == current
merge next second
}
REM -down-> LIST : insert by address
LIST -down-> LEFT : heap_4 tests first
LEFT -down-> RIGHT : then tests next
note right of LIST
Address order exposes both physical
neighbours without scanning the arena.
end note
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

+13 -13
View File
@@ -8,22 +8,22 @@ skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
title A5 FLOW — eight deterministic Hazard3 replay states
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
rectangle "01 E01 RESET\n1 block · free=4080\nraw header=8 · aligned=16" as S1
rectangle "02 E02 ALLOC A(24)\nconsumed=48\nfree=4032" as S2
rectangle "03 E03 ALLOC B(40)\nconsumed=64\nfree=3968" as S3
rectangle "04 E04 ALLOC C(16)\nconsumed=32\nfree=3936" as S4
rectangle "05 E05 FREE A\n2 free blocks\nfree=3984" as S5
rectangle "06 E06 FREE C\n2 blocks · fragmented\nfree=4016" as S6
rectangle "07 E07 FREE B\nmerge left + right\n1 block · free=4080" as S7
rectangle "08 E08 OOM / VERIFY\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S3 -right-> S4 : split remainder
S4 -down-> S5 : vPortFree(A)
S5 -left-> S6 : vPortFree(C)
S6 -left-> S7 : vPortFree(B)
S7 -left-> S8 : oversized request
@enduml
+45 -45
View File
@@ -1,48 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="263.7004px" preserveAspectRatio="none" style="width:811px;height:263px;" version="1.1" viewBox="0 0 811 263" width="811.5712px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="231.1894" x="294.4053" y="11.5848">A5 FLOW — allocate, fragment, coalesce, verify</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="108.37" x="7.2247" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="45.7562" x="19.2658" y="55.942">01 RESET</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="19.2658" y="70.7021">initial free = 4080</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="104.7577" x="224.5668" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="236.6079" y="48.5608">02 ALLOC A</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="80.6755" x="236.6079" y="63.3209">24 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="63.8179" x="236.6079" y="78.081">first-fit + split</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="127.6358" x="450.3377" y="24.9348"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="74.6549" x="462.3789" y="48.5608">03 ALLOC B / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="103.5536" x="462.3789" y="63.3209">40 + 16 byte payload</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="462.3789" y="78.081">after = 3952</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="53.6024" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="671.2922" y="32.316"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="683.3333" y="55.942">04 FREE A / C</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="683.3333" y="70.7021">B remains allocated</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="132.4523" x="665.8737" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="108.37" x="677.9148" y="206.0345">05 E01 FRAGMENTED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="62.6138" x="677.9148" y="220.7946">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="84.2878" x="677.9148" y="235.5547">current &gt; largest</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="111.9824" x="465.3891" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="477.4302" y="206.0345">06 FREE B</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="87.9001" x="477.4302" y="220.7946">insert by address</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="72.2467" x="477.4302" y="235.5547">join right + left</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="121.6153" x="258.2819" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="97.533" x="270.3231" y="206.0345">07 E02 COALESCED</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="57.7974" x="270.3231" y="220.7946">1 free block</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="59.0015" x="270.3231" y="235.5547">final = initial</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="68.3625" style="stroke: #2C7794; stroke-width: 1.8061674008810573;" width="115.5947" x="8.4288" y="182.4086"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="79.4714" x="20.4699" y="206.0345">08 OOM CHECK</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="73.4508" x="20.4699" y="220.7946">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="91.5125" x="20.4699" y="235.5547">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M115.7994,59.1196 C146.5043,59.1196 184.9515,59.1196 216.5956,59.1196 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="222.2429,59.1196,211.4059,54.3031,216.2223,59.1196,211.4059,63.936,222.2429,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="65.022" x="137.5698" y="51.4386">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M329.5894,59.1196 C362.7266,59.1196 405.9181,59.1196 442.1979,59.1196 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="448.0018,59.1196,437.1648,54.3031,441.9812,59.1196,437.1648,63.936,448.0018,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="77.0631" x="351.2996" y="51.4386">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M578.3709,59.1196 C605.1142,59.1196 636.2044,59.1196 663.4053,59.1196 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="669.1369,59.1196,658.2999,54.3031,663.1163,59.1196,658.2999,63.936,669.1369,59.1196" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="49.3686" x="599.9486" y="51.4386">vPortFree</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M732.0999,86.2723 C732.0999,110.3906 732.0999,146.6826 732.0999,174.6541 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="732.0999,180.494,736.9163,169.657,732.0999,174.4735,727.2834,169.657,732.0999,180.494" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="51.7768" x="733.304" y="142.2166">heap stats</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M585.5595,216.5812 C610.8338,216.5812 639.8529,216.5812 665.368,216.5812 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="579.6714,216.5812,590.5084,221.3977,585.6919,216.5812,590.5084,211.7648,579.6714,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="44.5521" x="599.3465" y="208.9003">continue</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M388.0009,216.5812 C413.0223,216.5812 440.9938,216.5812 464.8352,216.5812 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="382.1489,216.5812,392.9996,221.3667,388.1694,216.564,392.9721,211.7339,382.1489,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="40.9398" x="402.1733" y="208.9003">coalesce</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M132.1994,216.5812 C171.0802,216.5812 219.9551,216.5812 257.9689,216.5812 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><polygon fill="#8095A1" points="126.3836,216.5812,137.2206,221.3977,132.4041,216.5812,137.2206,211.7648,126.3836,216.5812" style="stroke: #8095A1; stroke-width: 1.2041116005873715;"/><text fill="#000000" font-family="Monospace" font-size="10.837" lengthAdjust="spacingAndGlyphs" textLength="90.3084" x="145.9985" y="208.9003">oversized request</text><!--MD5=[2e2dc33d46c2ffc454d35cea5ea70934]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — allocate, fragment, coalesce, verify
rectangle "01 RESET\ninitial free = 4080" as S1
rectangle "02 ALLOC A\n24 byte payload\nfirst-fit + split" as S2
rectangle "03 ALLOC B / C\n40 + 16 byte payload\nafter = 3952" as S3
rectangle "04 FREE A / C\nB remains allocated" as S4
rectangle "05 E01 FRAGMENTED\n2 free blocks\ncurrent > largest" as S5
rectangle "06 FREE B\ninsert by address\njoin right + left" as S6
rectangle "07 E02 COALESCED\n1 free block\nfinal = initial" as S7
rectangle "08 OOM CHECK\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : vPortFree
S4 -down-> S5 : heap stats
S5 -left-> S6 : continue
S6 -left-> S7 : coalesce
S7 -left-> S8 : oversized request
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="236.6008px" preserveAspectRatio="none" style="width:812px;height:236px;" version="1.1" viewBox="0 0 812 236" width="812.4374px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="239.8419" x="290.0791" y="10.3943">A5 FLOW — eight deterministic Hazard3 replay states</text><!--MD5=[d0cae5ff9305becd6f502d4fe4f41481]
entity S1--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="142.6087" x="6.4822" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="59.4203" x="17.2859" y="43.5704">01 E01 RESET</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="83.1884" x="17.2859" y="56.8136">1 block · free=4080</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="121.0013" x="17.2859" y="70.0569">raw header=8 · aligned=16</text><!--MD5=[d3395af3100fe8cebf35265100c4415f]
entity S2--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="247.4045" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="258.2082" y="43.5704">02 E02 ALLOC A(24)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="258.2082" y="56.8136">consumed=48</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="258.2082" y="70.0569">free=4032</text><!--MD5=[6c7192638421eaf134d201765ac5db29]
entity S3--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="466.7194" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="477.5231" y="43.5704">03 E03 ALLOC B(40)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="477.5231" y="56.8136">consumed=64</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="477.5231" y="70.0569">free=3968</text><!--MD5=[01b905ebe31ca24275b86a9951c478d0]
entity S4--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="110.1976" x="686.0343" y="22.3724"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="88.5903" x="696.8379" y="43.5704">04 E04 ALLOC C(16)</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="63.7418" x="696.8379" y="56.8136">consumed=32</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="696.8379" y="70.0569">free=3936</text><!--MD5=[099bd2cf1f4f3a6dbf2f1fde6174f38e]
entity S5--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="84.2688" x="698.9987" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="709.8024" y="184.861">05 E05 FREE A</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="56.1792" x="709.8024" y="198.1043">2 free blocks</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="709.8024" y="211.3475">free=3984</text><!--MD5=[0656c7721b015b9ca8cf2e2c2e8f5aee]
entity S6--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="118.8406" x="484.0053" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="494.809" y="184.861">06 E06 FREE C</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="97.2332" x="494.809" y="198.1043">2 blocks · fragmented</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="45.3755" x="494.809" y="211.3475">free=4016</text><!--MD5=[6ba532df225878998c5769132c3837e2]
entity S7--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="104.7958" x="282.5165" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="62.6614" x="293.3202" y="184.861">07 E07 FREE B</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="78.8669" x="293.3202" y="198.1043">merge left + right</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="83.1884" x="293.3202" y="211.3475">1 block · free=4080</text><!--MD5=[ce611cd767df6ac8a45071985dabb378]
entity S8--><rect fill="#EDF6FA" height="61.3371" style="stroke: #2C7794; stroke-width: 1.6205533596837944;" width="115.5995" x="46.996" y="163.663"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="93.9921" x="57.7997" y="184.861">08 E08 OOM / VERIFY</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="65.9025" x="57.7997" y="198.1043">NULL · hook=1</text><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="82.108" x="57.7997" y="211.3475">asserts=0 · PASS=1</text><!--MD5=[15cb110786dd224ca6a510a3d2a24e20]
link S1 to S2--><path d="M149.5014,53.044 C178.639,53.044 211.9792,53.044 240.0796,53.044 " fill="none" id="S1-&gt;S2" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="245.4706,53.044,235.7473,48.7226,240.0688,53.044,235.7473,57.3655,245.4706,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="58.3399" x="169.0777" y="46.1524">pvPortMalloc</text><!--MD5=[8eac89d31ced3c9003fbd6a8a005c745]
link S2 to S3--><path d="M358.1315,53.044 C389.0516,53.044 427.6208,53.044 459.5457,53.044 " fill="none" id="S2-&gt;S3" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="464.6126,53.044,454.8893,48.7226,459.2108,53.044,454.8893,57.3655,464.6126,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="69.1436" x="377.5889" y="46.1524">split remainder</text><!--MD5=[82e284a09e4ebade00512bdc77bff32c]
link S3 to S4--><path d="M577.4464,53.044 C608.3665,53.044 646.9357,53.044 678.8606,53.044 " fill="none" id="S3-&gt;S4" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="683.9275,53.044,674.2042,48.7226,678.5257,53.044,674.2042,57.3655,683.9275,53.044" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="69.1436" x="596.9038" y="46.1524">split remainder</text><!--MD5=[0e6b031b378ab8978eaa734a548bdfb6]
link S4 to S5--><path d="M741.1331,83.9642 C741.1331,105.2367 741.1331,133.9637 741.1331,156.6298 " fill="none" id="S4-&gt;S5" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="741.1331,161.8156,745.4545,152.0923,741.1331,156.4137,736.8116,152.0923,741.1331,161.8156" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="742.2134" y="127.6015">vPortFree(A)</text><!--MD5=[3c9aaad44b43c509ca535c241fdd0151]
reverse link S6 to S5--><path d="M610.2356,194.3239 C639.492,194.3239 672.9618,194.3239 698.7286,194.3239 " fill="none" id="S6&lt;-S5" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="604.9202,194.3239,614.6435,198.6454,610.322,194.3239,614.6435,190.0024,604.9202,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="622.2925" y="187.4323">vPortFree(C)</text><!--MD5=[5f6ea4567bb0950bff1d27387d49b4c2]
reverse link S7 to S6--><path d="M394.7668,194.3239 C422.6403,194.3239 455.7212,194.3239 483.5947,194.3239 " fill="none" id="S7&lt;-S6" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="389.4406,194.3239,399.1639,198.6454,394.8424,194.3239,399.1639,190.0024,389.4406,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="57.2596" x="407.029" y="187.4323">vPortFree(B)</text><!--MD5=[630b9631f886cf9c8b0d992525b86cf3]
reverse link S8 to S7--><path d="M169.8448,194.3239 C205.3025,194.3239 248.6253,194.3239 281.9871,194.3239 " fill="none" id="S8&lt;-S7" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><polygon fill="#8095A1" points="164.497,194.3239,174.2203,198.6454,169.8988,194.3239,174.2203,190.0024,164.497,194.3239" style="stroke: #8095A1; stroke-width: 1.080368906455863;"/><text fill="#000000" font-family="Monospace" font-size="9.7233" lengthAdjust="spacingAndGlyphs" textLength="81.0277" x="182.0422" y="187.4323">oversized request</text><!--MD5=[9f7e06700e17220ce72e8c57ed6bc819]
@startuml
scale 820 width
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A5 FLOW — eight deterministic Hazard3 replay states
rectangle "01 E01 RESET\n1 block · free=4080\nraw header=8 · aligned=16" as S1
rectangle "02 E02 ALLOC A(24)\nconsumed=48\nfree=4032" as S2
rectangle "03 E03 ALLOC B(40)\nconsumed=64\nfree=3968" as S3
rectangle "04 E04 ALLOC C(16)\nconsumed=32\nfree=3936" as S4
rectangle "05 E05 FREE A\n2 free blocks\nfree=3984" as S5
rectangle "06 E06 FREE C\n2 blocks · fragmented\nfree=4016" as S6
rectangle "07 E07 FREE B\nmerge left + right\n1 block · free=4080" as S7
rectangle "08 E08 OOM / VERIFY\nNULL · hook=1\nasserts=0 · PASS=1" as S8
S1 -right-> S2 : pvPortMalloc
S2 -right-> S3 : split remainder
S3 -right-> S4 : split remainder
S4 -down-> S5 : vPortFree(A)
S5 -left-> S6 : vPortFree(C)
S6 -left-> S7 : vPortFree(B)
S7 -left-> S8 : oversized request
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

+11 -11
View File
@@ -8,21 +8,21 @@ skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
title A6 STATE — reusable states of the same RV32 arena
[*] --> Free : 01 one list node
Free --> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated --> Fragmented : free A and C
Fragmented : 03 two free blocks
[*] --> Free : 01 E01 one list node
Free --> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936
Allocated --> Fragmented : E05 free A\nE06 free C
Fragmented : 03 E06 two free blocks
Fragmented : sum free > largest block
Fragmented --> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced --> OOMChecked : request > arena
OOMChecked : NULL + hook once
Fragmented --> Coalesced : 04 E07 free B\nmerge previous, then next
Coalesced : one free block
Coalesced : current = largest = initial
Coalesced --> OOMChecked : 05 E08 request > arena
OOMChecked : NULL · hook=1 · PASS=1
OOMChecked --> [*]
state "05 minimum-ever" as MIN
state "minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
+39 -39
View File
@@ -1,42 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2823px" preserveAspectRatio="none" style="width:346px;height:600px;" version="1.1" viewBox="0 0 346 600" width="346.9454px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="154.5281" x="99.1803" y="7.9418">A6 STATE — block state and heap statistics</text><ellipse cx="212.8476" cy="23.6993" fill="#000000" rx="7.4292" ry="7.4292" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="37.1462" x="194.2745" y="86.8478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="194.2745" x2="231.4207" y1="104.3956" y2="104.3956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="15.6014" x="205.0469" y="98.5042">Free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="48.29" x="188.7026" y="190.1142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="188.7026" x2="236.9926" y1="207.662" y2="207.662"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="33.4316" x="196.1318" y="201.7706">Allocated</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="101.0376" x="111.0671" y="282.9796"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="111.0671" x2="212.1047" y1="300.5275" y2="300.5275"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="140.0411" y="294.6361">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="65.3773" x="114.7817" y="312.1839">03 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="86.1791" x="114.7817" y="322.3025">sum free &gt; largest block</text><rect fill="#EDF6FA" height="45.2143" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="103.2664" x="4.4575" y="394.3142"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="4.4575" x2="107.7239" y1="411.862" y2="411.862"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="36.4033" x="37.8891" y="405.9706">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="61.6627" x="8.1722" y="423.5185">04 one free block</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="88.4079" x="8.1722" y="433.6371">current free = initial free</text><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="78.7499" x="16.7158" y="495.2478"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="16.7158" x2="95.4657" y1="512.7956" y2="512.7956"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="48.29" x="31.9457" y="506.9042">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="63.8914" x="20.4304" y="524.4521">NULL + hook once</text><ellipse cx="56.0907" cy="585.1415" fill="none" rx="7.4292" ry="7.4292" style="stroke: #000000; stroke-width: 0.742923663722561;"/><ellipse cx="56.4622" cy="585.513" fill="#000000" rx="4.4575" ry="4.4575" style="stroke: none; stroke-width: 0.742923663722561;"/><rect fill="#EDF6FA" height="37.1462" rx="9.2865" ry="9.2865" style="stroke: #2C7794; stroke-width: 1.1143854955838415;" width="77.2641" x="190.5599" y="398.3482"/><line style="stroke: #2C7794; stroke-width: 1.1143854955838415;" x1="190.5599" x2="267.824" y1="415.8961" y2="415.8961"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="62.4056" x="197.9892" y="410.0047">05 minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M212.8476,31.2845 C212.8476,42.3689 212.8476,64.7384 212.8476,81.885 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,85.4436,215.8193,78.7573,212.8476,81.729,209.8759,78.7573,212.8476,85.4436" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.948" x="213.5906" y="62.101">01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M212.8476,124.358 C212.8476,141.3635 212.8476,166.8235 212.8476,185.1663 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="212.8476,188.7843,215.8193,182.098,212.8476,185.0697,209.8759,182.098,212.8476,188.7843" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="59.4339" x="224.3629" y="154.9664">02 first-fit + split</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="80.9787" x="213.5906" y="165.085">current free decreases</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M203.0856,227.6021 C195.3518,241.9925 184.4382,262.304 175.746,278.4849 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="174.0076,281.7241,179.7784,277.2257,175.7573,278.4473,174.5357,274.4262,174.0076,281.7241" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="43.0896" x="191.028" y="258.2328">free A and C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M110.7031,318.744 C93.6455,325.4006 76.1571,335.4523 65.0058,350.4817 C56.8188,361.5141 54.33,376.536 54.0031,389.4331 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="53.9808,392.9546,56.9907,386.2854,54.0021,389.24,51.0474,386.2514,53.9808,392.9546" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="21.5448" x="110.6956" y="359.1664">free B</text><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="111.4385" x="65.7487" y="369.285">address-order joins neighbours</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M56.0907,439.7959 C56.0907,454.8922 56.0907,474.8471 56.0907,490.1216 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,493.7842,59.0624,487.0979,56.0907,490.0696,53.119,487.0979,56.0907,493.7842" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="57.2051" x="56.8337" y="470.501">request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M56.0907,532.55 C56.0907,545.306 56.0907,562.0366 56.0907,573.0022 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="56.0907,576.4716,59.0624,569.7853,56.0907,572.757,53.119,569.7853,56.0907,576.4716" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M228.8056,227.6169 C233.6049,234.1101 238.3299,241.7622 241.0787,249.548 C259.2432,300.9509 258.5449,318.5879 247.765,372.0264 C246.2941,379.3145 243.5824,386.8998 240.685,393.6827 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="239.214,396.9813,244.6551,392.0892,240.7295,393.5899,239.2288,389.6643,239.214,396.9813" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="82.4645" x="256.1378" y="308.6996">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M172.2766,328.3871 C178.8143,341.366 187.6105,357.9332 196.5033,372.0264 C201.2283,379.5151 206.8225,387.3752 212.0378,394.3513 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="214.2072,397.2338,212.5727,390.1018,211.9784,394.2621,207.818,393.6678,214.2072,397.2338" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="46.8042" x="197.2462" y="364.3669">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M108.0285,416.9213 C132.7679,416.9213 162.0242,416.9213 185.5972,416.9213 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><polygon fill="#8095A1" points="189.1038,416.9213,182.4175,413.9496,185.3892,416.9213,182.4175,419.893,189.1038,416.9213" style="stroke: #8095A1; stroke-width: 0.742923663722561;"/><text fill="#000000" font-family="Monospace" font-size="7.4292" lengthAdjust="spacingAndGlyphs" textLength="55.7193" x="121.2823" y="412.2335">history remains</text><!--MD5=[994b73c618d067de5faae1a7c19b4f86]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — block state and heap statistics
[*] - -> Free : 01 one list node
Free - -> Allocated : 02 first-fit + split\ncurrent free decreases
Allocated - -> Fragmented : free A and C
Fragmented : 03 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : free B\naddress-order joins neighbours
Coalesced : 04 one free block
Coalesced : current free = initial free
Coalesced - -> OOMChecked : request > arena
OOMChecked : NULL + hook once
OOMChecked - -> [*]
state "05 minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="600.2775px" preserveAspectRatio="none" style="width:321px;height:600px;" version="1.1" viewBox="0 0 321 600" width="321.3164px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="184.7569" x="70.8357" y="7.8065">A6 STATE — reusable states of the same RV32 arena</text><ellipse cx="193.155" cy="23.2954" fill="#000000" rx="7.3026" ry="7.3026" style="stroke: none; stroke-width: 0.7302646103274287;"/><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="36.5132" x="174.8984" y="85.3679"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="174.8984" x2="211.4116" y1="102.6168" y2="102.6168"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="15.3356" x="185.4872" y="96.8258">Free</text><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="47.4672" x="169.4214" y="186.8747"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="169.4214" x2="216.8886" y1="204.1235" y2="204.1235"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="32.8619" x="176.724" y="198.3325">Allocated</text><rect fill="#EDF6FA" height="44.4439" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="99.316" x="93.1087" y="288.3815"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="93.1087" x2="192.4247" y1="305.6303" y2="305.6303"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="42.3553" x="121.5891" y="299.8393">Fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="79.5988" x="96.7601" y="317.0882">03 E06 two free blocks</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="84.7107" x="96.7601" y="327.0344">sum free &gt; largest block</text><rect fill="#EDF6FA" height="44.4439" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="102.9673" x="4.3816" y="397.8189"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="4.3816" x2="107.3489" y1="415.0678" y2="415.0678"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="37.9738" y="409.2768">Coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="49.658" x="8.0329" y="426.5256">one free block</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="88.362" x="8.0329" y="436.4718">current = largest = initial</text><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="96.3949" x="7.6678" y="497.0327"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="7.6678" x2="104.0627" y1="514.2815" y2="514.2815"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="47.4672" x="32.1316" y="508.4905">OOMChecked</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="81.7896" x="11.3191" y="525.7394">NULL · hook=1 · PASS=1</text><ellipse cx="55.8652" cy="585.3947" fill="none" rx="7.3026" ry="7.3026" style="stroke: #000000; stroke-width: 0.7302646103274287;"/><ellipse cx="56.2304" cy="585.7598" fill="#000000" rx="4.3816" ry="4.3816" style="stroke: none; stroke-width: 0.7302646103274287;"/><rect fill="#EDF6FA" height="36.5132" rx="9.1283" ry="9.1283" style="stroke: #2C7794; stroke-width: 1.0953969154911432;" width="64.9936" x="188.4083" y="401.7843"/><line style="stroke: #2C7794; stroke-width: 1.0953969154911432;" x1="188.4083" x2="253.4018" y1="419.0331" y2="419.0331"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="50.3883" x="195.7109" y="413.2421">minimum-ever</text><!--MD5=[f16808fa220dde377303612249059854]
link *start to Free--><path d="M193.155,30.7514 C193.155,41.647 193.155,63.6352 193.155,80.4898 " fill="none" id="*start-&gt;Free" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="193.155,83.9877,196.076,77.4153,193.155,80.3364,190.2339,77.4153,193.155,83.9877" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="72.2962" x="193.8853" y="61.0428">01 E01 one list node</text><!--MD5=[19abaf48dc778410378e95e0d1bca006]
link Free to Allocated--><path d="M193.155,122.239 C193.155,138.9547 193.155,163.9809 193.155,182.0111 " fill="none" id="Free-&gt;Allocated" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="193.155,185.5675,196.076,178.9951,193.155,181.9162,190.2339,178.9951,193.155,185.5675" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="83.9804" x="193.8853" y="152.3259">02 E04 A+B+C allocated</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="67.9146" x="201.9182" y="162.2721">current free = 3936</text><!--MD5=[f6fa3e1917b73de38ea03346a6903b17]
link Allocated to Fragmented--><path d="M184.4941,223.7385 C176.4611,240.3228 164.4191,265.181 155.3346,283.9342 " fill="none" id="Allocated-&gt;Fragmented" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="153.8083,287.0889,159.2954,282.4391,155.3952,283.8004,154.0338,279.9002,153.8083,287.0889" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="174.6866" y="253.8327">E05 free A</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="35.783" x="174.6866" y="263.7789">E06 free C</text><!--MD5=[c73bca393b062d6a86dff80fa900c78c]
link Fragmented to Coalesced--><path d="M92.7509,329.6414 C81.6363,335.9582 71.0474,344.1883 63.8982,354.7333 C56.391,365.8114 54.1053,380.4606 53.8278,393.0065 " fill="none" id="Fragmented-&gt;Coalesced" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="53.8132,396.4241,56.753,389.8601,53.8236,392.7728,50.9109,389.8434,53.8132,396.4241" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="47.4672" x="87.2666" y="363.2701">04 E07 free B</text><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="92.7436" x="64.6284" y="373.2163">merge previous, then next</text><!--MD5=[2b306524d92469efb3bb270d490680cf]
link Coalesced to OOMChecked--><path d="M55.8652,442.5257 C55.8652,457.3647 55.8652,476.9796 55.8652,491.9939 " fill="none" id="Coalesced-&gt;OOMChecked" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="55.8652,495.5941,58.7863,489.0217,55.8652,491.9427,52.9442,489.0217,55.8652,495.5941" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="82.5199" x="56.5955" y="472.7076">05 E08 request &gt; arena</text><!--MD5=[6b8be85e17f6174335a5329fe1414850]
link OOMChecked to *end--><path d="M55.8652,533.6993 C55.8652,546.2379 55.8652,562.6835 55.8652,573.4622 " fill="none" id="OOMChecked-&gt;*end" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="55.8652,576.8725,58.7863,570.3001,55.8652,573.2212,52.9442,570.3001,55.8652,576.8725" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><!--MD5=[b09143a670c8c67aa163b99fca5c6b6b]
link Allocated to MIN--><path d="M206.402,223.6581 C210.5791,230.1502 214.7489,237.7595 217.2537,245.2959 C235.6199,300.555 231.8517,317.8477 227.4774,375.911 C226.9589,382.7609 225.995,390.1731 224.958,396.8988 " fill="none" id="Allocated-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="224.403,400.3384,228.3223,394.3078,224.9778,396.7326,222.5531,393.3881,224.403,400.3384" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="81.0594" x="231.8006" y="313.6632">records low watermark</text><!--MD5=[1fa23b8554d20d5dd3f2f8930c0e2df3]
link Fragmented to MIN--><path d="M152.2237,332.9422 C158.409,345.9702 167.1649,362.5618 177.0892,375.911 C182.9094,383.7394 190.1317,391.4875 197.0254,398.2279 " fill="none" id="Fragmented-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="199.5813,400.6889,196.8641,394.0296,196.9477,398.1598,192.8176,398.2434,199.5813,400.6889" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="46.0067" x="177.8194" y="368.382">does not rise</text><!--MD5=[87522a40b34d64237ec6603d41372cd8]
link Coalesced to MIN--><path d="M107.6337,420.0409 C132.2582,420.0409 161.1402,420.0409 183.5812,420.0409 " fill="none" id="Coalesced-&gt;MIN" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><polygon fill="#8095A1" points="187.1595,420.0409,180.5871,417.1198,183.5082,420.0409,180.5871,422.962,187.1595,420.0409" style="stroke: #8095A1; stroke-width: 0.7302646103274287;"/><text fill="#000000" font-family="Monospace" font-size="7.3026" lengthAdjust="spacingAndGlyphs" textLength="54.7698" x="120.4937" y="415.4329">history remains</text><!--MD5=[ca62bd85e5915d2f6639cfa0fa77f8b6]
@startuml
scale 600 height
top to bottom direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 10
skinparam stateBorderColor #2c7794
skinparam stateBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A6 STATE — reusable states of the same RV32 arena
[*] - -> Free : 01 E01 one list node
Free - -> Allocated : 02 E04 A+B+C allocated\ncurrent free = 3936
Allocated - -> Fragmented : E05 free A\nE06 free C
Fragmented : 03 E06 two free blocks
Fragmented : sum free > largest block
Fragmented - -> Coalesced : 04 E07 free B\nmerge previous, then next
Coalesced : one free block
Coalesced : current = largest = initial
Coalesced - -> OOMChecked : 05 E08 request > arena
OOMChecked : NULL · hook=1 · PASS=1
OOMChecked - -> [*]
state "minimum-ever" as MIN
Allocated -right-> MIN : records low watermark
Fragmented -right-> MIN : does not rise
Coalesced -right-> MIN : history remains
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

+3 -3
View File
@@ -8,13 +8,13 @@ skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
title A7 RUNTIME — source identity, replay, memory and verdict
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<checkpoint E06>>\n03 fragmented\nblocks=2 · free>largest" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
rectangle "<<checkpoint E08>>\n05 verified\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC --> ELF : compile + link
ELF --> E1 : reset / load / replay
+33 -33
View File
@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82.7447px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.2079px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="190.3128" x="314.8436" y="7.9609">A7 RUNTIME — one artifact, two checkpoints, one proof</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="78.6075" x="4.9647" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="31.443" x="13.2392" y="38.0453">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="38.89" x="13.2392" y="48.1882">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="62.0585" x="13.2392" y="58.3311">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="71.9879" x="181.2109" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="32.2704" x="189.4854" y="38.0453">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="51.3017" x="189.4854" y="48.1882">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="55.439" x="189.4854" y="58.3311">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="86.0545" x="370.6963" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="378.9707" y="38.0453">«checkpoint E01»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="52.1292" x="378.9707" y="48.1882">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="69.5055" x="378.9707" y="58.3311">blocks=2 · aligned=1</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.9777" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="81.0898" x="553.5621" y="21.8099"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="37.2351" x="561.8365" y="38.0453">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="58.7487" x="561.8365" y="48.1882">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="64.5409" x="561.8365" y="58.3311">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="57.1206" style="stroke: #2C7794; stroke-width: 1.24117053481332;" width="88.5368" x="716.5691" y="16.7377"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="60.4036" x="724.8436" y="32.9731">«checkpoint E02»</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="43.0272" x="724.8436" y="43.116">05 coalesced</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="71.9879" x="724.8436" y="53.2589">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="57.0938" x="724.8436" y="63.4018">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.961,45.2929 C111.3744,45.2929 148.0054,45.2929 175.7911,45.2929 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="179.6222,45.2929,172.1752,41.9831,175.485,45.2929,172.1752,48.6027,179.6222,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="46.337" x="109.223" y="42.497">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M253.5463,45.2929 C284.8735,45.2929 330.7719,45.2929 365.2765,45.2929 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="369.2482,45.2929,361.8012,41.9831,365.111,45.2929,361.8012,48.6027,369.2482,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="66.1958" x="278.8496" y="42.497">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M457.1314,45.2929 C484.5447,45.2929 520.1332,45.2929 548.0513,45.2929 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="551.9154,45.2929,544.4684,41.9831,547.7782,45.2929,544.4684,48.6027,551.9154,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="45.5096" x="482.4016" y="42.497">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M634.8918,45.2929 C657.8783,45.2929 686.93,45.2929 711.2486,45.2929 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><polygon fill="#8095A1" points="715.1128,45.2929,707.6658,41.9831,710.9756,45.2929,707.6658,48.6027,715.1128,45.2929" style="stroke: #8095A1; stroke-width: 0.82744702320888;"/><text fill="#000000" font-family="Monospace" font-size="7.447" lengthAdjust="spacingAndGlyphs" textLength="30.6155" x="660.3027" y="42.497">continue</text><!--MD5=[bc1681809f0cb7bb82cdf81f0385b8f2]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — one artifact, two checkpoints, one proof
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E01>>\n03 fragmented\nblocks=2 · aligned=1" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E02>>\n05 coalesced\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="82px" preserveAspectRatio="none" style="width:814px;height:82px;" version="1.1" viewBox="0 0 814 82" width="814.26px" zoomAndPan="magnify"><defs/><g><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="204.18" x="307.91" y="7.8893">A7 RUNTIME — source identity, replay, memory and verdict</text><!--MD5=[183d75e42a7a852d02a7f9ce2cc3343f]
entity SRC--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="77.9" x="4.92" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="31.16" x="13.12" y="37.7029">«source»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="38.54" x="13.12" y="47.7545">01 task03 C</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="61.5" x="13.12" y="57.8062">A/B/C experiment</text><!--MD5=[4a7b087cd571ae358eb895b9dc7ce0ed]
entity ELF--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="71.34" x="179.58" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="31.98" x="187.78" y="37.7029">«artifact»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="50.84" x="187.78" y="47.7545">02 ELF + image</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="54.94" x="187.78" y="57.8062">heap_4 symbols</text><!--MD5=[45565a74ca8123df0b8413ce5340d40a]
entity E1--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="92.66" x="367.36" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="59.86" x="375.56" y="37.7029">«checkpoint E06»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="51.66" x="375.56" y="47.7545">03 fragmented</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="76.26" x="375.56" y="57.8062">blocks=2 · free&gt;largest</text><!--MD5=[5ceda9279414f57783e95166b8d927b7]
entity MEM--><rect fill="#EDF6FA" height="46.5549" style="stroke: #2C7794; stroke-width: 1.23;" width="80.36" x="555.96" y="21.6136"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="36.9" x="564.16" y="37.7029">«memory»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="58.22" x="564.16" y="47.7545">04 ucHeap[4096]</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="63.96" x="564.16" y="57.8062">headers + payload</text><!--MD5=[a3c437a7ee715155cf6a0fec80d7cbaf]
entity E2--><rect fill="#EDF6FA" height="56.6065" style="stroke: #2C7794; stroke-width: 1.23;" width="87.74" x="717.5" y="16.587"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="59.86" x="725.7" y="32.6763">«checkpoint E08»</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="36.08" x="725.7" y="42.7279">05 verified</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="71.34" x="725.7" y="52.7796">final=initial · blocks=1</text><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="56.58" x="725.7" y="62.8312">OOM=1 · PASS=1</text><!--MD5=[2e73c4d4efa4a7715d66b06010e70f85]
link SRC to ELF--><path d="M83.2054,44.8852 C110.372,44.8852 146.6734,44.8852 174.209,44.8852 " fill="none" id="SRC-&gt;ELF" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="178.0056,44.8852,170.6256,41.6052,173.9056,44.8852,170.6256,48.1652,178.0056,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="45.92" x="108.24" y="42.1145">compile + link</text><!--MD5=[98439561a91d683361f6e8599ebb304f]
link ELF to E1--><path d="M251.2562,44.8852 C282.0636,44.8852 327.221,44.8852 361.9726,44.8852 " fill="none" id="ELF-&gt;E1" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="365.9988,44.8852,358.6188,41.6052,361.8988,44.8852,358.6188,48.1652,365.9988,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="65.6" x="276.34" y="42.1145">reset / load / replay</text><!--MD5=[14b84038a04448f34eb55bd119f2d935]
link E1 to MEM--><path d="M460.3726,44.8852 C488.0476,44.8852 523.1518,44.8852 550.6136,44.8852 " fill="none" id="E1-&gt;MEM" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="554.4102,44.8852,547.0302,41.6052,550.3102,44.8852,547.0302,48.1652,554.4102,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="45.1" x="485.44" y="42.1145">inspect bytes</text><!--MD5=[28f0a5a321106494a7afb95cbc1e35b0]
link MEM to E2--><path d="M636.5578,44.8852 C659.3374,44.8852 688.1276,44.8852 712.2274,44.8852 " fill="none" id="MEM-&gt;E2" style="stroke: #8095A1; stroke-width: 0.82;"/><polygon fill="#8095A1" points="716.0568,44.8852,708.6768,41.6052,711.9568,44.8852,708.6768,48.1652,716.0568,44.8852" style="stroke: #8095A1; stroke-width: 0.82;"/><text fill="#000000" font-family="Monospace" font-size="7.38" lengthAdjust="spacingAndGlyphs" textLength="30.34" x="661.74" y="42.1145">continue</text><!--MD5=[d3cc7590ea240485cc9ae283b10caa4d]
@startuml
scale 820 width
left to right direction
skinparam backgroundColor transparent
skinparam shadowing false
skinparam defaultFontName Monospace
skinparam defaultFontSize 9
skinparam rectangleBorderColor #2c7794
skinparam rectangleBackgroundColor #edf6fa
skinparam ArrowColor #8095a1
title A7 RUNTIME — source identity, replay, memory and verdict
rectangle "<<source>>\n01 task03 C\nA/B/C experiment" as SRC
rectangle "<<artifact>>\n02 ELF + image\nheap_4 symbols" as ELF
rectangle "<<checkpoint E06>>\n03 fragmented\nblocks=2 · free>largest" as E1
rectangle "<<memory>>\n04 ucHeap[4096]\nheaders + payload" as MEM
rectangle "<<checkpoint E08>>\n05 verified\nfinal=initial · blocks=1\nOOM=1 · PASS=1" as E2
SRC - -> ELF : compile + link
ELF - -> E1 : reset / load / replay
E1 - -> MEM : inspect bytes
MEM - -> E2 : continue
@enduml
PlantUML version 1.2020.02(Sun Mar 01 11:22:07 CET 2020)
(GPL source distribution)

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

+6 -2
View File
File diff suppressed because one or more lines are too long