32 lines
733 B
Clojure
32 lines
733 B
Clojure
|
(ns swank.util.concurrent.mbox
|
||
|
(:refer-clojure :exclude [send get]))
|
||
|
|
||
|
;; Holds references to the mailboxes (message queues)
|
||
|
(defonce mailboxes (ref {}))
|
||
|
|
||
|
(defn get
|
||
|
"Returns the mailbox for a given id. Creates one if one does not
|
||
|
already exist."
|
||
|
([id]
|
||
|
(dosync
|
||
|
(when-not (@mailboxes id)
|
||
|
(alter mailboxes assoc
|
||
|
id (java.util.concurrent.LinkedBlockingQueue.))))
|
||
|
(@mailboxes id))
|
||
|
{:tag java.util.concurrent.LinkedBlockingQueue})
|
||
|
|
||
|
(defn send
|
||
|
"Sends a message to a given id."
|
||
|
([id message]
|
||
|
(let [mbox (get id)]
|
||
|
(.put mbox message))))
|
||
|
|
||
|
(defn receive
|
||
|
"Blocking recieve for messages for the given id."
|
||
|
([id]
|
||
|
(let [mb (get id)]
|
||
|
(.take mb))))
|
||
|
|
||
|
(defn clean []
|
||
|
)
|