Stöd för Perf Maps

På plattformar som stöds (i skrivande stund endast Linux) kan runtime dra nytta av perf map files för att göra Python-funktioner synliga för ett externt profileringsverktyg (t.ex. perf). En process som körs kan skapa en fil i katalogen /tmp, som innehåller poster som kan mappa ett avsnitt av körbar kod till ett namn. Det här gränssnittet beskrivs i dokumentationen för Linux Perf-verktyget.

I Python kan dessa hjälp-API:er användas av bibliotek och funktioner som förlitar sig på att generera maskinkod i farten.

Observera att det inte är nödvändigt att hålla en attached thread state för dessa API:er.

int PyUnstable_PerfMapState_Init(void)
Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.

Öppna filen /tmp/perf-$pid.map, om den inte redan är öppnad, och skapa ett lås för att säkerställa trådsäkra skrivningar till filen (förutsatt att skrivningarna görs via PyUnstable_WritePerfMapEntry()). Normalt finns det inget behov av att anropa detta explicit; använd bara PyUnstable_WritePerfMapEntry() och det kommer att initiera tillståndet vid första anropet.

Returnerar 0 vid framgång, -1 vid misslyckande med att skapa/öppna perf map-filen eller -2 vid misslyckande med att skapa ett lås. Kontrollera errno för mer information om orsaken till ett misslyckande.

int PyUnstable_WritePerfMapEntry(const void *code_addr, unsigned int code_size, const char *entry_name)
Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.

Skriv en enda post till filen /tmp/perf-$pid.map. Denna funktion är trådsäker. Så här ser ett exempel på en post ut:

# adress storlek namn
7f3529fcf759 b py::bar:/run/t.py

Anropar PyUnstable_PerfMapState_Init() innan posten skrivs, om perf map-filen inte redan är öppnad. Returnerar 0 vid framgång, eller samma felkoder som PyUnstable_PerfMapState_Init() vid misslyckande.

void PyUnstable_PerfMapState_Fini(void)
Detta är Instabilt API. Den kan ändras utan förvarning i mindre versioner.

Stäng perf map-filen som öppnades av PyUnstable_PerfMapState_Init(). Detta anropas av körtiden själv under tolkens avstängning. I allmänhet bör det inte finnas någon anledning att uttryckligen anropa detta, förutom för att hantera specifika scenarier som forking.