|
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