Kaydet (Commit) 51992508 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Don't call NotifyListeners with mutex locked

...as it causes ThreadSanitizer failures during CppunitTest_basic_macros:

> WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=27295)
>   Cycle in lock order graph: M290054517485674432 (0x000000000000) => M2405 (0x7b0c000054c0) => M290054517485674432
>
>   Mutex M2405 acquired here while holding mutex M290054517485674432 in main thread:
>     #0 pthread_mutex_lock compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3800 (cppunittester+0x45ad87)
>     #1 osl_acquireMutex sal/osl/unx/mutex.cxx:97:16 (libuno_sal.so.3+0xc1ffa)
>     #2 osl::Mutex::acquire() include/osl/mutex.hxx:56:20 (libutllo.so+0xc06c8)
>     #3 osl::Guard<osl::Mutex>::Guard(osl::Mutex&) include/osl/mutex.hxx:129:17 (libutllo.so+0xbcccf)
>     #4 SvtSysLocaleOptions::SvtSysLocaleOptions() unotools/source/config/syslocaleoptions.cxx:504:16 (libutllo.so+0x21a4cd)
>     #5 SvNumberFormatterRegistry_Impl::SvNumberFormatterRegistry_Impl() svl/source/numbers/zforlist.cxx:184:33 (libsvllo.so+0x3da143)
>     #6 SvNumberFormatter::GetFormatterRegistry() svl/source/numbers/zforlist.cxx:368:34 (libsvllo.so+0x3e0a70)
>     #7 SvNumberFormatter::ImpConstruct(o3tl::strong_int<unsigned short, LanguageTypeTag>) svl/source/numbers/zforlist.cxx:322:5 (libsvllo.so+0x3dc328)
>     #8 SvNumberFormatter::SvNumberFormatter(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, o3tl::strong_int<unsigned short, LanguageTypeTag>) svl/source/numbers/zforlist.cxx:263:5 (libsvllo.so+0x3dbcb9)
>     #9 SbiScanner::NextSym() basic/source/comp/scanner.cxx:563:31 (libsblo.so+0x267d29)
>     #10 SbiTokenizer::Next() basic/source/comp/token.cxx:327:10 (libsblo.so+0x2771b8)
>     #11 SbModule::SetSource32(rtl::OUString const&) basic/source/classes/sbxmod.cxx:912:26 (libsblo.so+0x203ac8)
>     #12 StarBASIC::MakeModule(rtl::OUString const&, com::sun::star::script::ModuleInfo const&, rtl::OUString const&) basic/source/classes/sb.cxx:1065:8 (libsblo.so+0x16559a)
>     #13 StarBASIC::MakeModule(rtl::OUString const&, rtl::OUString const&) basic/source/classes/sb.cxx:1037:12 (libsblo.so+0x164fdc)
>     #14 MacroSnippet::MakeModule(rtl::OUString const&) basic/qa/cppunit/basictest.cxx:29:22 (libtest_basic_macros.so+0xa7ac)
>     #15 MacroSnippet::LoadSourceFromFile(rtl::OUString const&) basic/qa/cppunit/basictest.cxx:72:5 (libtest_basic_macros.so+0xb240)
>     #16 (anonymous namespace)::Coverage::run_test(rtl::OUString const&) basic/qa/cppunit/basic_coverage.cxx:75:15 (libtest_basic_macros.so+0x113d9)
>     #17 (anonymous namespace)::Coverage::process_directory(rtl::OUString const&) basic/qa/cppunit/basic_coverage.cxx:126:17 (libtest_basic_macros.so+0x10f46)
>     #18 (anonymous namespace)::Coverage::Coverage_Iterator() basic/qa/cppunit/basic_coverage.cxx:141:5 (libtest_basic_macros.so+0x1066e)
>     #19 void std::__invoke_impl<void, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(std::__invoke_memfun_deref, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:227:14 (libtest_basic_macros.so+0x12ffe)
>     #20 std::result_of<void ((anonymous namespace)::Coverage::* const&((anonymous namespace)::Coverage*&))()>::type std::__invoke<void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:250:14 (libtest_basic_macros.so+0x12eed)
>     #21 _ZNKSt12_Mem_fn_baseIMN12_GLOBAL__N_18CoverageEFvvELb1EEclIJRPS1_EEEDTclsr3stdE8__invokedtdefpT6_M_pmfspclsr3stdE7forwardIT_Efp_EEEDpOS8_ /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:604:11 (libtest_basic_macros.so+0x12dcb)
>     #22 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:933:11 (libtest_basic_macros.so+0x12d3b)
>     #23 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::operator()<, void>() /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:991:17 (libtest_basic_macros.so+0x12c46)
>     #24 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)> >::_M_invoke(std::_Any_data const&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:1731:2 (libtest_basic_macros.so+0x1260a)
>     #25 std::function<void ()>::operator()() const /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:2127:14 (libtest_basic_macros.so+0x1a6be)
>     #26 CppUnit::TestCaller<(anonymous namespace)::Coverage>::runTest() workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7 (libtest_basic_macros.so+0x11dac)
>     #27 CppUnit::TestCaseMethodFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5 (libcppunit-1.14.so.0+0xd61d2)
>     #28 (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) test/source/vclbootstrapprotector.cxx:39:14 (libvclbootstrapprotector.so+0x1114)
>     #29 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #30 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12 (unobootstrapprotector.so+0x2204)
>     #31 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #32 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16 (unoexceptionprotector.so+0x23e9)
>     #33 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #34 CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12 (libcppunit-1.14.so.0+0xa57ad)
>     #35 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #36 CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18 (libcppunit-1.14.so.0+0xc4a96)
>     #37 CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:28 (libcppunit-1.14.so.0+0xf4714)
>     #38 CppUnit::TestCase::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:13 (libcppunit-1.14.so.0+0xd5750)
>     #39 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #40 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #41 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #42 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #43 CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:27 (libcppunit-1.14.so.0+0x10282c)
>     #44 CppUnit::TestResult::runTest(CppUnit::Test*) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:9 (libcppunit-1.14.so.0+0xf4223)
>     #45 CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:14 (libcppunit-1.14.so.0+0x102c76)
>     #46 (anonymous namespace)::ProtectedFixtureFunctor::run() const sal/cppunittester/cppunittester.cxx:316:20 (cppunittester+0x4bd528)
>     #47 sal_main() sal/cppunittester/cppunittester.cxx:466:20 (cppunittester+0x4bc15e)
>     #48 main sal/cppunittester/cppunittester.cxx:373:1 (cppunittester+0x4bb9d5)
>
>   Mutex M290054517485674432 previously acquired by the same thread here:
>     #0 pthread_mutex_lock compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3800 (cppunittester+0x45ad87)
>     #1 osl_acquireMutex sal/osl/unx/mutex.cxx:97:16 (libuno_sal.so.3+0xc1ffa)
>     #2 osl::Mutex::acquire() include/osl/mutex.hxx:56:20 (libsvllo.so+0xeced8)
>     #3 osl::Guard<osl::Mutex>::Guard(osl::Mutex&) include/osl/mutex.hxx:129:17 (libsvllo.so+0xf3b4f)
>     #4 SvNumberFormatter::ImpConstruct(o3tl::strong_int<unsigned short, LanguageTypeTag>) svl/source/numbers/zforlist.cxx:321:23 (libsvllo.so+0x3dc31e)
>     #5 SvNumberFormatter::SvNumberFormatter(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, o3tl::strong_int<unsigned short, LanguageTypeTag>) svl/source/numbers/zforlist.cxx:263:5 (libsvllo.so+0x3dbcb9)
>     #6 SbiScanner::NextSym() basic/source/comp/scanner.cxx:563:31 (libsblo.so+0x267d29)
>     #7 SbiTokenizer::Next() basic/source/comp/token.cxx:327:10 (libsblo.so+0x2771b8)
>     #8 SbModule::SetSource32(rtl::OUString const&) basic/source/classes/sbxmod.cxx:912:26 (libsblo.so+0x203ac8)
>     #9 StarBASIC::MakeModule(rtl::OUString const&, com::sun::star::script::ModuleInfo const&, rtl::OUString const&) basic/source/classes/sb.cxx:1065:8 (libsblo.so+0x16559a)
>     #10 StarBASIC::MakeModule(rtl::OUString const&, rtl::OUString const&) basic/source/classes/sb.cxx:1037:12 (libsblo.so+0x164fdc)
>     #11 MacroSnippet::MakeModule(rtl::OUString const&) basic/qa/cppunit/basictest.cxx:29:22 (libtest_basic_macros.so+0xa7ac)
>     #12 MacroSnippet::LoadSourceFromFile(rtl::OUString const&) basic/qa/cppunit/basictest.cxx:72:5 (libtest_basic_macros.so+0xb240)
>     #13 (anonymous namespace)::Coverage::run_test(rtl::OUString const&) basic/qa/cppunit/basic_coverage.cxx:75:15 (libtest_basic_macros.so+0x113d9)
>     #14 (anonymous namespace)::Coverage::process_directory(rtl::OUString const&) basic/qa/cppunit/basic_coverage.cxx:126:17 (libtest_basic_macros.so+0x10f46)
>     #15 (anonymous namespace)::Coverage::Coverage_Iterator() basic/qa/cppunit/basic_coverage.cxx:141:5 (libtest_basic_macros.so+0x1066e)
>     #16 void std::__invoke_impl<void, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(std::__invoke_memfun_deref, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:227:14 (libtest_basic_macros.so+0x12ffe)
>     #17 std::result_of<void ((anonymous namespace)::Coverage::* const&((anonymous namespace)::Coverage*&))()>::type std::__invoke<void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:250:14 (libtest_basic_macros.so+0x12eed)
>     #18 _ZNKSt12_Mem_fn_baseIMN12_GLOBAL__N_18CoverageEFvvELb1EEclIJRPS1_EEEDTclsr3stdE8__invokedtdefpT6_M_pmfspclsr3stdE7forwardIT_Efp_EEEDpOS8_ /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:604:11 (libtest_basic_macros.so+0x12dcb)
>     #19 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:933:11 (libtest_basic_macros.so+0x12d3b)
>     #20 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::operator()<, void>() /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:991:17 (libtest_basic_macros.so+0x12c46)
>     #21 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)> >::_M_invoke(std::_Any_data const&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:1731:2 (libtest_basic_macros.so+0x1260a)
>     #22 std::function<void ()>::operator()() const /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:2127:14 (libtest_basic_macros.so+0x1a6be)
>     #23 CppUnit::TestCaller<(anonymous namespace)::Coverage>::runTest() workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7 (libtest_basic_macros.so+0x11dac)
>     #24 CppUnit::TestCaseMethodFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5 (libcppunit-1.14.so.0+0xd61d2)
>     #25 (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) test/source/vclbootstrapprotector.cxx:39:14 (libvclbootstrapprotector.so+0x1114)
>     #26 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #27 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12 (unobootstrapprotector.so+0x2204)
>     #28 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #29 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16 (unoexceptionprotector.so+0x23e9)
>     #30 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #31 CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12 (libcppunit-1.14.so.0+0xa57ad)
>     #32 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #33 CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18 (libcppunit-1.14.so.0+0xc4a96)
>     #34 CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:28 (libcppunit-1.14.so.0+0xf4714)
>     #35 CppUnit::TestCase::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:13 (libcppunit-1.14.so.0+0xd5750)
>     #36 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #37 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #38 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #39 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #40 CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:27 (libcppunit-1.14.so.0+0x10282c)
>     #41 CppUnit::TestResult::runTest(CppUnit::Test*) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:9 (libcppunit-1.14.so.0+0xf4223)
>     #42 CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:14 (libcppunit-1.14.so.0+0x102c76)
>     #43 (anonymous namespace)::ProtectedFixtureFunctor::run() const sal/cppunittester/cppunittester.cxx:316:20 (cppunittester+0x4bd528)
>     #44 sal_main() sal/cppunittester/cppunittester.cxx:466:20 (cppunittester+0x4bc15e)
>     #45 main sal/cppunittester/cppunittester.cxx:373:1 (cppunittester+0x4bb9d5)
>
>   Mutex M290054517485674432 acquired here while holding mutex M2405 in main thread:
>     #0 pthread_mutex_lock compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3800 (cppunittester+0x45ad87)
>     #1 osl_acquireMutex sal/osl/unx/mutex.cxx:97:16 (libuno_sal.so.3+0xc1ffa)
>     #2 osl::Mutex::acquire() include/osl/mutex.hxx:56:20 (libsvllo.so+0xeced8)
>     #3 osl::Guard<osl::Mutex>::Guard(osl::Mutex&) include/osl/mutex.hxx:129:17 (libsvllo.so+0xf3b4f)
>     #4 SvNumberFormatter::CurrencyChangeLink(SvNumberFormatter*, LinkParamNone*) svl/source/numbers/zforlist.cxx:3320:23 (libsvllo.so+0x3f7282)
>     #5 SvNumberFormatter::LinkStubCurrencyChangeLink(void*, LinkParamNone*) svl/source/numbers/zforlist.cxx:3318:1 (libsvllo.so+0x3f71f8)
>     #6 Link<LinkParamNone*, void>::Call(LinkParamNone*) const include/tools/link.hxx:84:45 (libutllo.so+0x21cfa0)
>     #7 SvtSysLocaleOptions::ConfigurationChanged(utl::ConfigurationBroadcaster*, ConfigurationHints) unotools/source/config/syslocaleoptions.cxx:674:15 (libutllo.so+0x21c06f)
>     #8 non-virtual thunk to SvtSysLocaleOptions::ConfigurationChanged(utl::ConfigurationBroadcaster*, ConfigurationHints) unotools/source/config/syslocaleoptions.cxx (libutllo.so+0x21c118)
>     #9 utl::ConfigurationBroadcaster::NotifyListeners(ConfigurationHints) unotools/source/config/options.cxx:78:33 (libutllo.so+0x1cd63f)
>     #10 SvtSysLocaleOptions_Impl::SetLocaleString(rtl::OUString const&) unotools/source/config/syslocaleoptions.cxx:390:9 (libutllo.so+0x21935d)
>     #11 SvtSysLocaleOptions::SetLocaleConfigString(rtl::OUString const&) unotools/source/config/syslocaleoptions.cxx:555:12 (libutllo.so+0x21adcc)
>     #12 (anonymous namespace)::Coverage::Coverage_Iterator() basic/qa/cppunit/basic_coverage.cxx:156:31 (libtest_basic_macros.so+0x108e4)
>     #13 void std::__invoke_impl<void, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(std::__invoke_memfun_deref, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:227:14 (libtest_basic_macros.so+0x12ffe)
>     #14 std::result_of<void ((anonymous namespace)::Coverage::* const&((anonymous namespace)::Coverage*&))()>::type std::__invoke<void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:250:14 (libtest_basic_macros.so+0x12eed)
>     #15 _ZNKSt12_Mem_fn_baseIMN12_GLOBAL__N_18CoverageEFvvELb1EEclIJRPS1_EEEDTclsr3stdE8__invokedtdefpT6_M_pmfspclsr3stdE7forwardIT_Efp_EEEDpOS8_ /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:604:11 (libtest_basic_macros.so+0x12dcb)
>     #16 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:933:11 (libtest_basic_macros.so+0x12d3b)
>     #17 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::operator()<, void>() /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:991:17 (libtest_basic_macros.so+0x12c46)
>     #18 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)> >::_M_invoke(std::_Any_data const&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:1731:2 (libtest_basic_macros.so+0x1260a)
>     #19 std::function<void ()>::operator()() const /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:2127:14 (libtest_basic_macros.so+0x1a6be)
>     #20 CppUnit::TestCaller<(anonymous namespace)::Coverage>::runTest() workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7 (libtest_basic_macros.so+0x11dac)
>     #21 CppUnit::TestCaseMethodFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5 (libcppunit-1.14.so.0+0xd61d2)
>     #22 (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) test/source/vclbootstrapprotector.cxx:39:14 (libvclbootstrapprotector.so+0x1114)
>     #23 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #24 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12 (unobootstrapprotector.so+0x2204)
>     #25 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #26 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16 (unoexceptionprotector.so+0x23e9)
>     #27 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #28 CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12 (libcppunit-1.14.so.0+0xa57ad)
>     #29 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #30 CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18 (libcppunit-1.14.so.0+0xc4a96)
>     #31 CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:28 (libcppunit-1.14.so.0+0xf4714)
>     #32 CppUnit::TestCase::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:13 (libcppunit-1.14.so.0+0xd5750)
>     #33 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #34 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #35 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #36 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #37 CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:27 (libcppunit-1.14.so.0+0x10282c)
>     #38 CppUnit::TestResult::runTest(CppUnit::Test*) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:9 (libcppunit-1.14.so.0+0xf4223)
>     #39 CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:14 (libcppunit-1.14.so.0+0x102c76)
>     #40 (anonymous namespace)::ProtectedFixtureFunctor::run() const sal/cppunittester/cppunittester.cxx:316:20 (cppunittester+0x4bd528)
>     #41 sal_main() sal/cppunittester/cppunittester.cxx:466:20 (cppunittester+0x4bc15e)
>     #42 main sal/cppunittester/cppunittester.cxx:373:1 (cppunittester+0x4bb9d5)
>
>   Mutex M2405 previously acquired by the same thread here:
>     #0 pthread_mutex_lock compiler-rt/lib/tsan/../sanitizer_common/sanitizer_common_interceptors.inc:3800 (cppunittester+0x45ad87)
>     #1 osl_acquireMutex sal/osl/unx/mutex.cxx:97:16 (libuno_sal.so.3+0xc1ffa)
>     #2 osl::Mutex::acquire() include/osl/mutex.hxx:56:20 (libutllo.so+0xc06c8)
>     #3 osl::Guard<osl::Mutex>::Guard(osl::Mutex&) include/osl/mutex.hxx:129:17 (libutllo.so+0xbcccf)
>     #4 SvtSysLocaleOptions::SetLocaleConfigString(rtl::OUString const&) unotools/source/config/syslocaleoptions.cxx:554:16 (libutllo.so+0x21adab)
>     #5 (anonymous namespace)::Coverage::Coverage_Iterator() basic/qa/cppunit/basic_coverage.cxx:156:31 (libtest_basic_macros.so+0x108e4)
>     #6 void std::__invoke_impl<void, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(std::__invoke_memfun_deref, void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:227:14 (libtest_basic_macros.so+0x12ffe)
>     #7 std::result_of<void ((anonymous namespace)::Coverage::* const&((anonymous namespace)::Coverage*&))()>::type std::__invoke<void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&>(void ((anonymous namespace)::Coverage::* const&)(), (anonymous namespace)::Coverage*&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:250:14 (libtest_basic_macros.so+0x12eed)
>     #8 _ZNKSt12_Mem_fn_baseIMN12_GLOBAL__N_18CoverageEFvvELb1EEclIJRPS1_EEEDTclsr3stdE8__invokedtdefpT6_M_pmfspclsr3stdE7forwardIT_Efp_EEEDpOS8_ /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:604:11 (libtest_basic_macros.so+0x12dcb)
>     #9 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:933:11 (libtest_basic_macros.so+0x12d3b)
>     #10 void std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)>::operator()<, void>() /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:991:17 (libtest_basic_macros.so+0x12c46)
>     #11 std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void ((anonymous namespace)::Coverage::*)()> ((anonymous namespace)::Coverage*)> >::_M_invoke(std::_Any_data const&) /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:1731:2 (libtest_basic_macros.so+0x1260a)
>     #12 std::function<void ()>::operator()() const /usr/lib/gcc/x86_64-redhat-linux/6.4.1/../../../../include/c++/6.4.1/functional:2127:14 (libtest_basic_macros.so+0x1a6be)
>     #13 CppUnit::TestCaller<(anonymous namespace)::Coverage>::runTest() workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7 (libtest_basic_macros.so+0x11dac)
>     #14 CppUnit::TestCaseMethodFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5 (libcppunit-1.14.so.0+0xd61d2)
>     #15 (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) test/source/vclbootstrapprotector.cxx:39:14 (libvclbootstrapprotector.so+0x1114)
>     #16 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #17 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12 (unobootstrapprotector.so+0x2204)
>     #18 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #19 (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16 (unoexceptionprotector.so+0x23e9)
>     #20 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #21 CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12 (libcppunit-1.14.so.0+0xa57ad)
>     #22 CppUnit::ProtectorChain::ProtectFunctor::operator()() const workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:25 (libcppunit-1.14.so.0+0xc7614)
>     #23 CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18 (libcppunit-1.14.so.0+0xc4a96)
>     #24 CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:28 (libcppunit-1.14.so.0+0xf4714)
>     #25 CppUnit::TestCase::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:13 (libcppunit-1.14.so.0+0xd5750)
>     #26 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #27 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #28 CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:30 (libcppunit-1.14.so.0+0xd6d5a)
>     #29 CppUnit::TestComposite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3 (libcppunit-1.14.so.0+0xd6a2e)
>     #30 CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:27 (libcppunit-1.14.so.0+0x10282c)
>     #31 CppUnit::TestResult::runTest(CppUnit::Test*) workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:9 (libcppunit-1.14.so.0+0xf4223)
>     #32 CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:14 (libcppunit-1.14.so.0+0x102c76)
>     #33 (anonymous namespace)::ProtectedFixtureFunctor::run() const sal/cppunittester/cppunittester.cxx:316:20 (cppunittester+0x4bd528)
>     #34 sal_main() sal/cppunittester/cppunittester.cxx:466:20 (cppunittester+0x4bc15e)
>     #35 main sal/cppunittester/cppunittester.cxx:373:1 (cppunittester+0x4bb9d5)

Change-Id: I2dc13b1e8a5f58155b2df4679bd1c1d73819cb6f
üst 4d830ab3
......@@ -31,13 +31,11 @@
class SvtSysLocaleOptions_Impl;
class SvtListener;
namespace osl { class Mutex; }
class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtSysLocaleOptions : public utl::detail::Options
{
std::shared_ptr<SvtSysLocaleOptions_Impl> pImpl;
UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetMutex();
virtual void ConfigurationChanged( utl::ConfigurationBroadcaster* p, ConfigurationHints nHint ) override;
public:
......
......@@ -43,6 +43,17 @@ namespace
std::weak_ptr<SvtSysLocaleOptions_Impl> g_pSysLocaleOptions;
struct CurrencyChangeLink
: public rtl::Static<Link<LinkParamNone*,void>, CurrencyChangeLink> {};
Mutex& GetMutex()
{
// #i77768# Due to a static reference in the toolkit lib
// we need a mutex that lives longer than the svl library.
// Otherwise the dtor would use a destructed mutex!!
static Mutex* persistentMutex(new Mutex);
return *persistentMutex;
}
}
class SvtSysLocaleOptions_Impl : public utl::ConfigItem
......@@ -378,70 +389,94 @@ void SvtSysLocaleOptions_Impl::ImplCommit()
void SvtSysLocaleOptions_Impl::SetLocaleString( const OUString& rStr )
{
if (!m_bROLocale && rStr != m_aLocaleString )
ConfigurationHints nHint = ConfigurationHints::Locale;
{
MutexGuard aGuard( GetMutex() );
if (m_bROLocale || rStr == m_aLocaleString )
{
return;
}
m_aLocaleString = rStr;
MakeRealLocale();
LanguageTag::setConfiguredSystemLanguage( m_aRealLocale.getLanguageType() );
SetModified();
ConfigurationHints nHint = ConfigurationHints::Locale;
if ( m_aCurrencyString.isEmpty() )
nHint |= ConfigurationHints::Currency;
NotifyListeners( nHint );
}
NotifyListeners( nHint );
}
void SvtSysLocaleOptions_Impl::SetUILocaleString( const OUString& rStr )
{
if (!m_bROUILocale && rStr != m_aUILocaleString )
{
MutexGuard aGuard( GetMutex() );
if (m_bROUILocale || rStr == m_aUILocaleString )
{
return;
}
m_aUILocaleString = rStr;
// as we can't switch UILocale at runtime, we only store changes in the configuration
MakeRealUILocale();
SetModified();
NotifyListeners( ConfigurationHints::UiLocale );
}
NotifyListeners( ConfigurationHints::UiLocale );
}
void SvtSysLocaleOptions_Impl::SetCurrencyString( const OUString& rStr )
{
if (!m_bROCurrency && rStr != m_aCurrencyString )
{
MutexGuard aGuard( GetMutex() );
if (m_bROCurrency || rStr == m_aCurrencyString )
{
return;
}
m_aCurrencyString = rStr;
SetModified();
NotifyListeners( ConfigurationHints::Currency );
}
NotifyListeners( ConfigurationHints::Currency );
}
void SvtSysLocaleOptions_Impl::SetDatePatternsString( const OUString& rStr )
{
if (!m_bRODatePatterns && rStr != m_aDatePatternsString )
{
MutexGuard aGuard( GetMutex() );
if (m_bRODatePatterns || rStr == m_aDatePatternsString )
{
return;
}
m_aDatePatternsString = rStr;
SetModified();
NotifyListeners( ConfigurationHints::DatePatterns );
}
NotifyListeners( ConfigurationHints::DatePatterns );
}
void SvtSysLocaleOptions_Impl::SetDecimalSeparatorAsLocale( bool bSet)
{
if(bSet != m_bDecimalSeparator)
{
MutexGuard aGuard( GetMutex() );
if(bSet == m_bDecimalSeparator)
{
return;
}
m_bDecimalSeparator = bSet;
SetModified();
NotifyListeners( ConfigurationHints::DecSep );
}
NotifyListeners( ConfigurationHints::DecSep );
}
void SvtSysLocaleOptions_Impl::SetIgnoreLanguageChange( bool bSet)
{
if(bSet != m_bIgnoreLanguageChange)
{
MutexGuard aGuard( GetMutex() );
if(bSet == m_bIgnoreLanguageChange)
{
return;
}
m_bIgnoreLanguageChange = bSet;
SetModified();
NotifyListeners( ConfigurationHints::IgnoreLang );
}
NotifyListeners( ConfigurationHints::IgnoreLang );
}
void SvtSysLocaleOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
......@@ -520,17 +555,6 @@ SvtSysLocaleOptions::~SvtSysLocaleOptions()
pImpl.reset();
}
// static
Mutex& SvtSysLocaleOptions::GetMutex()
{
// #i77768# Due to a static reference in the toolkit lib
// we need a mutex that lives longer than the svl library.
// Otherwise the dtor would use a destructed mutex!!
static Mutex* persistentMutex(new Mutex);
return *persistentMutex;
}
bool SvtSysLocaleOptions::IsModified()
{
MutexGuard aGuard( GetMutex() );
......@@ -551,13 +575,11 @@ void SvtSysLocaleOptions::BlockBroadcasts( bool bBlock )
void SvtSysLocaleOptions::SetLocaleConfigString( const OUString& rStr )
{
MutexGuard aGuard( GetMutex() );
pImpl->SetLocaleString( rStr );
}
void SvtSysLocaleOptions::SetUILocaleConfigString( const OUString& rStr )
{
MutexGuard aGuard( GetMutex() );
pImpl->SetUILocaleString( rStr );
}
......@@ -569,7 +591,6 @@ const OUString& SvtSysLocaleOptions::GetCurrencyConfigString() const
void SvtSysLocaleOptions::SetCurrencyConfigString( const OUString& rStr )
{
MutexGuard aGuard( GetMutex() );
pImpl->SetCurrencyString( rStr );
}
......@@ -581,7 +602,6 @@ const OUString& SvtSysLocaleOptions::GetDatePatternsConfigString() const
void SvtSysLocaleOptions::SetDatePatternsConfigString( const OUString& rStr )
{
MutexGuard aGuard( GetMutex() );
pImpl->SetDatePatternsString( rStr );
}
......@@ -593,7 +613,6 @@ bool SvtSysLocaleOptions::IsDecimalSeparatorAsLocale() const
void SvtSysLocaleOptions::SetDecimalSeparatorAsLocale( bool bSet)
{
MutexGuard aGuard( GetMutex() );
pImpl->SetDecimalSeparatorAsLocale(bSet);
}
......@@ -605,7 +624,6 @@ bool SvtSysLocaleOptions::IsIgnoreLanguageChange() const
void SvtSysLocaleOptions::SetIgnoreLanguageChange( bool bSet)
{
MutexGuard aGuard( GetMutex() );
pImpl->SetIgnoreLanguageChange(bSet);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment