On 09/06/2012 12:46 PM, Stefan Teleman wrote:
On Thu, Sep 6, 2012 at 12:16 PM, Martin Sebor<[email protected]>  wrote:

This locks a different mutex, one unrelated to __rw_facet::_C_mutex.

Let's debug this the good-ol' fashioned way: with fprintf(3C).  Let's
print the addresses of the mutex being locked in various places, and
see what we get:

...
grouping: _RWSTD_MT_GUARD (__self->_C_mutex): 0xf774913c
_C_get_data: _RWSTD_MT_GUARD (&_C_mutex): 0xf774913c

[ ... deadlock ... ]

Looks like the same mutex to me ...

These two are the same. The one you pointed to before
(__rw_facet::_C_manage at line 366) is a different one.

Now that we know what's causing the deadlock (and that
we can't use the same mutex in the inline function),
let's see if we can fix it in __rw_get_numpunct()
(and __rw_get_moneypunct()).

Here's a thought: it's not pretty but how about having
the function initialize the facet? It already has a pointer
to the base class, so it could downcast it to std::numpunct
(or moneypunct, respectively), and assign the initial values
to the members. Would that work?

Martin

Reply via email to