13
0

work-around OSX loadlocale thread safety.

This is not a real fix; just a stop-gap for the worst offender.

iostream on OSX is not thread safe.
Sadly no crash report so far managed to catch the 2nd thread in action.
looks like the GUI thread is preempted, 2nd thread succeeds, and the 
crash occurs later).

see also https://discussions.apple.com/thread/3479591

crash in
   s << c->internal_to_user (c->get_value ());

ardour-4.1.335(5000,0x7fff777f5300) malloc: *** error for object 0x7fe2f3e06170: pointer being freed was not allocated
1   libsystem_c.dylib       abort + 129
2   libsystem_malloc.dylib  free + 428
3   libsystem_c.dylib       __numeric_load_locale + 544
4   libsystem_c.dylib       loadlocale + 216
5   libstdc++.6.dylib       std::__convert_from_v(int* const&, char*, int, char const*, ...) + 193
6   libstdc++.6.dylib       std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const + 193
7   libstdc++.6.dylib       std::ostream& std::ostream::_M_insert<double>(double) + 221
8   ardour-4.1.335          ProcessorEntry::Control::set_tooltip() + 854 (processor_box.cc:578)
9   ardour-4.1.335          ProcessorEntry::Control::control_changed() + 446 (processor_box.cc:637)
10  ibpbd.dylib             PBD::StandardTimer::on_elapsed()
This commit is contained in:
Robin Gareus 2015-07-28 20:54:43 +02:00
parent 64af6c880c
commit 36f6aa9356

View File

@ -568,18 +568,14 @@ ProcessorEntry::Control::set_tooltip ()
if (!c) { if (!c) {
return; return;
} }
char tmp[256];
stringstream s;
s << _name << ": ";
if (c->toggled ()) { if (c->toggled ()) {
s << (c->get_value() > 0.5 ? _("on") : _("off")); snprintf (tmp, sizeof(tmp), "%sX %s", _name.c_str(), c->get_value() > 0.5 ? _("on") : _("off"));
} else { } else {
s << setprecision(2) << fixed; snprintf (tmp, sizeof(tmp), "%sX %.2f", _name.c_str(), c->internal_to_user (c->get_value ()));
s << c->internal_to_user (c->get_value ());
} }
string sm = Glib::Markup::escape_text (s.str()); string sm = Glib::Markup::escape_text (tmp);
_slider_persistant_tooltip.set_tip (sm); _slider_persistant_tooltip.set_tip (sm);
ARDOUR_UI::instance()->set_tip (_button, sm); ARDOUR_UI::instance()->set_tip (_button, sm);
} }