4
import collection.concurrent.TrieMap
7
object ConcurrentMapSpec extends Spec {
14
val ct = new TrieMap[Wrap, Int]
15
for (i <- 0 until initsz) assert(ct.put(new Wrap(i), i) == None)
16
for (i <- 0 until initsz) assert(ct.put(new Wrap(i), -i) == Some(i))
19
"support put if absent" in {
20
val ct = new TrieMap[Wrap, Int]
21
for (i <- 0 until initsz) ct.update(new Wrap(i), i)
22
for (i <- 0 until initsz) assert(ct.putIfAbsent(new Wrap(i), -i) == Some(i))
23
for (i <- 0 until initsz) assert(ct.putIfAbsent(new Wrap(i), -i) == Some(i))
24
for (i <- initsz until secondsz) assert(ct.putIfAbsent(new Wrap(i), -i) == None)
25
for (i <- initsz until secondsz) assert(ct.putIfAbsent(new Wrap(i), i) == Some(-i))
28
"support remove if mapped to a specific value" in {
29
val ct = new TrieMap[Wrap, Int]
30
for (i <- 0 until initsz) ct.update(new Wrap(i), i)
31
for (i <- 0 until initsz) assert(ct.remove(new Wrap(i), -i - 1) == false)
32
for (i <- 0 until initsz) assert(ct.remove(new Wrap(i), i) == true)
33
for (i <- 0 until initsz) assert(ct.remove(new Wrap(i), i) == false)
36
"support replace if mapped to a specific value" in {
37
val ct = new TrieMap[Wrap, Int]
38
for (i <- 0 until initsz) ct.update(new Wrap(i), i)
39
for (i <- 0 until initsz) assert(ct.replace(new Wrap(i), -i - 1, -i - 2) == false)
40
for (i <- 0 until initsz) assert(ct.replace(new Wrap(i), i, -i - 2) == true)
41
for (i <- 0 until initsz) assert(ct.replace(new Wrap(i), i, -i - 2) == false)
42
for (i <- initsz until secondsz) assert(ct.replace(new Wrap(i), i, 0) == false)
45
"support replace if present" in {
46
val ct = new TrieMap[Wrap, Int]
47
for (i <- 0 until initsz) ct.update(new Wrap(i), i)
48
for (i <- 0 until initsz) assert(ct.replace(new Wrap(i), -i) == Some(i))
49
for (i <- 0 until initsz) assert(ct.replace(new Wrap(i), i) == Some(-i))
50
for (i <- initsz until secondsz) assert(ct.replace(new Wrap(i), i) == None)
53
def assertEqual(a: Any, b: Any) = {
54
if (a != b) println(a, b)
58
"support replace if mapped to a specific value, using several threads" in {
59
val ct = new TrieMap[Wrap, Int]
61
for (i <- 0 until sz) ct.update(new Wrap(i), i)
63
class Updater(index: Int, offs: Int) extends Thread {
66
for (i <- 0 until sz) {
67
val j = (offs + i) % sz
70
if (k != Int.MaxValue) repeats += 1
71
k = ct.lookup(new Wrap(j))
72
} while (!ct.replace(new Wrap(j), k, -k))
74
//println("Thread %d repeats: %d".format(index, repeats))
78
val threads = for (i <- 0 until 16) yield new Updater(i, sz / 32 * i)
79
threads.foreach(_.start())
80
threads.foreach(_.join())
82
for (i <- 0 until sz) assertEqual(ct(new Wrap(i)), i)
84
val threads2 = for (i <- 0 until 15) yield new Updater(i, sz / 32 * i)
85
threads2.foreach(_.start())
86
threads2.foreach(_.join())
88
for (i <- 0 until sz) assertEqual(ct(new Wrap(i)), -i)
91
"support put if absent, several threads" in {
92
val ct = new TrieMap[Wrap, Int]
95
class Updater(offs: Int) extends Thread {
97
for (i <- 0 until sz) {
98
val j = (offs + i) % sz
99
ct.putIfAbsent(new Wrap(j), j)
100
assert(ct.lookup(new Wrap(j)) == j)
105
val threads = for (i <- 0 until 16) yield new Updater(sz / 32 * i)
106
threads.foreach(_.start())
107
threads.foreach(_.join())
109
for (i <- 0 until sz) assert(ct(new Wrap(i)) == i)
112
"support remove if mapped to a specific value, several threads" in {
113
val ct = new TrieMap[Wrap, Int]
115
for (i <- 0 until sz) ct.update(new Wrap(i), i)
117
class Remover(offs: Int) extends Thread {
119
for (i <- 0 until sz) {
120
val j = (offs + i) % sz
121
ct.remove(new Wrap(j), j)
122
assert(ct.get(new Wrap(j)) == None)
127
val threads = for (i <- 0 until 16) yield new Remover(sz / 32 * i)
128
threads.foreach(_.start())
129
threads.foreach(_.join())
131
for (i <- 0 until sz) assert(ct.get(new Wrap(i)) == None)
134
"have all or none of the elements depending on the oddity" in {
135
val ct = new TrieMap[Wrap, Int]
137
for (i <- 0 until sz) ct(new Wrap(i)) = i
139
class Modifier(index: Int, offs: Int) extends Thread {
141
for (j <- 0 until sz) {
142
val i = (offs + j) % sz
145
if (ct.contains(new Wrap(i))) {
146
success = ct.remove(new Wrap(i)) != None
148
success = ct.putIfAbsent(new Wrap(i), i) == None
155
def modify(n: Int) = {
156
val threads = for (i <- 0 until n) yield new Modifier(i, sz / n * i)
157
threads.foreach(_.start())
158
threads.foreach(_.join())
162
for (i <- 0 until sz) assertEqual(ct.get(new Wrap(i)), Some(i))
164
for (i <- 0 until sz) assertEqual(ct.get(new Wrap(i)), None)
167
"compute size correctly" in {
168
val ct = new TrieMap[Wrap, Int]
170
for (i <- 0 until sz) ct(new Wrap(i)) = i
172
assertEqual(ct.size, sz)
173
assertEqual(ct.size, sz)
176
"compute size correctly in parallel" in {
177
val ct = new TrieMap[Wrap, Int]
179
for (i <- 0 until sz) ct(new Wrap(i)) = i
182
assertEqual(pct.size, sz)
183
assertEqual(pct.size, sz)