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.

Reply via email to