Skip to content

Commit 41ff918

Browse files
tsdhrichhickey
authored andcommitted
Compile-time dispatch usage of jsr166y vs. bundled FJ.
Signed-off-by: Rich Hickey <richhickey@gmail.com>
1 parent 89e5dce commit 41ff918

File tree

1 file changed

+44
-14
lines changed

1 file changed

+44
-14
lines changed

src/clj/clojure/core/reducers.clj

+44-14
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,52 @@
2020
(set! *warn-on-reflection* true)
2121

2222
;;;;;;;;;;;;;; some fj stuff ;;;;;;;;;;
23-
;;todo - dynamic java 7+ detection and use
2423

25-
(def pool (delay (jsr166y.ForkJoinPool.)))
24+
(defmacro ^:private compile-if
25+
"Evaluate `exp` and if it returns logical true and doesn't error, expand to
26+
`then`. Else expand to `else`.
2627
27-
(defn fjtask [^Callable f]
28-
(jsr166y.ForkJoinTask/adapt f))
28+
(compile-if (Class/forName \"java.util.concurrent.ForkJoinTask\")
29+
(do-cool-stuff-with-fork-join)
30+
(fall-back-to-executor-services))"
31+
[exp then else]
32+
(if (try (eval exp)
33+
(catch Throwable _ false))
34+
`(do ~then)
35+
`(do ~else)))
2936

30-
(defn- fjinvoke [f]
31-
(if (jsr166y.ForkJoinTask/inForkJoinPool)
32-
(f)
33-
(.invoke ^jsr166y.ForkJoinPool @pool ^jsr166y.ForkJoinTask (fjtask f))))
37+
(compile-if
38+
(Class/forName "java.util.concurrent.ForkJoinTask")
39+
;; We're running a JDK 7+
40+
(do
41+
(def pool (delay (java.util.concurrent.ForkJoinPool.)))
3442

35-
(defn- fjfork [task] (.fork ^jsr166y.ForkJoinTask task))
43+
(defn fjtask [^Callable f]
44+
(java.util.concurrent.ForkJoinTask/adapt f))
3645

37-
(defn- fjjoin [task] (.join ^jsr166y.ForkJoinTask task))
46+
(defn- fjinvoke [f]
47+
(if (java.util.concurrent.ForkJoinTask/inForkJoinPool)
48+
(f)
49+
(.invoke ^java.util.concurrent.ForkJoinPool @pool ^java.util.concurrent.ForkJoinTask (fjtask f))))
50+
51+
(defn- fjfork [task] (.fork ^java.util.concurrent.ForkJoinTask task))
52+
53+
(defn- fjjoin [task] (.join ^java.util.concurrent.ForkJoinTask task)))
54+
;; We're running a JDK <6
55+
(do
56+
(def pool (delay (jsr166y.ForkJoinPool.)))
57+
58+
(defn fjtask [^Callable f]
59+
(jsr166y.ForkJoinTask/adapt f))
60+
61+
(defn- fjinvoke [f]
62+
(if (jsr166y.ForkJoinTask/inForkJoinPool)
63+
(f)
64+
(.invoke ^jsr166y.ForkJoinPool @pool ^jsr166y.ForkJoinTask (fjtask f))))
65+
66+
(defn- fjfork [task] (.fork ^jsr166y.ForkJoinTask task))
67+
68+
(defn- fjjoin [task] (.join ^jsr166y.ForkJoinTask task))))
3869
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3970

4071
(defn reduce
@@ -214,7 +245,7 @@
214245
clojure.core.protocols/CollReduce
215246
(coll-reduce [this f1] (clojure.core.protocols/coll-reduce this f1 (f1)))
216247
(coll-reduce [_ f1 init] (clojure.core.protocols/coll-reduce coll (rf f1) init))
217-
248+
218249
CollFold
219250
(coll-fold [_ n combinef reducef] (coll-fold coll n combinef (rf reducef))))))
220251

@@ -225,7 +256,7 @@
225256

226257
clojure.lang.Seqable
227258
(seq [_] (concat (seq left) (seq right)))
228-
259+
229260
clojure.core.protocols/CollReduce
230261
(coll-reduce [this f1] (clojure.core.protocols/coll-reduce this f1 (f1)))
231262
(coll-reduce
@@ -309,7 +340,7 @@
309340
[coll n combinef reducef]
310341
;;can't fold, single reduce
311342
(reduce reducef (combinef) coll))
312-
343+
313344
clojure.lang.IPersistentVector
314345
(coll-fold
315346
[v n combinef reducef]
@@ -319,4 +350,3 @@
319350
(coll-fold
320351
[m n combinef reducef]
321352
(.fold m n combinef reducef fjinvoke fjtask fjfork fjjoin)))
322-

0 commit comments

Comments
 (0)