1
0
forked from Mirror/wren

Fix deadlock bug in map insertion.

This commit is contained in:
Bob Nystrom
2015-08-06 06:55:30 -07:00
parent 71ab3ca887
commit 0631f3b109
2 changed files with 14 additions and 8 deletions

View File

@ -388,14 +388,9 @@ static bool addEntry(MapEntry* entries, uint32_t capacity,
// If we found an open slot, the key is not in the table.
if (IS_UNDEFINED(entry->key))
{
// Don't stop at a tombstone, though, because the key may be found after
// it.
if (IS_FALSE(entry->value))
{
entry->key = key;
entry->value = value;
return true;
}
entry->key = key;
entry->value = value;
return true;
}
else if (wrenValuesEqual(entry->key, key))
{

11
test/core/map/churn.wren Normal file
View File

@ -0,0 +1,11 @@
// This is a regression test for a bug where inserting in a map would not
// correctly reuse tombstone entries, eventually deadlocking on insert.
var map = {}
for (i in 0...100) {
map[i] = i
if (i >= 10) map.remove(i - 10)
}
IO.print(map.count) // expect: 10