<div dir="ltr">Good catch!<div><br></div><div>That's indeed a bug.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 28, 2015 at 2:35 PM, Neale Ferguson <span dir="ltr"><<a href="mailto:neale@sinenomine.net" target="_blank">neale@sinenomine.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
 When a hash table exceeds a threshold a rehash operation is triggered. At<br>
the moment the new table is allocated and its address placed in the table<br>
field of the structure. The do_rehash also then copies the entries from<br>
the old table to the new. However, if there is another thread active that<br>
is doing lookups then there is a window where the new table is still being<br>
filled such that a lookup can fail. This is because the new table is made<br>
active before it has been copied. This proposed patch will fill the new<br>
table before swapping the old for the new table in the hash structure.<br>
<br>
Neale<br>
<br>
@@ -194,24 +196,24 @@ do_rehash (void *_data)<br>
        Slot **table;<br>
<br>
        /* printf ("Resizing diff=%d slots=%d\n", hash->in_use -<br>
hash->last_rehash, hash->table_size); */<br>
-       hash->last_rehash = hash->table_size;<br>
        current_size = hash->table_size;<br>
-       hash->table_size = data->new_size;<br>
        /* printf ("New size: %d\n", hash->table_size); */<br>
        table = hash->table;<br>
-       hash->table = data->table;<br>
<br>
        for (i = 0; i < current_size; i++){<br>
                Slot *s, *next;<br>
<br>
                for (s = table [i]; s != NULL; s = next){<br>
-                       guint hashcode = ((*hash->hash_func) (s->key)) %<br>
hash->table_size;<br>
+                       guint hashcode = ((*hash->hash_func) (s->key)) %<br>
data->new_size;<br>
                        next = s->next;<br>
<br>
-                       s->next = hash->table [hashcode];<br>
-                       hash->table [hashcode] = s;<br>
+                       s->next = data->table [hashcode];<br>
+                       data->table [hashcode] = s;<br>
                }<br>
        }<br>
+       hash->table_size = data->new_size;<br>
+       hash->last_rehash = hash->table_size;<br>
+       hash->table = data->table;<br>
        return table;<br>
 }<br>
<br>
<br>
Neale<br>
<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>