desktop/inc/lib/init.hxx | 20 +++++--------- desktop/source/lib/init.cxx | 62 +++++++++++++++++++------------------------- 2 files changed, 36 insertions(+), 46 deletions(-)
New commits: commit d7505494725414f4720b282d9b0b91b03d71e60d Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Tue May 7 15:09:30 2024 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Tue May 7 20:58:27 2024 +0200 Restore "flush CallbackFlushHandler queue via PostUserEvent..." This reverts commit 041516806bdaa351ec22846754cf030905be53da. which turns out not to be the problem, where the real problem was a genuine failure of coolwsd to start, see: https: //github.com/CollaboraOnline/online/pull/8983 Change-Id: Id344c6f007f290da430cbba8131d427300df1643 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167286 Reviewed-by: Michael Meeks <michael.me...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx index 323a508098f5..536faf00aff9 100644 --- a/desktop/inc/lib/init.hxx +++ b/desktop/inc/lib/init.hxx @@ -93,12 +93,11 @@ namespace desktop { }; /// One instance of this per view, handles flushing callbacks - class DESKTOP_DLLPUBLIC CallbackFlushHandler final : public Idle, public SfxLokCallbackInterface + class DESKTOP_DLLPUBLIC CallbackFlushHandler final : public SfxLokCallbackInterface { public: explicit CallbackFlushHandler(LibreOfficeKitDocument* pDocument, LibreOfficeKitCallback pCallback, void* pData); virtual ~CallbackFlushHandler() override; - virtual void Invoke() override; // TODO This should be dropped and the binary libreOfficeKitViewCallback() variants should be called? void queue(const int type, const OString& data); @@ -189,7 +188,8 @@ namespace desktop { typedef std::vector<int> queue_type1; typedef std::vector<CallbackData> queue_type2; - void startTimer(); + void scheduleFlush(); + void invoke(); bool removeAll(int type); bool removeAll(int type, const std::function<bool (const CallbackData&)>& rTestFunc); bool processInvalidateTilesEvent(int type, CallbackData& aCallbackData); @@ -200,6 +200,8 @@ namespace desktop { void enqueueUpdatedTypes(); void enqueueUpdatedType( int type, const SfxViewShell* sourceViewShell, int viewId ); + void stop(); + /** we frequently want to scan the queue, and mostly when we do so, we only care about the element type so we split the queue in 2 to make the scanning cache friendly. */ queue_type1 m_queue1; @@ -230,18 +232,12 @@ namespace desktop { LibreOfficeKitDocument* m_pDocument; int m_viewId = -1; // view id of the associated SfxViewShell LibreOfficeKitCallback m_pCallback; + ImplSVEvent* m_pFlushEvent; void *m_pData; int m_nDisableCallbacks; std::recursive_mutex m_mutex; - class TimeoutIdle : public Timer - { - public: - TimeoutIdle( CallbackFlushHandler* handler ); - virtual void Invoke() override; - private: - CallbackFlushHandler* mHandler; - }; - TimeoutIdle m_TimeoutIdle; + + DECL_LINK(FlushQueue, void*, void); }; struct DESKTOP_DLLPUBLIC LibLODocument_Impl : public _LibreOfficeKitDocument diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 081166baeb0b..d5476cfe7666 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1524,32 +1524,14 @@ static OUString getGenerator() extern "C" { -CallbackFlushHandler::TimeoutIdle::TimeoutIdle( CallbackFlushHandler* handler ) - : Timer( "lokit timer callback" ) - , mHandler( handler ) -{ - // A second timer with higher priority, it'll ensure we flush in reasonable time if we get too busy - // to get POST_PAINT priority processing. Otherwise it could take a long time to flush. - SetPriority(TaskPriority::DEFAULT); - SetTimeout( 100 ); // 100 ms -} - -void CallbackFlushHandler::TimeoutIdle::Invoke() -{ - mHandler->Invoke(); -} - // One of these is created per view to handle events cf. doc_registerCallback CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, LibreOfficeKitCallback pCallback, void* pData) - : Idle( "lokit idle callback" ), - m_pDocument(pDocument), + : m_pDocument(pDocument), m_pCallback(pCallback), + m_pFlushEvent(nullptr), m_pData(pData), - m_nDisableCallbacks(0), - m_TimeoutIdle( this ) + m_nDisableCallbacks(0) { - SetPriority(TaskPriority::POST_PAINT); - // Add the states that are safe to skip duplicates on, even when // not consequent (i.e. do no emit them if unchanged from last). m_states.emplace(LOK_CALLBACK_TEXT_SELECTION, "NIL"_ostr); @@ -1568,9 +1550,18 @@ CallbackFlushHandler::CallbackFlushHandler(LibreOfficeKitDocument* pDocument, Li m_states.emplace(LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE, "NIL"_ostr); } +void CallbackFlushHandler::stop() +{ + if (m_pFlushEvent) + { + Application::RemoveUserEvent(m_pFlushEvent); + m_pFlushEvent = nullptr; + } +} + CallbackFlushHandler::~CallbackFlushHandler() { - Stop(); + stop(); } CallbackFlushHandler::queue_type2::iterator CallbackFlushHandler::toQueue2(CallbackFlushHandler::queue_type1::iterator pos) @@ -1592,7 +1583,7 @@ void CallbackFlushHandler::setUpdatedType( int nType, bool value ) m_updatedTypes.resize( nType + 1 ); // new are default-constructed, i.e. false m_updatedTypes[ nType ] = value; if(value) - startTimer(); + scheduleFlush(); } void CallbackFlushHandler::resetUpdatedType( int nType ) @@ -1608,7 +1599,7 @@ void CallbackFlushHandler::setUpdatedTypePerViewId( int nType, int nViewId, int types.resize( nType + 1 ); // new are default-constructed, i.e. 'set' is false types[ nType ] = PerViewIdData{ value, nSourceViewId }; if(value) - startTimer(); + scheduleFlush(); } void CallbackFlushHandler::resetUpdatedTypePerViewId( int nType, int nViewId ) @@ -1685,7 +1676,7 @@ void CallbackFlushHandler::dumpState(rtl::OStringBuffer &rState) void CallbackFlushHandler::libreOfficeKitViewAddPendingInvalidateTiles() { // Invoke() will call flushPendingLOKInvalidateTiles(), so just make sure the timer is active. - startTimer(); + scheduleFlush(); } void CallbackFlushHandler::queue(const int type, const OString& data) @@ -1998,7 +1989,7 @@ void CallbackFlushHandler::queue(const int type, CallbackData& aCallbackData) #endif lock.unlock(); - startTimer(); + scheduleFlush(); } bool CallbackFlushHandler::processInvalidateTilesEvent(int type, CallbackData& aCallbackData) @@ -2376,7 +2367,7 @@ void CallbackFlushHandler::enqueueUpdatedType( int type, const SfxViewShell* vie << "] to have " << m_queue1.size() << " entries."); } -void CallbackFlushHandler::Invoke() +void CallbackFlushHandler::invoke() { comphelper::ProfileZone aZone("CallbackFlushHandler::Invoke"); @@ -2484,16 +2475,19 @@ void CallbackFlushHandler::Invoke() m_queue1.clear(); m_queue2.clear(); - Stop(); - m_TimeoutIdle.Stop(); + stop(); } -void CallbackFlushHandler::startTimer() +void CallbackFlushHandler::scheduleFlush() { - if (!IsActive()) - Start(); - if (!m_TimeoutIdle.IsActive()) - m_TimeoutIdle.Start(); + if (!m_pFlushEvent) + m_pFlushEvent = Application::PostUserEvent(LINK(this, CallbackFlushHandler, FlushQueue)); +} + +IMPL_LINK_NOARG(CallbackFlushHandler, FlushQueue, void*, void) +{ + m_pFlushEvent = nullptr; + invoke(); } bool CallbackFlushHandler::removeAll(int type)