|
20 | 20 | (set! *warn-on-reflection* true)
|
21 | 21 |
|
22 | 22 | ;;;;;;;;;;;;;; some fj stuff ;;;;;;;;;;
|
23 |
| -;;todo - dynamic java 7+ detection and use |
24 | 23 |
|
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`. |
26 | 27 |
|
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))) |
29 | 36 |
|
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.))) |
34 | 42 |
|
35 |
| -(defn- fjfork [task] (.fork ^jsr166y.ForkJoinTask task)) |
| 43 | + (defn fjtask [^Callable f] |
| 44 | + (java.util.concurrent.ForkJoinTask/adapt f)) |
36 | 45 |
|
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)))) |
38 | 69 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
39 | 70 |
|
40 | 71 | (defn reduce
|
|
214 | 245 | clojure.core.protocols/CollReduce
|
215 | 246 | (coll-reduce [this f1] (clojure.core.protocols/coll-reduce this f1 (f1)))
|
216 | 247 | (coll-reduce [_ f1 init] (clojure.core.protocols/coll-reduce coll (rf f1) init))
|
217 |
| - |
| 248 | + |
218 | 249 | CollFold
|
219 | 250 | (coll-fold [_ n combinef reducef] (coll-fold coll n combinef (rf reducef))))))
|
220 | 251 |
|
|
225 | 256 |
|
226 | 257 | clojure.lang.Seqable
|
227 | 258 | (seq [_] (concat (seq left) (seq right)))
|
228 |
| - |
| 259 | + |
229 | 260 | clojure.core.protocols/CollReduce
|
230 | 261 | (coll-reduce [this f1] (clojure.core.protocols/coll-reduce this f1 (f1)))
|
231 | 262 | (coll-reduce
|
|
309 | 340 | [coll n combinef reducef]
|
310 | 341 | ;;can't fold, single reduce
|
311 | 342 | (reduce reducef (combinef) coll))
|
312 |
| - |
| 343 | + |
313 | 344 | clojure.lang.IPersistentVector
|
314 | 345 | (coll-fold
|
315 | 346 | [v n combinef reducef]
|
|
319 | 350 | (coll-fold
|
320 | 351 | [m n combinef reducef]
|
321 | 352 | (.fold m n combinef reducef fjinvoke fjtask fjfork fjjoin)))
|
322 |
| - |
|
0 commit comments