Transparent transactional loading of Clojure namespaces.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src/txload
test/txload
.gitignore
.project
README.md
epl-v1.0.txt
project.clj

README.md

txload

txload is a library that enables transparent transactional loading of Clojure namespaces. This library modifies the Clojure runtime transparently such that require and use are thread-safe. The library is only needed when Clojure namespaces are loaded dynamically at runtime from different threads potentially at the same time.

This library is only needed until namespace loading is made transactional in Clojure.

Install

Add the following to your dependency vector in your project.clj:

[txload "0.1.1"]

Latest on clojars.org:

Version

Usage

txload has to be enabled before executing code that needs to load Clojure namespaces dynamically from different threads.

(require '[txload.core :as tx])
(tx/enable)

There is also the possibility to disable txload again, e.g. when used in a REPL.

(tx/disable)

For debugging purposes txload.core/*verbose* can be bound to true as in the following example:

(binding [tx/*verbose* true]
  (require 'my.lib.core))

The test demonstrates the problematic scenario (strongly amplified). If (enable) is removed, the test case will fail with an exception.

Reloading namespaces is not thouroughly tested, yet. Reloading of one namespace (require 'my.lib :reload) should work. Reloading a namespace and all its dependencies is implemented via locking to work correctly. So concurrent calls to something like (require 'my.lib :reload-all) block and are executed one after the other.

License

Copyright © 2014 Gunnar Völkel

Distributed under the Eclipse Public License.