Hi All, Almost 4 years ago I developed STM with semantic concurrency control for my project at CERN. Main feature of this STM is the TransactionalMap that lets you merge concurrent changes. Library is heavily tested and is very stable. It has been used in production for the past 2 years.
Recently I released it on GitHub: http://entwined.koblik.ch (will redirect to https://github.com/CERN-BE/Entwined-STM) Since Entwined STM was designed to be used from Java I wrote a simple facade for it in Clojure that you can load with (require '[cern.entwined.core :as stm]) Entwined STM operates on a memory with a fixed structure, meaning that you have to define what and how many collections you want to have in your STM and this can't be changed after construction. To construct memory with 1 transactional map and 1 transactional queue run this: (def memory (stm/create-memory :map (stm/create-map) :queue (stm/create-queue))) It's impossible to access transactional entities outside of a transaction, to run a transaction you can use "intrans" macro (stm/intrans memory data (-> data :map (.put :key1 "value1")) true) (stm/intrans memory data (-> data :map (.get :key1))) ;-> "value1" First line puts [:key1 "value1"] pair into the map. True at the end of the body tells the memory to commit this transaction. intrans will initiate commit if body returns truthy value. Second line just shows that the change has been committed. A couple more words on the implementation: I used HashMap to implement the TransactionalMap, I copy the backing map for every transaction which may be expensive for some scenarios. Obvious solution would be to use Clojure's persistent map. Commits are eventually serialized and protected with a single lock. If you take a look at the Java source you'll see that Transaction interface has a second method "committed" that is called when commit is being done. I use this method to write to the hardware knowing that execution order of committed callbacks is the same as the commit order. I would greatly appreciate any feedback and suggestions. If you have any questions don't hesitate to ask here or email me directly. Documentation is still somewhat lacking and I'd be interested to know which parts of it should be improved first. Cheers, Ivan. -- -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.