<div dir="ltr">Yes, please.</div><div class="gmail_extra"><br clear="all"><div>Rafael "Monoman" Teixeira<br>---------------------------------------<br>"The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny ...'"<br>
Isaac Asimov<br>US science fiction novelist & scholar (1920 - 1992)</div>
<br><br><div class="gmail_quote">On Sun, Feb 3, 2013 at 5:15 PM, Greg Young <span dir="ltr"><<a href="mailto:gregoryyoung1@gmail.com" target="_blank">gregoryyoung1@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The .NET dictionary implementation is thread safe on reads/updates so<br>
long as the internal collection does not grow and size is of reference<br>
type or smaller. eg: if you set size to 1m items and had 100k with a<br>
fill factor that did not cause an internal growth it would be<br>
threadsafe. This assurance has been brought over from Hashtable (well<br>
documented) and is relatively not well documented but many take a<br>
dependency on it. The current mono implementation does not meet this<br>
assurance.<br>
<br>
                        int cur = table [(hashCode & int.MaxValue) % table.Length] - 1;<br>
<br>
                        // walk linked list until right slot is found or end is reached<br>
                        while (cur != NO_SLOT) {<br>
                                // The ordering is important for compatibility with MS and strange<br>
                                // Object.Equals () implementations<br>
                                if (linkSlots [cur].HashCode == hashCode && hcp.Equals (keySlots<br>
[cur], key)) {<br>
                                        value = valueSlots [cur];<br>
                                        return true;<br>
                                }<br>
                                cur = linkSlots [cur].Next;<br>
                        }<br>
<br>
seems fine when accessing. However when adding...<br>
<br>
                        // find an empty slot<br>
                        cur = emptySlot;<br>
                        if (cur == NO_SLOT)<br>
                                cur = touchedSlots++;<br>
                        else<br>
                                emptySlot = linkSlots [cur].Next;<br>
<br>
                        // store the hash code of the added item,<br>
                        // prepend the added item to its linked list,<br>
                        // update the hash table<br>
                        linkSlots [cur].HashCode = hashCode;<br>
                        linkSlots [cur].Next = table [index] - 1;<br>
                        table [index] = cur + 1;<br>
<br>
                        // store item's data<br>
                        keySlots [cur] = key;<br>
                        valueSlots [cur] = value;<br>
<br>
Can cause null reads of a key as its in linkSlots but the value slot<br>
has not yet been updated. Setting keySlots after valueSlots would seem<br>
to solve this. Pull request wanted?<br>
<br>
Cheers,<br>
<br>
Greg<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Le doute n'est pas une condition agréable, mais la certitude est absurde.<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>
</font></span></blockquote></div><br></div>