-
-
Notifications
You must be signed in to change notification settings - Fork 57
/
semaphore.clj
55 lines (49 loc) · 1.66 KB
/
semaphore.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) Andrey Antukh <niwi@niwi.nz>
(ns promesa.exec.semaphore
"Concurrency limiter: Semaphore"
(:require
[promesa.protocols :as pt])
(:import
java.util.concurrent.TimeUnit
java.util.concurrent.Semaphore))
(set! *warn-on-reflection* true)
(extend-type Semaphore
pt/ISemaphore
(-try-acquire!
([this] (.tryAcquire ^Semaphore this))
([this permits] (.tryAcquire ^Semaphore this (int permits)))
([this permits timeout]
(let [timeout (if (instance? java.time.Duration timeout)
(inst-ms timeout)
timeout)]
(.tryAcquire ^Semaphore this
(int permits)
(long timeout)
TimeUnit/MILLISECONDS))))
(-acquire!
([this] (.acquire ^Semaphore this) true)
([this permits] (.acquire ^Semaphore this (int permits)) true))
(-release!
([this] (.release ^Semaphore this))
([this permits] (.release ^Semaphore this (int permits)))))
(defn acquire!
([sem] (pt/-acquire! sem))
([sem & {:keys [permits timeout blocking] :or {blocking true permits 1}}]
(if timeout
(pt/-try-acquire! sem permits timeout)
(if blocking
(pt/-acquire! sem permits)
(pt/-try-acquire! sem permits)))))
(defn release!
([sem] (pt/-release! sem))
([sem & {:keys [permits]}]
(pt/-release! sem permits)))
(defn create
"Creates a Semaphore instance."
^Semaphore
[& {:keys [permits] :or {permits 1}}]
(Semaphore. (int permits)))