Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

65
LINES

< > BotCompany Repo | #1031777 // Permanent Mini Profiler [get all stacktraces once a second]

JavaX source code (Dynamic Module) [tags: use-pretranspiled] - run with: Stefan's OS

Uses 1113K of libraries. Click here for Pure Java version (13162L/63K).

!7

cm > DynPrintLogAndEnabled {
  switchable double interval = 1.0; // seconds
  switchable int numberSize = 20;
  S aCurrentStackTrace;
  
  sclass Entry {
    long threadID;
    S threadName;
    WeakRef<Thread> thread;
    StackTraceElement[] stackTrace;
    bool runnable;
  }
  
  transient L<Entry> entries;
  transient volatile Map<Thread, StackTraceElement[]> stackTraces; // weakHashMap
  transient volatile Map<Thread, StackTraceElement[]> runnableStackTraces;
  
  start {
    dm_reloadOnFieldChange enabled();
    if (enabled) dm_doEvery(interval, r {
      if (!enabled) ret;
      
      var raw = allThreadsWithStackTraces();
      raw = mapMinus(raw, currentThread());
      setField(entries := map(raw, (t, st) -> {
        new Entry e;
        e.threadID = threadID(t);
        e.threadName = threadName(t);
        e.thread = weakRef(t);
        e.stackTrace = st;
        e.runnable = isThreadRunnable_x(t, st);
        ret e;
      }));
      
      setField(stackTraces := toWeakHashMap(raw));
      setField(runnableStackTraces := mapToWeakHashMap(filter(entries, e -> e.runnable), e -> pair(e.thread!, e.stackTrace)));
      setModuleName(n2(runnableStackTraces, "runnable thread") + " [Permanent Mini Profiler]");
      var rand = random(runnableStackTraces);
      setField(aCurrentStackTrace := rand == null ?:
        rand.a + "\n\n" + stackTraceToString(rand.b));
        
      vmBus_send freshStackTraces(stackTraces, weakRef(me()));
    });
  }
  
  S renderStats() {
    ret stackTraces == null ? ""
      : jlabel_centerHTML(joinWithBR(
          hfontsize(numberSize, b(n2(runnableStackTraces))),
          (l(runnableStackTraces) == 1 ? "thread" : "threads") + " running",
          n2(l(stackTraces)-l(runnableStackTraces)) + " idle"));
  }
  
  visual westAndCenterWithMargins(
    dm_calculatedCenteredLabel renderStats(),
    dm_uneditableTextArea aCurrentStackTrace());
  
  // API
  
  Map<Thread, StackTraceElement[]> runnableStackTraces() {
    ret runnableStackTraces;
  }
}

download  show line numbers  debug dex  old transpilations   

Travelled to 5 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt

No comments. add comment

Snippet ID: #1031777
Snippet name: Permanent Mini Profiler [get all stacktraces once a second]
Eternal ID of this version: #1031777/26
Text MD5: e7fc194626e94daff58c189f75c6a259
Transpilation MD5: ab0c69dadd5a6683c99b0db26f9a4f59
Author: stefan
Category: javax
Type: JavaX source code (Dynamic Module)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-03-30 13:35:36
Source code size: 2020 bytes / 65 lines
Pitched / IR pitched: No / No
Views / Downloads: 236 / 15780
Version history: 25 change(s)
Referenced in: #1031810 - dm_runnableStackTracesFromMiniProfiler