Thanks for help. I have just used synchronization mechanizm from Java.
Here is a code:
monitor.clj
(ns michael.ds.monitor
(:import [java.util.concurrent.locks ReentrantLock Condition ]))
(defn create-monitor[]
(ReentrantLock.))
(defn create-cond[m]
(.newCondition m))
(defmacro lock-monitor[ lck & body ]
`(let [z# ~lck]
(try (.lock z#)
~...@body
(finally (.unlock z#)))))
(defn signal-cond[ c ]
(.signal c))
(defn wait-cond[c]
(.await c))
factory.clj
(ns michael.ds.factory
(:require [clojure.set])
(:use [michael.ds commons monitor]))
(def data (atom ...))
(def my-monitor (create-monitor))
(def my-cond (create-cond my-monitor))
(defn produce[ ...]
(lock-monitor my-monitor
(swap! data ... )
(signal-cond my-cond)))
(defn consume[...]
(with-local-vars [r nil]
(while (nil? @r)
(lock-monitor my-monitor
(swap! data (fn[ a ]
...
(if ...(wait-cond my-cond))
...
))))@r))
I have dotted negligible code.
Let me know if it can be simplicified or I have error in assumption.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en