Kaydet (Commit) 17a477c3 authored tarafından Ashod Nakashian's avatar Ashod Nakashian Kaydeden (comit) Ashod Nakashian

LOK: Cache RectangleAndPart payloads

Change-Id: I3a2d98426729ad1b4e43a8f657b512679be82c26
Reviewed-on: https://gerrit.libreoffice.org/67891
Tested-by: Jenkins
Reviewed-by: 's avatarAshod Nakashian <ashnakash@gmail.com>
üst 1666b302
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include <boost/variant.hpp>
#include <osl/thread.h> #include <osl/thread.h>
#include <rtl/ref.hxx> #include <rtl/ref.hxx>
#include <vcl/idle.hxx> #include <vcl/idle.hxx>
...@@ -98,8 +100,14 @@ namespace desktop { ...@@ -98,8 +100,14 @@ namespace desktop {
{ {
} }
/// Parse and set the RectangleAndPart object and return it. Clobbers PayloadString.
RectangleAndPart& setRectangleAndPart(const std::string& payload);
/// Return the parsed RectangleAndPart instance.
const RectangleAndPart& getRectangleAndPart() const;
int Type; int Type;
std::string PayloadString; std::string PayloadString;
boost::variant<boost::blank, RectangleAndPart> PayloadObject;
}; };
typedef std::vector<CallbackData> queue_type; typedef std::vector<CallbackData> queue_type;
......
...@@ -452,6 +452,20 @@ RectangleAndPart RectangleAndPart::Create(const std::string& rPayload) ...@@ -452,6 +452,20 @@ RectangleAndPart RectangleAndPart::Create(const std::string& rPayload)
aRet.m_nPart = nPart; aRet.m_nPart = nPart;
return aRet; return aRet;
} }
RectangleAndPart& CallbackFlushHandler::CallbackData::setRectangleAndPart(const std::string& payload)
{
PayloadString = payload;
PayloadObject = RectangleAndPart::Create(payload);
return boost::get<RectangleAndPart>(PayloadObject);
}
const RectangleAndPart& CallbackFlushHandler::CallbackData::getRectangleAndPart() const
{
return boost::get<RectangleAndPart>(PayloadObject);
}
} }
namespace { namespace {
...@@ -840,9 +854,11 @@ void CallbackFlushHandler::callback(const int type, const char* payload, void* d ...@@ -840,9 +854,11 @@ void CallbackFlushHandler::callback(const int type, const char* payload, void* d
void CallbackFlushHandler::queue(const int type, const char* data) void CallbackFlushHandler::queue(const int type, const char* data)
{ {
std::string payload(data ? data : "(nil)"); CallbackData aCallbackData(type, (data ? data : "(nil)"));
std::string& payload = aCallbackData.PayloadString;
SAL_INFO("lok", "Queue: " << type << " : " << payload); SAL_INFO("lok", "Queue: " << type << " : " << payload);
if (m_bPartTilePainting) if (m_bPartTilePainting)
{ {
// We drop notifications when this is set, except for important ones. // We drop notifications when this is set, except for important ones.
...@@ -999,7 +1015,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) ...@@ -999,7 +1015,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
case LOK_CALLBACK_INVALIDATE_TILES: case LOK_CALLBACK_INVALIDATE_TILES:
{ {
RectangleAndPart rcNew = RectangleAndPart::Create(payload); RectangleAndPart& rcNew = aCallbackData.setRectangleAndPart(payload);
if (rcNew.isEmpty()) if (rcNew.isEmpty())
{ {
SAL_INFO("lok", "Skipping invalid event [" << type << "]: [" << payload << "]."); SAL_INFO("lok", "Skipping invalid event [" << type << "]: [" << payload << "].");
...@@ -1012,7 +1028,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) ...@@ -1012,7 +1028,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
[] (const queue_type::value_type& elem) { return (elem.Type == LOK_CALLBACK_INVALIDATE_TILES); }); [] (const queue_type::value_type& elem) { return (elem.Type == LOK_CALLBACK_INVALIDATE_TILES); });
if (pos != m_queue.rend()) if (pos != m_queue.rend())
{ {
const RectangleAndPart rcOld = RectangleAndPart::Create(pos->PayloadString); const RectangleAndPart& rcOld = pos->getRectangleAndPart();
if (rcOld.isInfinite() && (rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart)) if (rcOld.isInfinite() && (rcOld.m_nPart == -1 || rcOld.m_nPart == rcNew.m_nPart))
{ {
SAL_INFO("lok", "Skipping queue [" << type << "]: [" << payload << "] since all tiles need to be invalidated."); SAL_INFO("lok", "Skipping queue [" << type << "]: [" << payload << "] since all tiles need to be invalidated.");
...@@ -1056,7 +1072,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) ...@@ -1056,7 +1072,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
[&rcNew] (const queue_type::value_type& elem) { [&rcNew] (const queue_type::value_type& elem) {
if (elem.Type == LOK_CALLBACK_INVALIDATE_TILES) if (elem.Type == LOK_CALLBACK_INVALIDATE_TILES)
{ {
const RectangleAndPart rcOld = RectangleAndPart::Create(elem.PayloadString); const RectangleAndPart& rcOld = elem.getRectangleAndPart();
if (rcNew.m_nPart != -1 && rcOld.m_nPart != -1 && rcOld.m_nPart != rcNew.m_nPart) if (rcNew.m_nPart != -1 && rcOld.m_nPart != -1 && rcOld.m_nPart != rcNew.m_nPart)
{ {
SAL_INFO("lok", "Nothing to merge between new: " << rcNew.toString() << ", and old: " << rcOld.toString()); SAL_INFO("lok", "Nothing to merge between new: " << rcNew.toString() << ", and old: " << rcOld.toString());
...@@ -1267,7 +1283,7 @@ void CallbackFlushHandler::queue(const int type, const char* data) ...@@ -1267,7 +1283,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
} }
} }
m_queue.emplace_back(type, payload); m_queue.emplace_back(aCallbackData);
SAL_INFO("lok", "Queued #" << (m_queue.size() - 1) << SAL_INFO("lok", "Queued #" << (m_queue.size() - 1) <<
" [" << type << "]: [" << payload << "] to have " << m_queue.size() << " entries."); " [" << type << "]: [" << payload << "] to have " << m_queue.size() << " entries.");
......
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