Travis Vitek wrote:

The method for initializing the facet id is not currently thread safe.

If a thread enters __rw_facet_id::_C_init() and is preempted after
checking _C_id, a second thread can do the same check, increment the
static counter, assign the facet id, and then return. The preempted
thread would increment the static counter again, assign a new value to
the facet id.

This could cause has_facet, use_facet, or locale constructor to fail
unexpectedly.

I'm fine with the patch but I'm curious if we have tests that fail
as result of this? The standard facets all have their own unique
unchanged ids that are assigned when the facet is constructed by
the library.

The _C_init() function is (should be) only called on user-defined
specializations of facets (such as ctype<UserChar> or PhoneFacet).
Initialization of such facets should, of course, be thread-safe
as well but I don't think we have tests that exercise it.



2007-09-28  Travis Vitek  <[EMAIL PROTECTED]>

        * facet.cpp (_C_init): initialize facet id in a threadsafe
        manner.



Index: facet.cpp
===================================================================
--- facet.cpp   (revision 578875)
+++ facet.cpp   (working copy)
@@ -597,17 +597,15 @@
_RWSTD_SIZE_T __rw_facet_id::_C_init () const
 {
+    _RWSTD_MT_STATIC_GUARD(_RW::__rw_facet_id);

This is missing a space before the paren.

Martin

Reply via email to