equip/init: read the selected EF directly, bound the startup drain

pySim's scc.read_binary/read_record call select_path(ef) first, so the
ICCID, network-state, EF.ARR and EF.PBR readers - which had already made a
parent-scoped selection and hold its FCP - sent a second SELECT per file
and per record.  _read_selected_ef() issues READ BINARY (chunked at
max_cmd_len from the FCP file size) / READ RECORD (b2<rec>04<len> at the
FCP record length) directly; the pySim helpers stay as the fallback when
the FCP lacks the value.

The startup TERMINAL PROFILE drain now breaks on the chain's idle SW
instead of polling STATUS once more.

Measured on the last startup: ~3.4 s traced init (netstate/ARR/PBR 271
APDUs / 1.26 s incl. 169 SELECTs; the card's own TP processing 1.58 s);
the change removes ~0.7-0.8 s of the read phase without touching any data
or the TP.

v3.38.1; tests: tests/test_read_selected.py (direct reads, chunking, the
fallback and the drain source pin) and the ARR/PBR/ICCID/netstate fakes.
1067 Python + 1075 frontend.  sw cache simple-v482.
This commit is contained in:
catarrh committed 2026-10-24 18:54:31 +03:00
1 parent 80cbd8e935
commit 0231df905c
11 files changed
+252 -20

No files matched your search

+16
View File
@@ -9,6 +9,22 @@ every change carries a descriptive commit message.
## [Unreleased]
## [3.38.1] — 2026-10-24
### Performance
- **Equip/initialization reads no longer select the file twice.** pySim's
`scc.read_binary`/`scc.read_record` call `select_path(ef)` first, but the
ICCID, network-state, EF.ARR and EF.PBR readers had already made a
parent-scoped selection and held its FCP. A new `_read_selected_ef()` reads
the selected file directly — READ BINARY chunked at `max_cmd_len`, READ
RECORD at the FCP record length — removing one SELECT per file read and one
per record (~106 files + 94 records on the bench card: ~0.7 s of the ~3.4 s
traced startup init). The pySim helpers stay as the fallback when the FCP
lacks the size/record length.
- The startup TERMINAL PROFILE drain uses the chain's final SW, so an idle
chain no longer costs one extra STATUS poll (~128 ms).
## [3.38.0] — 2026-10-24
### Added