X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c547282d5e0205b5dab200d36b7f76f629f7a8fe..9c54e4ae1f401a9c337b97b588e5a356d79cbe82:/src/common/strconv.cpp?ds=sidebyside diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index ffd70ff003..dd806d2c1c 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -1417,8 +1417,19 @@ wxMBConv *wxCSConv::DoCreate() const } #endif // wxUSE_FONTMAP - wxLogError(_("Cannot convert from the charset '%s'!"), - m_name ? m_name + // NB: This is a hack to prevent deadlock. What could otherwise happen + // in Unicode build: wxConvLocal creation ends up being here + // because of some failure and logs the error. But wxLog will try to + // attach timestamp, for which it will need wxConvLocal (to convert + // time to char* and then wchar_t*), but that fails, tries to log + // error, but wxLog has a (already locked) critical section that + // guards static buffer. + static bool alreadyLoggingError = false; + if (!alreadyLoggingError) + { + alreadyLoggingError = true; + wxLogError(_("Cannot convert from the charset '%s'!"), + m_name ? m_name : #if wxUSE_FONTMAP wxFontMapper::GetEncodingDescription(m_encoding).c_str() @@ -1426,6 +1437,8 @@ wxMBConv *wxCSConv::DoCreate() const wxString::Format(_("encoding %s"), m_encoding).c_str() #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP ); + alreadyLoggingError = false; + } return NULL; } @@ -1441,7 +1454,7 @@ void wxCSConv::CreateConvIfNeeded() const // encoding for this system if ( !m_name && m_encoding == wxFONTENCODING_SYSTEM ) { - self->m_encoding = wxLocale::GetSystemEncoding(); + self->m_name = wxStrdup(wxLocale::GetSystemEncodingName()); } #endif // wxUSE_INTL