summaryrefslogtreecommitdiff
path: root/build-support/capture-alloc-sources.py
diff options
context:
space:
mode:
authorDibyendu Majumdar <mobile@majumdar.org.uk>2023-08-19 08:52:57 -0700
committerDibyendu Majumdar <mobile@majumdar.org.uk>2026-10-08 16:52:27 -0700
commit4947515d6133ddbd0489c395024f4c1ddf7a499c (patch)
treedbc3d95a6c2a2a6d9e447ed14228e6b5c48b5cec /build-support/capture-alloc-sources.py
downloadSimple-4947515d6133ddbd0489c395024f4c1ddf7a499c.tar.gz
Simple-4947515d6133ddbd0489c395024f4c1ddf7a499c.zip
Chapter 1: Introduction
Co-authored-by: Cliff Click <cliffc@acm.org> Co-authored-by: Thalia Archibald <thalia@archibald.dev> Co-authored-by: hadha <helsgithub15@gmail.com> Co-authored-by: XmiliaH <45106915+XmiliaH@users.noreply.github.com> Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> Co-authored-by: Jun Kawasaki <jun784@gmail.com>
Diffstat (limited to 'build-support/capture-alloc-sources.py')
-rw-r--r--build-support/capture-alloc-sources.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/build-support/capture-alloc-sources.py b/build-support/capture-alloc-sources.py
new file mode 100644
index 00000000..f474ac55
--- /dev/null
+++ b/build-support/capture-alloc-sources.py
@@ -0,0 +1,28 @@
+"""Capture historical spill sources with a temporary instrumented test listener."""
+from pathlib import Path
+import subprocess,sys,os
+root=Path(__file__).resolve().parents[1]
+ch=int(sys.argv[1]); chapter=root/f'chapter{ch}'
+if ch not in range(21,25): raise SystemExit("Capture supports chapters 21-24")
+out=root/'build/dynamic-stats'/str(ch); out.mkdir(parents=True,exist_ok=True)
+src=(chapter/'src/test/java/com/seaofnodes/simple/SpillStats.java').read_text()
+needle='String test = ACTIVE._test.getTestClass().getSimpleName()+"."+ACTIVE._test.getMethodName();'
+extra='''
+ try {
+ var dir=java.nio.file.Path.of("../build/dynamic-stats/CH/captured");
+ java.nio.file.Files.createDirectories(dir);
+ String name=test+"-"+cpu+"-"+abi+"-"+(_capture++)+".smp";
+ java.nio.file.Files.writeString(dir.resolve(name),code._src);
+ java.nio.file.Files.writeString(dir.resolve("index.tsv"),cohort+"\\t"+test+"\\t"+cpu+"\\t"+abi+"\\t"+name+"\\n",java.nio.file.StandardOpenOption.CREATE,java.nio.file.StandardOpenOption.APPEND);
+ } catch(java.io.IOException e) { throw new RuntimeException(e); }
+'''.replace('CH',str(ch))
+assert needle in src
+src=src.replace(needle,needle+extra).replace('private static SpillStats ACTIVE;','private static SpillStats ACTIVE;\n private static int _capture;')
+(out/'SpillStats.java').write_text(src,newline='\n')
+cp=os.pathsep.join([str(chapter/'build/classes/main'),str(chapter/'build/classes/test'),str(chapter/'lib/*')])
+subprocess.run(['javac','-cp',cp,'-d',str(out),str(out/'SpillStats.java')],check=True)
+idx=out/'captured/index.tsv'
+if idx.exists(): idx.write_text('')
+with (out/'capture.log').open('w') as log:
+ subprocess.run(['java','-ea','-cp',str(out)+os.pathsep+cp,'com.seaofnodes.simple.SpillStats'],cwd=chapter,stdout=log,stderr=subprocess.STDOUT,check=True)
+print(ch,'captured',len(idx.read_text().splitlines()))