From a254ce22a8c7c216e777480acf9e6597aa589931 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 10 Mar 2020 20:53:58 +0100 Subject: [PATCH] Fix optimized mingw/gcc-8.2 builds gcc-8.2 -O3 optimization enables -finline-functions. For reasons yet unknown this causes issues with Glib::Threads::Private when loading sessions (creating new ones is fine) and likely some other operations. Without this change the following happens (5.12 as well as current git) when loading an existing session: --- [Switching to Thread 6092.0x12fc] Breakpoint 1, ARDOUR::SessionEvent::create_per_thread_pool (name=..., nitems=4096) at ../libs/ardour/session_events.cc:60 60 in ../libs/ardour/session_events.cc $6 = (const std::__cxx11::string &) @0x210dfc60: {static npos = 18446744073709551615, _M_dataplus = {> = {<__gnu_cxx::new_allocator> = {}, }, _M_p = 0x210dfc70 "GUI"}, _M_string_length = 3, {_M_local_buf = "GUI\000\000\000\000\000P:\000\000\000", _M_allocated_capacity = 4805959}} #0 ARDOUR::SessionEvent::create_per_thread_pool (name=..., nitems=4096) at ../libs/ardour/session_events.cc:60 #1 0x0000000000434e77 in ?? () [..] Thread 1 (Thread 6092.0x12fc): #0 0x0000000061f152ef in PBD::RingBuffer::write (this=this@entry=0x50, src=src@entry=0x210dcdc8, cnt=cnt@entry=1) at ../libs/pbd/pbd/ringbuffer.h:170 #1 0x0000000061ee954d in push (t=, this=0x0) at ../libs/pbd/pool.cc:290 #2 CrossThreadPool::flush_pending_with_ev (this=0x0, ptr=) at ../libs/pbd/pool.cc:254 #3 0x00000000218d5b01 in operator() (a0=0x210dcdc8, this=0x48) at /home/ardour/win-stack-w64/include/boost/function/function_template.hpp:682 #4 operator(), boost::_bi::list0> (a=, f=..., this=0x68) at /home/ardour/win-stack-w64/include/boost/bind/bind.hpp:259 #5 operator() (this=0x48) at /home/ardour/win-stack-w64/include/boost/bind/bind.hpp:1294 #6 boost::detail::function::void_function_obj_invoker0, boost::_bi::list1 > >, void>::invoke(boost::detail::function::function_buffer&) (function_obj_ptr=...) at /home/ardour/win-stack-w64/include/boost/function/function_template.hpp:159 #7 0x0000000063e2dc39 in operator() (this=0x210dcf70) at /home/ardour/win-stack-w64/include/boost/function/function_template.hpp:682 #8 AbstractUI::call_slot(PBD::EventLoop::InvalidationRecord*, boost::function const&) (this=0x3ada50e0, invalidation=0x0, f=...) at ../libs/pbd/pbd/abstract_ui.cc:434 #9 0x00000000216cbb96 in ARDOUR::SessionEventManager::merge_event (this=, ev=) at /home/ardour/win-stack-w64/include/boost/function/function_template.hpp:507 #10 0x00000000216e3861 in non-virtual thunk to ARDOUR::Session::queue_event(ARDOUR::SessionEvent*) () at ../../win-stack-w64/include/glibmm-2.4/glibmm/threads.h:709 #11 0x00000000216c91bf in ARDOUR::SessionEventManager::clear_events(ARDOUR::SessionEvent::Type, boost::function) (this=this@entry=0x4256cc08, type=type@entry=ARDOUR::SessionEvent::Skip, after=...) at ../libs/ardour/session_events.cc:156 #12 0x000000002168874a in ARDOUR::Session::sync_locations_to_skips (this=this@entry=0x4256ca90) at /usr/lib/gcc/x86_64-w64-mingw32/8.3-posix/include/c++/new:169 #13 0x0000000021688802 in ARDOUR::Session::update_skips (this=this@entry=0x4256ca90, loc=loc@entry=0x0, consolidate=consolidate@entry=false) at ../libs/ardour/session.cc:1683 #14 0x0000000021699649 in _locations_changed (locations=..., this=0x4256ca90) at ../libs/ardour/session.cc:1859 #15 apply (method= (void (ARDOUR::Session::*)(ARDOUR::Session * const, const ARDOUR::Locations::LocationList &)) 0x216994f0 > const&)>, obj=..., this=0x40ff4c60) at ../libs/ardour/ardour/location.h:240 #16 ARDOUR::Session::locations_changed (this=this@entry=0x4256ca90) at ../libs/ardour/session.cc:1840 #17 0x0000000021700abd in ARDOUR::Session::set_state (this=0x4256ca90, node=..., version=6000) at ../libs/ardour/session_state.cc:1657 #18 0x0000000021713456 in ARDOUR::Session::post_engine_init (this=this@entry=0x4256ca90) at ../libs/pbd/pbd/xml++.h:81 #19 0x00000000216ad5cd in ARDOUR::Session::Session (this=0x4256ca90, eng=..., fullpath=..., snapshot_name=..., bus_profile=, mix_template=...) at ../libs/ardour/session.cc:383 #20 0x000000000046db8b in ?? () Backtrace stopped: previous frame inner to this frame (corrupt stack?) --- Note that in the trace starting at #19 the source-file references are offset :post_engine_init() isn't in xml++.h (likely debug symbols are incorrect due to inline functions) The application crashes due to #2 ::flush_pending_with_ev (this=0x0 ..) But the earlier breakpoint above shows that the ThreadPool was created, and this #11 ::clear_events() should not assign NULL. (This happens on a single-core CPU, too) --- wscript | 1 + 1 file changed, 1 insertion(+) diff --git a/wscript b/wscript index a9bb96be06..14540cdedf 100644 --- a/wscript +++ b/wscript @@ -549,6 +549,7 @@ int main() { return 0; }''', # mingw/gcc-8.2 compiler_flags.append(flags_dict['xsaveintrin']) + compiler_flags.append('-fno-inline-functions') # end of processor-specific section