WContainerWidget and/or WLayout memory-starves browsers to death

Added by Ulf Johnsson 7 months ago

Hi!

We are having a problem in our web-server using the latest version of Wt3.
The problem is that the webserver seems to starve browsers (I've tried the latest versions of Chrome, FireFox and Edge with same result) for memory until there is no more available memory.
The issue is most noticeable when using model-view-widgets, but seems to be reproducable with other techniques as well.
I think this problem is related to circular references in the DOM-structures, since the browser does not seem to release (in my example below) BUTTON-ELEMENTS.

In the example below the memory used by the browser will grow quickly when scrolling the WTableView up and down (as expected), but it will never free the memory again (except for when the session is terminated):

class MyApplication : public Wt::WApplication
{
public:
    MyApplication (const Wt::WEnvironment &enviorment) : Wt::WApplication(enviorment) {}

    class TestDelegate : public Wt::WAbstractItemDelegate
    {
    public:
        TestDelegate(Wt::WObject *parent = 0) : Wt::WAbstractItemDelegate(parent) {}

        /***************************************************************************/
        Wt::WWidget* update(Wt::WWidget *widget, const Wt::WModelIndex &index, Wt::WFlags<Wt::ViewItemRenderFlag>) override
        {
            if(widget)
                return widget;

            Wt::WContainerWidget *con = new Wt::WContainerWidget;
            Wt::WHBoxLayout *l = new Wt::WHBoxLayout;
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            l->addWidget(new Wt::WPushButton("Now I am here!"));
            con->setLayout(l);
            return con;
        }
    };

    /***************************************************************/
    void initialize()
    {
        WApplication::initialize();

        Wt::WTableView *tv = new Wt::WTableView(root());
        tv->resize(500, 1000);
        tv->setColumnWidth(0, 500);
        tv->setRowHeight(30);

        auto del = new TestDelegate;
        tv->setItemDelegate(del);

        const std::vector<Wt::WString> stdData(10000, "");
         Wt::WStringListModel *model = new Wt::WStringListModel(stdData);
        tv->setModel(model);

        Wt::WPushButton *pb = new Wt::WPushButton("refresh", root());
        tv->show();
        pb->show();
        return;
    }
};

However, in this very simmilar example below the memory seems to be freed regularly (notice that this example does not use Layouts)

class MyApplication : public Wt::WApplication
{
public:
    MyApplication (const Wt::WEnvironment &enviorment) : Wt::WApplication(enviorment) {}

    class TestDelegate : public Wt::WAbstractItemDelegate
    {
    public:
        TestDelegate(Wt::WObject *parent = 0) : Wt::WAbstractItemDelegate(parent) {}

        /***************************************************************************/
        Wt::WWidget* update(Wt::WWidget *widget, const Wt::WModelIndex &index, Wt::WFlags<Wt::ViewItemRenderFlag>) override
        {
            if(widget)
                return widget;

            Wt::WContainerWidget *con = new Wt::WContainerWidget;
            con->addWidget(new CustomButton(counter));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            con->addWidget(new Wt::WPushButton("Now I am here!"));
            return con;
        }
    };

    /***************************************************************/
     void initialize()
    {
        WApplication::initialize();

        Wt::WTableView *tv = new Wt::WTableView(root());
        tv->resize(500, 1000);
        tv->setColumnWidth(0, 500);
        tv->setRowHeight(30);

        auto del = new TestDelegate;
        tv->setItemDelegate(del);

        const std::vector<Wt::WString> stdData(10000, "");
         Wt::WStringListModel *model = new Wt::WStringListModel(stdData);
        tv->setModel(model);

        Wt::WPushButton *pb = new Wt::WPushButton("refresh", root());
        tv->show();
        pb->show();
        return;
    }
};

I am not sure if the layout-system is related to this issue, it is just an observation that I have made.

BR, Ulf.

buttons.png (19 KB)


Replies (19)

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

It appears that this is caused by attaching data using jQuery (1.x)'s jQuery.data to DOM elements. When the element is then not removed by using a jQuery function like jQuery.remove or jQuery.html, that causes a leak rather than preventing one. I pushed a commit (837dd8e for Wt 3, 3b7a736 for Wt 4) that should already fix it for layouts. We'll have to revise all of our uses of jQuery.data before the next release.

This was an issue before, but it has probably just worsened because there's more data being kept around now than before (not a lot, but if there's a leak that adds up).

Can you check if it's ok now with that change?

Regards,
Roel

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Excellent!

We will try this fix in the morning.

BR, Ulf.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Hi!
I have now tested the fix.

The fix seems to make the situation a lot better for the provided example, so this seems to be on the right track.

However, on our real application the problem seems to remain. This is probably related to the fact that we do not use that many layouts, stackedwidgets or dialogs.
In our project we mainly use WContainerWidgets containing other WWidgets and WPaintedWidgets, that usually have a absolute positioning-scheme.

We'll have to revise all of our uses of jQuery.data before the next release.

I am guessing there are probably other simmilar problems?

BR, Ulf.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

I've now reviewed the rest of the JavaScript code, eliminating uses of jQuery.data (see my latest commit).

Regards,
Roel

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Thank you.

I will try this as soon as possible.

BR, Ulf

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Hi!

We have now tried the latest patch and it seems to work well.
In the comming days we will perform some loong-time-tests to see how it holds up over time.

BR, Ulf

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Hi!

When working with the latest trunc-version of Wt3 we are now seeing a crash in WTableView (I do not know if this is related to recent changes or not).
Crash has the following callstack:

ucrtbased.dll!00007ffb523d037b()
ucrtbased.dll!00007ffb523d02d2()    
myapp.exe!std::vector<class Wt::WWidget *,class std::allocator<class Wt::WWidget *> >::operator[](unsigned __int64)
myapp.exe!Wt::WContainerWidget::widget(int)
myapp.exe!Wt::WTableView::updateModelIndex(class Wt::WModelIndex const &,int,int)
myapp.exe!Wt::WTableView::updateModelIndexes(void)
myapp.exe!Wt::WTableView::render(class Wt::WFlags<enum Wt::RenderFlag>)
myapp.exe!Wt::WCompositeWidget::getSDomChanges(class std::vector<class Wt::DomElement *,class std::allocator<class Wt::DomElement *> > &,class Wt::WApplication *)
myapp.exe!Wt::WebRenderer::collectChanges(class std::vector<class Wt::DomElement *,class std::allocator<class Wt::DomElement *> > &)
myapp.exe!Wt::WebRenderer::collectJS(class Wt::WStringStream *)
myapp.exe!Wt::WebRenderer::collectJavaScriptUpdate(class Wt::WStringStream &)
myapp.exe!Wt::WebRenderer::collectJavaScript(void)
myapp.exe!Wt::WebRenderer::serveJavaScriptUpdate(class Wt::WebResponse &)
myapp.exe!Wt::WebRenderer::serveResponse(class Wt::WebResponse &)
myapp.exe!Wt::WebSession::serveResponse(class Wt::WebSession::Handler &)
myapp.exe!Wt::WebSession::render(class Wt::WebSession::Handler &)
myapp.exe!Wt::WebSession::notify(class Wt::WEvent const &)
myapp.exe!Wt::WApplication::notify(class Wt::WEvent const &)
myapp.exe!Wt::WebSession::handleRequest(class Wt::WebSession::Handler &)
myapp.exe!Wt::WebController::handleRequest(class Wt::WebRequest *)

Output:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector(1218) : Assertion failed: vector subscript out of range
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\vector(1219) : Assertion failed: "Standard C++ Libraries Out of Range" && 0
Unhandled exception at 0x00007FFB523D037B (ucrtbased.dll) in myapp.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

I have put together the smallest possible example I could make that reproduces this issue, simply scroll the vertical scrollbar to the bottom and the application should crash.

class MyApplication : public Wt::WApplication
{
public:
    MyApplication (const Wt::WEnvironment &enviorment) : Wt::WApplication(enviorment) {}

    class Model : public Wt::WAbstractListModel
    {
    public:
        Model(Wt::WObject *p = 0) : Wt::WAbstractListModel(p)
        {
            // start timer to peridicaly change the data in the model
            Wt::WTimer *timer = new Wt::WTimer;
            timer->setInterval(500);
            timer->timeout().connect(this, &Model::updateData);
            timer->start();
        }

        int rowCount(const Wt::WModelIndex &parent = Wt::WModelIndex()) const override { return m_data.size(); }

        boost::any data(const Wt::WModelIndex &index, int role = Wt::DisplayRole) const override
        {
            if(role == Wt::DisplayRole)
                return boost::any(m_data[index.row()]);
            return boost::any();
        }

        void changeData(const std::vector<Wt::WString> &data)
        {
            std::vector<Wt::WString> temp = m_data;
            const int rows = rowCount();
            if(rows != 0)
            {
                Wt::WModelIndex parent;
                beginRemoveRows(parent, 0, rows-1);
                m_data = std::vector<Wt::WString>();
                endRemoveRows();
            }

            if(data.size() == 0)
                return;

            const Wt::WModelIndex parent;
            const int rowCount = data.size();
            beginInsertRows(parent, 0, rowCount-1);
            m_data = data;
            endInsertRows();            
        }

        void updateData()
        {
            static std::vector<Wt::WString> stdData1(100,"");
            static std::vector<Wt::WString> stdData2(99,"");

            // for the crash to show itself it is important that the number of rows change
            changeData(rowCount() == 100 ? stdData2 : stdData1);
        }

        std::vector<Wt::WString> m_data;
    };

    /***************************************************************/
    void initialize()
    {
        WApplication::initialize();

        Wt::WTableView *tv = new Wt::WTableView(root());
        tv->resize(500, 100);
        tv->setColumnWidth(0, 500);
        tv->setRowHeight(20);

        Model *model = new Model;
        Wt::WSortFilterProxyModel *sortModel = new Wt::WSortFilterProxyModel;
        sortModel->setSourceModel(model);
        sortModel->setDynamicSortFilter(true);
        tv->setModel(sortModel);
        tv->show();

        // sorting seems to be relevant for the crash
        tv->setSortingEnabled(true);
        tv->sortByColumn(0, Wt::AscendingOrder);

        return;
    }
};

BR, Ulf.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

What version are you comparing to? That code crashes in several versions I've tested. I'm not entirely sure if that's related to how the model is implemented...

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

I do not know if this is related to recent changes or not

I have tried it with the current head of the Wt3 branch. I do not know if this is a new or old issue ( I’m guessing old).

Is the provided model not correctly implemented?

I find that if I emit dataChanged() on every item that is added to the model, then it works, but that should not be nessesary since all items are removed and then added again.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

Yeah, I can get it to work by just emitting the modelReset() signal at the end of changeData(). I honestly don't know whether or not the model is correctly implemented, it's not something I do everyday. I'll have to check.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

I checked with Koen. He says that the model is indeed correctly implemented, apart from the fact that rowCount() should actually return 0 if the parent WModelIndex is valid (to signal that it's not a tree).

That's not causing your problem, though. There's some bug in WTableView that needs fixing.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 7 months ago

I just pushed a fix on the wt3 branch. I will later merge it with master, too.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

Excellent!
We will try this ASAP.

BR, Ulf.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 7 months ago

The posted example still crasches with the latest trunk version, although be it with a different (but simmilar) callstack.
The problem remains the same access ouside the range of a vector.
Crasch is present both in debug- and release-version
Callstack:

     app.exe!std::vector<class Wt::WWidget *,class std::allocator<class Wt::WWidget *> >::operator[](unsigned __int64)    Unknown
     app.exe!Wt::WContainerWidget::widget(int)    Unknown
     app.exe!Wt::WTableView::modelRowsAboutToBeRemoved(class Wt::WModelIndex const &,int,int)    Unknown
     app.exe!boost::_mfi::mf3<void,class Wt::WTableView,class Wt::WModelIndex const &,int,int>::operator()(class Wt::WTableView *,class Wt::WModelIndex const &,int,int)    Unknown
     app.exe!boost::_bi::list4<class boost::_bi::value<class Wt::WTableView *>,struct boost::arg<1>,struct boost::arg<2>,struct boost::arg<3> >::operator()<class boost::_mfi::mf3<void,class Wt::WTableView,class Wt::WModelIndex const &,int,int>,class boost::_bi::rrlist6<class Wt::WModelIndex,int,int,struct Wt::NoClass,struct Wt::NoClass,struct Wt::NoClass> >(class boost::_bi::type<void>,class boost::_mfi::mf3<void,class Wt::WTableView,class Wt::WModelIndex const &,int,int> &,class boost::_bi::rrlist6<class Wt::WModelIndex,int,int,struct Wt::NoClass,struct Wt::NoClass,struct Wt::NoClass> &,int)    Unknown
     app.exe!boost::_bi::bind_t<void,class boost::_mfi::mf3<void,class Wt::WTableView,class Wt::WModelIndex const &,int,int>,class boost::_bi::list4<class boost::_bi::value<class Wt::WTableView *>,struct boost::arg<1>,struct boost::arg<2>,struct boost::arg<3> > >::operator()<class Wt::WModelIndex,int,int,struct Wt::NoClass,struct Wt::NoClass,struct Wt::NoClass>(class Wt::WModelIndex &&,int &&,int &&,struct Wt::NoClass &&,struct Wt::NoClass &&,struct Wt::NoClass &&)    Unknown
     app.exe!boost::detail::function::void_function_obj_invoker6<class boost::_bi::bind_t<void,class boost::_mfi::mf3<void,class Wt::WTableView,class Wt::WModelIndex const &,int,int>,class boost::_bi::list4<class boost::_bi::value<class Wt::WTableView *>,struct boost::arg<1>,struct boost::arg<2>,struct boost::arg<3> > >,void,class Wt::WModelIndex,int,int,struct Wt::NoClass,struct Wt::NoClass,struct Wt::NoClass>::invoke(union boost::detail::function::function_buffer &,class Wt::WModelIndex,int,int,struct Wt::NoClass,struct Wt::NoClass,struct Wt::NoClass)    Unknown
>    app.exe!boost::function6<void,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::operator()(Wt::WModelIndex a0, int a1, int a2, Wt::NoClass a3, Wt::NoClass a4, Wt::NoClass a5) Line 765    C++
     app.exe!boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,0,1,2,3,4,5,Wt::WModelIndex & __ptr64,int & __ptr64,int & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64>(boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> & func, boost::signals2::detail::unsigned_meta_array<0,1,2,3,4,5> __formal, const std::tuple<Wt::WModelIndex &,int &,int &,Wt::NoClass &,Wt::NoClass &,Wt::NoClass &> & args, void * __formal) Line 106    C++
     app.exe!boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,Wt::WModelIndex & __ptr64,int & __ptr64,int & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,6>(boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> & func, const std::tuple<Wt::WModelIndex &,int &,int &,Wt::NoClass &,Wt::NoClass &,Wt::NoClass &> & args, boost::mpl::size_t<6> __formal) Line 90    C++
     app.exe!boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(const boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > & connectionBody) Line 133    C++
     app.exe!boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> >::dereference() Line 110    C++
     app.exe!boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(const boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > & f) Line 551    C++
     app.exe!boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> >,boost::signals2::detail::void_type,boost::iterators::single_pass_traversal_tag,boost::signals2::detail::void_type const & __ptr64,__int64,0,0>::operator*() Line 657    C++
     app.exe!boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > first, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > last) Line 57    C++
     app.exe!boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>,boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(boost::signals2::optional_last_value<void> & combiner, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > first, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > last) Line 64    C++
     app.exe!boost::signals2::detail::signal_impl<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::function<void __cdecl(boost::signals2::connection const & __ptr64,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::signals2::mutex>::operator()(Wt::WModelIndex <args_0>, int <args_1>, int <args_2>, Wt::NoClass <args_3>, Wt::NoClass <args_4>, Wt::NoClass <args_5>) Line 242    C++
     app.exe!boost::signals2::signal<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::function<void __cdecl(boost::signals2::connection const & __ptr64,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::signals2::mutex>::operator()(Wt::WModelIndex <args_0>, int <args_1>, int <args_2>, Wt::NoClass <args_3>, Wt::NoClass <args_4>, Wt::NoClass <args_5>) Line 723    C++
     app.exe!Wt::Signal<Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::emit(Wt::WModelIndex a1, int a2, int a3, Wt::NoClass a4, Wt::NoClass a5, Wt::NoClass a6) Line 1005    C++
     [External Code]    
     app.exe!boost::function6<void,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::operator()(Wt::WModelIndex a0, int a1, int a2, Wt::NoClass a3, Wt::NoClass a4, Wt::NoClass a5) Line 765    C++
     app.exe!boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,0,1,2,3,4,5,Wt::WModelIndex & __ptr64,int & __ptr64,int & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64>(boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> & func, boost::signals2::detail::unsigned_meta_array<0,1,2,3,4,5> __formal, const std::tuple<Wt::WModelIndex &,int &,int &,Wt::NoClass &,Wt::NoClass &,Wt::NoClass &> & args, void * __formal) Line 106    C++
     app.exe!boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,Wt::WModelIndex & __ptr64,int & __ptr64,int & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,Wt::NoClass & __ptr64,6>(boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> & func, const std::tuple<Wt::WModelIndex &,int &,int &,Wt::NoClass &,Wt::NoClass &,Wt::NoClass &> & args, boost::mpl::size_t<6> __formal) Line 90    C++
     app.exe!boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(const boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > & connectionBody) Line 133    C++
     app.exe!boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> >::dereference() Line 110    C++
     app.exe!boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(const boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > & f) Line 551    C++
     app.exe!boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> >,boost::signals2::detail::void_type,boost::iterators::single_pass_traversal_tag,boost::signals2::detail::void_type const & __ptr64,__int64,0,0>::operator*() Line 657    C++
     app.exe!boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > first, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > last) Line 57    C++
     app.exe!boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>,boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > >(boost::signals2::optional_last_value<void> & combiner, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > first, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>,std::_List_iterator<std::_List_val<std::_List_simple_types<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > > > >,boost::signals2::detail::connection_body<std::pair<enum boost::signals2::detail::slot_meta_group,boost::optional<int> >,boost::signals2::slot<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)> >,boost::signals2::mutex> > last) Line 64    C++
     app.exe!boost::signals2::detail::signal_impl<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::function<void __cdecl(boost::signals2::connection const & __ptr64,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::signals2::mutex>::operator()(Wt::WModelIndex <args_0>, int <args_1>, int <args_2>, Wt::NoClass <args_3>, Wt::NoClass <args_4>, Wt::NoClass <args_5>) Line 242    C++
     app.exe!boost::signals2::signal<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass),boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::function<void __cdecl(boost::signals2::connection const & __ptr64,Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass)>,boost::signals2::mutex>::operator()(Wt::WModelIndex <args_0>, int <args_1>, int <args_2>, Wt::NoClass <args_3>, Wt::NoClass <args_4>, Wt::NoClass <args_5>) Line 723    C++
     app.exe!Wt::Signal<Wt::WModelIndex,int,int,Wt::NoClass,Wt::NoClass,Wt::NoClass>::emit(Wt::WModelIndex a1, int a2, int a3, Wt::NoClass a4, Wt::NoClass a5, Wt::NoClass a6) Line 1005    C++
     [External Code]    
     app.exe!MyApplication::Model::changeData(const std::vector<Wt::WString,std::allocator<Wt::WString> > & data) Line 240    C++

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 6 months ago

Hi again!
We really need a fix for this issue, any progress?

We tried building a new version with the fixes that were committed on friday (2019-04-05), but these fixes did not make a difference.

BR, Ulf

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 6 months ago

You're getting the crash with the example you posted?

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Ulf Johnsson 6 months ago

Yes I am, same issue, vector out of bounds.

RE: WContainerWidget and/or WLayout memory-starves browsers to death - Added by Roel Standaert 6 months ago

There did appear to be something wrong there. Strange that it wasn't causing any crashes or errors when testing on Linux. I pushed a fix.

(1-19/19)