<div dir="ltr"><div>Hi all,</div><div><br></div><div>This is a remainder that our <b>String class is NOT thread safe</b>, and should NOT be used inside an object shared across multiple threads. In particular, it's not necessarily safe to have it as a member of ThreadSafeRefCounted class, which can be <i>accessed</i> from multiple threads.</div><div><br></div><div>Let's consider the following example.</div><div><br></div><div><font face="monospace, monospace">class A : public ThreadSafeRefCounted<A> {</font></div><div><font face="monospace, monospace">    public:</font></div><div><font face="monospace, monospace">        A(const String& name)</font></div><div><font face="monospace, monospace">            : m_name(name)</font></div><div><font face="monospace, monospace">        { }</font></div><div><font face="monospace, monospace">        String name() { return m_name.isolatedCopy(); }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    private:</font></div><div><font face="monospace, monospace">        String m_name;</font></div><div><font face="monospace, monospace">}</font></div><div><br></div><div>This code is NOT thread safe depending on how name() is used.</div><div><br></div><div>For example, if it's ever inserted or looked up in a hash table as the key, or if it's ever converted into an AtomicString, then it would lead to memory corruption. This is because String::hash() would mutate m_hashAndFlags member variable without any lock, and isolatedCopy() doesn't make a copy if there is exactly one reference to a given StringImpl (String is basically just a RefPtr of StringImpl).</div><br clear="all"><div><div class="gmail_signature">- R. Niwa</div></div>
</div>