[Mono-dev] do_rehash race
Rodrigo Kumpera
kumpera at gmail.com
Thu May 28 18:46:53 UTC 2015
Good catch!
That's indeed a bug.
On Thu, May 28, 2015 at 2:35 PM, Neale Ferguson <neale at sinenomine.net>
wrote:
> Hi,
> When a hash table exceeds a threshold a rehash operation is triggered. At
> the moment the new table is allocated and its address placed in the table
> field of the structure. The do_rehash also then copies the entries from
> the old table to the new. However, if there is another thread active that
> is doing lookups then there is a window where the new table is still being
> filled such that a lookup can fail. This is because the new table is made
> active before it has been copied. This proposed patch will fill the new
> table before swapping the old for the new table in the hash structure.
>
> Neale
>
> @@ -194,24 +196,24 @@ do_rehash (void *_data)
> Slot **table;
>
> /* printf ("Resizing diff=%d slots=%d\n", hash->in_use -
> hash->last_rehash, hash->table_size); */
> - hash->last_rehash = hash->table_size;
> current_size = hash->table_size;
> - hash->table_size = data->new_size;
> /* printf ("New size: %d\n", hash->table_size); */
> table = hash->table;
> - hash->table = data->table;
>
> for (i = 0; i < current_size; i++){
> Slot *s, *next;
>
> for (s = table [i]; s != NULL; s = next){
> - guint hashcode = ((*hash->hash_func) (s->key)) %
> hash->table_size;
> + guint hashcode = ((*hash->hash_func) (s->key)) %
> data->new_size;
> next = s->next;
>
> - s->next = hash->table [hashcode];
> - hash->table [hashcode] = s;
> + s->next = data->table [hashcode];
> + data->table [hashcode] = s;
> }
> }
> + hash->table_size = data->new_size;
> + hash->last_rehash = hash->table_size;
> + hash->table = data->table;
> return table;
> }
>
>
> Neale
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20150528/f9edaf91/attachment-0001.html>
More information about the Mono-devel-list
mailing list