sclass SingleThreadProfiler is AutoCloseable { // config settable Thread threadToSample = currentThread(); settable int interval = poorMansProfiling_defaultInterval(); // results new MultiSet stackTraceMultiSet; gettable int samples; // temporary java.util.Timer timer; Lock lock = lock(); void start { lock lock; stop(); clear(); timer = doEvery_daemon(interval, r { StackTraceElement[] stackTrace = threadToSample.getStackTrace(); if (!isThreadRunnable_x(stackTrace)) ret; lock lock; samples++; results.add(stackTraceToString(stackTrace)); }); } public void stop aka close() { lock lock; if (timer != null) { stopTimer(timer); timer = null; } } void clear() { lock lock; results.clear(); samples = 0; } MultiSet results() { ret stackTraceMultiSet; } MultiSet stopAndGetResults() { lock lock; stop(); ret results(); } }