diff options
| author | babenko <[email protected]> | 2026-06-14 01:15:56 +0300 |
|---|---|---|
| committer | babenko <[email protected]> | 2026-06-14 01:35:19 +0300 |
| commit | 450b2fac082943e2029b3390c99501c365795d64 (patch) | |
| tree | 16d2423ad0420354952e548e092e96dd0528d171 /contrib/python/ipython/py2/IPython/core/extensions.py | |
| parent | 732b297f8ec8809088cf3e34459d71307104ae24 (diff) | |
Add library/cpp/yt/rseq: NYT::GetCurrentCpuId() via Linux rseq
Self-contained current-CPU-id reader backed by Linux **rseq** (restartable
sequences), with **no third-party dependency** (no librseq):
* The rseq ABI is hand-defined; the calling thread is registered lazily via the
rseq syscall.
* Fast path is a single inlined, **branch-free** thread-local read. The offset
always points at a readable `cpu_id` -- the glibc-owned area when glibc registers
rseq (>= 2.35, via the weak `__rseq_offset`/`__rseq_size`), otherwise our own
area -- so an unregistered thread reads `-1` and routes to the slow path.
* Falls back to `sched_getcpu()` (Linux) or `0` (darwin/windows). Works on glibc
**and musl** alike (librseq does not build on musl).
Fiber-TLS contract: the inlined read must be reached only via a non-inlinable,
fiber-switch-free frame (a virtual call or `YT_PREVENT_TLS_CACHING`).
#### Benchmark -- cost of one cpu-id read
| source | time / call |
|---|---|
| `GetCurrentCpuId()` (rseq) | **0.34 ns** |
| `sched_getcpu()` (vDSO) | 3.5 ns |
| `rdtscp` (what `TTscp::Get()` does) | 23 ns |
This is an alternative to the librseq-based review/13886037 -- same speed, but no
contrib dependency and it also covers musl. The unit test pins to each allowed CPU
and asserts the reported id matches.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
commit_hash:09d282c2f48755836b1cd68cedbffc3c6a662eed
Diffstat (limited to 'contrib/python/ipython/py2/IPython/core/extensions.py')
0 files changed, 0 insertions, 0 deletions
