Generic thread-safe and exception-safe non-gc or 'off heap' resource management.
There is some more information on our blog.
;;create the file (defn new-random-file [fname] (resource/track (RandomAccessFile. fname) #(.close item))) ;;Use it (resource/stack-resource-context (let [f (new-random-file fname)] ... )) ;;Similar to with-open, this will close the file regardless ;;of what happens. The advantage is this can map to anything ;;you can implement the resource protocol with meaning network sockets, ;;JNI pointers, GPU contexts, etc. It is also possible to have the ;;gc track something if the dispose functionality does not reference ;;the item itself. (let [f (resource/track (double-array [1 2 3]) #(println "disposed") :gc)] ...) ;;Disposed will print when the gc determines the double array is no longer ;;reachable
There are now explicit methods to create either a weak or soft reference. For the differences, see here.
Checkout the stack and gc tests.
Or take a giant leap and check out tvm-clj.
Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version. Complements of Tech Ascent, LLC.