|
88 | 88 | (.buffer 1) |
89 | 89 | (.touch hint))) |
90 | 90 |
|
91 | | -(def current-leaks) |
| 91 | +;; NOTE: Not setting to bare `nil` to appease `clj-kondo`. |
| 92 | +(def current-leaks (atom nil)) |
92 | 93 |
|
93 | 94 | (defn force-leak-detection! [] |
94 | 95 | (System/gc) |
|
131 | 132 | (await-probe! hint) |
132 | 133 | (handle-leaks (remove-probes @current-leaks))))) |
133 | 134 |
|
| 135 | +(defn log-leaks! [leaks] |
| 136 | + (doseq [{:keys [resource-type records]} leaks] |
| 137 | + ;; Log message cribbed from io.netty.util.ResourceLeakDetector's (protected) reportTracedLeak method |
| 138 | + (log/error (str "LEAK: " resource-type ".release() was not called before it's garbage-collected.") |
| 139 | + (str "See https://netty.io/wiki/reference-counted-objects.html for more information." records)))) |
| 140 | + |
134 | 141 | (defn -needReport [_this] |
135 | 142 | true) |
136 | 143 |
|
| 144 | +(defn report-leak! [leak] |
| 145 | + (if @current-leaks |
| 146 | + (swap! current-leaks conj leak) |
| 147 | + (do |
| 148 | + (log/error "NOTE: The following leak occurred outside of a `with-leak-collection` scope.") |
| 149 | + (log-leaks! [leak])))) |
| 150 | + |
137 | 151 | (defn -reportTracedLeak [_this resource-type records] |
138 | | - (swap! current-leaks conj {:resource-type resource-type |
139 | | - :records records})) |
| 152 | + (report-leak! {:resource-type resource-type |
| 153 | + :records records})) |
140 | 154 |
|
141 | 155 | ;; NOTE: Since we require level PARANOID, this should never be called in practice. |
142 | 156 | (defn -reportUntracedLeak [_this resource-type] |
143 | | - (swap! current-leaks conj {:resource-type resource-type |
144 | | - :records "[untraced]"})) |
145 | | - |
146 | | -(defn log-leaks! [leaks] |
147 | | - (doseq [{:keys [resource-type records]} leaks] |
148 | | - ;; Log message cribbed from io.netty.util.ResourceLeakDetector's (protected) reportTracedLeak method |
149 | | - (log/error (str "LEAK: " resource-type ".release() was not called before it's garbage-collected.") |
150 | | - (str "See https://netty.io/wiki/reference-counted-objects.html for more information." records)))) |
| 157 | + (report-leak! {:resource-type resource-type |
| 158 | + :records "[untraced]"})) |
151 | 159 |
|
152 | 160 | (defmacro with-expected-leaks |
153 | 161 | "Runs `body` and expects it to produce exactly `expected-leak-count` leaks. Intended for use in tests |
|
0 commit comments