summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/parallel/mutable/ParArray.scala
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-09-13 16:07:33 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-09-13 16:07:33 +0000
commitcfb6168dc5eef906b2552c7b40765db1d6720652 (patch)
tree4ba1ffd338f7dac34a7c08ac29a03e005b2ca34f /src/library/scala/collection/parallel/mutable/ParArray.scala
parentf7a6c8823b39c622a1f96f9aaafb828427d4edda (diff)
downloadscala-cfb6168dc5eef906b2552c7b40765db1d6720652.tar.gz
scala-cfb6168dc5eef906b2552c7b40765db1d6720652.tar.bz2
scala-cfb6168dc5eef906b2552c7b40765db1d6720652.zip
Improving parallel scan. No review
Diffstat (limited to 'src/library/scala/collection/parallel/mutable/ParArray.scala')
-rw-r--r--src/library/scala/collection/parallel/mutable/ParArray.scala18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/library/scala/collection/parallel/mutable/ParArray.scala b/src/library/scala/collection/parallel/mutable/ParArray.scala
index 0d0b045912..aa0eb03365 100644
--- a/src/library/scala/collection/parallel/mutable/ParArray.scala
+++ b/src/library/scala/collection/parallel/mutable/ParArray.scala
@@ -535,25 +535,33 @@ extends ParSeq[T]
override def map[S, That](f: T => S)(implicit bf: CanBuildFrom[ParArray[T], S, That]) = if (buildsArray(bf(repr))) {
// reserve an array
- val targetarr = new Array[Any](length)
+ val targarrseq = new ArraySeq[S](length)
+ val targetarr = targarrseq.array.asInstanceOf[Array[Any]]
// fill it in parallel
executeAndWait(new Map[S](f, targetarr, 0, length))
// wrap it into a parallel array
- (new ParArray[S](new ExposedArraySeq[S](targetarr.asInstanceOf[Array[AnyRef]], length))).asInstanceOf[That]
+ (new ParArray[S](targarrseq)).asInstanceOf[That]
} else super.map(f)(bf)
override def scan[U >: T, That](z: U)(op: (U, U) => U)(implicit cbf: CanCombineFrom[ParArray[T], U, That]): That = if (buildsArray(cbf(repr))) {
// reserve an array
- val targetarr = new Array[Any](length + 1)
+ val targarrseq = new ArraySeq[U](length + 1)
+ val targetarr = targarrseq.array.asInstanceOf[Array[Any]]
targetarr(0) = z
// do a parallel prefix scan
- executeAndWait(new ScanToArray[U, Any](z, op, 1, size, targetarr, parallelIterator))
+ executeAndWait(new PartialScan[U, Any](z, op, 1, size, targetarr, parallelIterator) mapResult { st =>
+ //println("-----------------------")
+ //println(targetarr.toList)
+ //st.printTree
+ executeAndWaitResult(new ApplyScanTree[U, Any](None, op, st, targetarr))
+ })
+ //println(targetarr.toList)
// wrap the array into a parallel array
- (new ParArray[U](new ExposedArraySeq[U](targetarr.asInstanceOf[Array[AnyRef]], length + 1))).asInstanceOf[That]
+ (new ParArray[U](targarrseq)).asInstanceOf[That]
} else super.scan(z)(op)(cbf)
/* tasks */