[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test loolwsd/TileCache.cpp loolwsd/TileCache.hpp

2016-09-25 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp  |   20 +---
 loolwsd/TileCache.cpp   |   15 ++-
 loolwsd/TileCache.hpp   |2 +-
 loolwsd/test/TileCacheTests.cpp |2 +-
 4 files changed, 17 insertions(+), 22 deletions(-)

New commits:
commit f6a9de1b2d9646ace933cad17b5a9661da06997e
Author: Ashod Nakashian 
Date:   Sun Sep 25 11:33:37 2016 -0400

Revert "loolwsd: TileCache is told to save or not before...

This reverts commit 01718c5c68bad8d324dfcc1b93d3c49055c90873.

Change-Id: I6fa49f8d1f5c6ba7bdcd8cfa0866e0e15380607d
Reviewed-on: https://gerrit.libreoffice.org/29281
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index c241594..989e056 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -587,15 +587,14 @@ void DocumentBroker::handleTileResponse(const 
std::vector& payload)
 try
 {
 auto tile = TileDesc::parse(firstLine);
-
-
+const auto buffer = payload.data();
 const auto length = payload.size();
+
 if (firstLine.size() < static_cast(length) - 1)
 {
-const auto buffer = payload.data();
-tileCache().notifySubscribers(
+tileCache().saveTileAndNotify(
 tile, buffer + firstLine.size() + 1,
-length - firstLine.size() - 1, true);
+length - firstLine.size() - 1);
 }
 else
 {
@@ -620,22 +619,21 @@ void DocumentBroker::handleTileCombinedResponse(const 
std::vector& payload
 try
 {
 auto tileCombined = TileCombined::parse(firstLine);
-
-
+const auto buffer = payload.data();
 const auto length = payload.size();
+auto offset = firstLine.size() + 1;
+
 if (firstLine.size() < static_cast(length) - 1)
 {
-const auto buffer = payload.data();
-auto offset = firstLine.size() + 1;
 for (const auto& tile : tileCombined.getTiles())
 {
-tileCache().notifySubscribers(tile, buffer + offset, 
tile.getImgSize(), true);
+tileCache().saveTileAndNotify(tile, buffer + offset, 
tile.getImgSize());
 offset += tile.getImgSize();
 }
 }
 else
 {
-Log::debug() << "Render request declined for " << firstLine << 
Log::end;
+Log::error() << "Render request failed for " << firstLine << 
Log::end;
 std::unique_lock 
tileBeingRenderedLock(tileCache().getTilesBeingRenderedLock());
 for (const auto& tile : tileCombined.getTiles())
 {
diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index 6924e30..ce74945 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -142,7 +142,7 @@ std::unique_ptr TileCache::lookupTile(const 
TileDesc& tile)
 return nullptr;
 }
 
-void TileCache::notifySubscribers(const TileDesc& tile, const char *data, 
const size_t size, const bool save)
+void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, 
const size_t size)
 {
 std::unique_lock lock(_tilesBeingRenderedMutex);
 
@@ -151,14 +151,11 @@ void TileCache::notifySubscribers(const TileDesc& tile, 
const char *data, const
 // Save to disk.
 const auto cachedName = (tileBeingRendered ? 
tileBeingRendered->getCacheName()
: cacheFileName(tile));
-if (save)
-{
-const auto fileName = _cacheDir + "/" + cachedName;
-Log::trace() << "Saving cache tile: " << fileName << Log::end;
-std::fstream outStream(fileName, std::ios::out);
-outStream.write(data, size);
-outStream.close();
-}
+const auto fileName = _cacheDir + "/" + cachedName;
+Log::trace() << "Saving cache tile: " << fileName << Log::end;
+std::fstream outStream(fileName, std::ios::out);
+outStream.write(data, size);
+outStream.close();
 
 // Notify subscribers, if any.
 if (tileBeingRendered)
diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp
index 206603b..fc0210b 100644
--- a/loolwsd/TileCache.hpp
+++ b/loolwsd/TileCache.hpp
@@ -47,7 +47,7 @@ public:
 
 std::unique_ptr lookupTile(const TileDesc& tile);
 
-void notifySubscribers(const TileDesc& tile, const char *data, const 
size_t size, const bool save);
+void saveTileAndNotify(const TileDesc& tile, const char *data, const 
size_t size);
 
 std::string getTextFile(const std::string& fileName);
 
diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp
index 9081675..f2d7f3d 100644
--- a/loolwsd/test/TileCacheTests.cpp
+++ b/loolwsd/test/TileCacheTests.cpp
@@ -167,7 +167,7 @@ void TileCacheTests::testSimple()
 // Cache Tile
 const auto size = 1024;
 const auto data = genRandomData(size);
-

[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test loolwsd/TileCache.cpp loolwsd/TileCache.hpp

2016-09-22 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp  |   20 +++-
 loolwsd/TileCache.cpp   |   15 +--
 loolwsd/TileCache.hpp   |2 +-
 loolwsd/test/TileCacheTests.cpp |2 +-
 4 files changed, 22 insertions(+), 17 deletions(-)

New commits:
commit 01718c5c68bad8d324dfcc1b93d3c49055c90873
Author: Ashod Nakashian 
Date:   Thu Sep 22 17:47:12 2016 -0400

loolwsd: TileCache is told to save or not before notifying subscribers

Change-Id: Ibe24bbe9b4bf6fbaae7c9fcea5f919f7091d299e
Reviewed-on: https://gerrit.libreoffice.org/29207
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 989e056..c241594 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -587,14 +587,15 @@ void DocumentBroker::handleTileResponse(const 
std::vector& payload)
 try
 {
 auto tile = TileDesc::parse(firstLine);
-const auto buffer = payload.data();
-const auto length = payload.size();
 
+
+const auto length = payload.size();
 if (firstLine.size() < static_cast(length) - 1)
 {
-tileCache().saveTileAndNotify(
+const auto buffer = payload.data();
+tileCache().notifySubscribers(
 tile, buffer + firstLine.size() + 1,
-length - firstLine.size() - 1);
+length - firstLine.size() - 1, true);
 }
 else
 {
@@ -619,21 +620,22 @@ void DocumentBroker::handleTileCombinedResponse(const 
std::vector& payload
 try
 {
 auto tileCombined = TileCombined::parse(firstLine);
-const auto buffer = payload.data();
-const auto length = payload.size();
-auto offset = firstLine.size() + 1;
 
+
+const auto length = payload.size();
 if (firstLine.size() < static_cast(length) - 1)
 {
+const auto buffer = payload.data();
+auto offset = firstLine.size() + 1;
 for (const auto& tile : tileCombined.getTiles())
 {
-tileCache().saveTileAndNotify(tile, buffer + offset, 
tile.getImgSize());
+tileCache().notifySubscribers(tile, buffer + offset, 
tile.getImgSize(), true);
 offset += tile.getImgSize();
 }
 }
 else
 {
-Log::error() << "Render request failed for " << firstLine << 
Log::end;
+Log::debug() << "Render request declined for " << firstLine << 
Log::end;
 std::unique_lock 
tileBeingRenderedLock(tileCache().getTilesBeingRenderedLock());
 for (const auto& tile : tileCombined.getTiles())
 {
diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index d13400e..acaf18b 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -143,7 +143,7 @@ std::unique_ptr TileCache::lookupTile(const 
TileDesc& tile)
 return nullptr;
 }
 
-void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, 
const size_t size)
+void TileCache::notifySubscribers(const TileDesc& tile, const char *data, 
const size_t size, const bool save)
 {
 std::unique_lock lock(_tilesBeingRenderedMutex);
 
@@ -152,11 +152,14 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, 
const char *data, const
 // Save to disk.
 const auto cachedName = (tileBeingRendered ? 
tileBeingRendered->getCacheName()
: cacheFileName(tile));
-const auto fileName = _cacheDir + "/" + cachedName;
-Log::trace() << "Saving cache tile: " << fileName << Log::end;
-std::fstream outStream(fileName, std::ios::out);
-outStream.write(data, size);
-outStream.close();
+if (save)
+{
+const auto fileName = _cacheDir + "/" + cachedName;
+Log::trace() << "Saving cache tile: " << fileName << Log::end;
+std::fstream outStream(fileName, std::ios::out);
+outStream.write(data, size);
+outStream.close();
+}
 
 // Notify subscribers, if any.
 if (tileBeingRendered)
diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp
index fc0210b..206603b 100644
--- a/loolwsd/TileCache.hpp
+++ b/loolwsd/TileCache.hpp
@@ -47,7 +47,7 @@ public:
 
 std::unique_ptr lookupTile(const TileDesc& tile);
 
-void saveTileAndNotify(const TileDesc& tile, const char *data, const 
size_t size);
+void notifySubscribers(const TileDesc& tile, const char *data, const 
size_t size, const bool save);
 
 std::string getTextFile(const std::string& fileName);
 
diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp
index f2d7f3d..9081675 100644
--- a/loolwsd/test/TileCacheTests.cpp
+++ b/loolwsd/test/TileCacheTests.cpp
@@ -167,7 +167,7 @@ void TileCacheTests::testSimple()
 // Cache Tile
 const auto size = 1024;
 const auto data = 

[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test loolwsd/TileCache.cpp loolwsd/TileCache.hpp

2016-09-19 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp  |8 ++--
 loolwsd/TileCache.cpp   |   14 +-
 loolwsd/TileCache.hpp   |2 +-
 loolwsd/test/TileCacheTests.cpp |2 +-
 4 files changed, 9 insertions(+), 17 deletions(-)

New commits:
commit ec4b4898859f2849ba7888b04dc688f804cb6975
Author: Ashod Nakashian 
Date:   Mon Sep 19 20:21:18 2016 -0400

loolwsd: remove unused priority flag from saveTileAndNotify

Change-Id: I49309bb80a6b9e9e8265da8f8db966b98e362f0a
Reviewed-on: https://gerrit.libreoffice.org/29068
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 78cc9e7..5ef3f60 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -609,13 +609,9 @@ void DocumentBroker::handleTileResponse(const 
std::vector& payload)
 
 if (firstLine.size() < static_cast(length) - 1)
 {
-// If the tile right under the cursor, give it priority.
-const bool priority = tile.intersectsWithRect(
-_cursorPosX, _cursorPosY,
-_cursorWidth, _cursorHeight);
 tileCache().saveTileAndNotify(
 tile, buffer + firstLine.size() + 1,
-length - firstLine.size() - 1, priority);
+length - firstLine.size() - 1);
 }
 else
 {
@@ -648,7 +644,7 @@ void DocumentBroker::handleTileCombinedResponse(const 
std::vector& payload
 {
 for (const auto& tile : tileCombined.getTiles())
 {
-tileCache().saveTileAndNotify(tile, buffer + offset, 
tile.getImgSize(), false);
+tileCache().saveTileAndNotify(tile, buffer + offset, 
tile.getImgSize());
 offset += tile.getImgSize();
 }
 }
diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index 9e3bca7..c7dfd6e 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -140,19 +140,11 @@ std::unique_ptr TileCache::lookupTile(const 
TileDesc& tile)
 return nullptr;
 }
 
-void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, 
const size_t size, const bool /* priority */)
+void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, 
const size_t size)
 {
 std::unique_lock lock(_tilesBeingRenderedMutex);
 
 std::shared_ptr tileBeingRendered = 
findTileBeingRendered(tile);
-#if 0
-if (!priority && tileBeingRendered && tileBeingRendered->getVersion() != 
tile.getVersion())
-{
-Log::trace() << "Skipping unexpected tile ver: " << tile.getVersion()
- << ", waiting for ver " << 
tileBeingRendered->getVersion() << Log::end;
-return;
-}
-#endif
 
 // Save to disk.
 const auto cachedName = (tileBeingRendered ? 
tileBeingRendered->getCacheName()
@@ -197,6 +189,10 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, 
const char *data, const
 }
 }
 }
+else
+{
+Log::debug("No subscribers for: " + cachedName);
+}
 
 // Remove subscriptions.
 if (tileBeingRendered->getVersion() == tile.getVersion())
diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp
index bbe5aa0..08b14e0 100644
--- a/loolwsd/TileCache.hpp
+++ b/loolwsd/TileCache.hpp
@@ -44,7 +44,7 @@ public:
 
 std::unique_ptr lookupTile(const TileDesc& tile);
 
-void saveTileAndNotify(const TileDesc& tile, const char *data, const 
size_t size, const bool priority);
+void saveTileAndNotify(const TileDesc& tile, const char *data, const 
size_t size);
 
 std::string getTextFile(const std::string& fileName);
 
diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp
index a4d3527..b9f8900 100644
--- a/loolwsd/test/TileCacheTests.cpp
+++ b/loolwsd/test/TileCacheTests.cpp
@@ -159,7 +159,7 @@ void TileCacheTests::testSimple()
 // Cache Tile
 const auto size = 1024;
 const auto data = genRandomData(size);
-tc.saveTileAndNotify(tile, data.data(), size, true);
+tc.saveTileAndNotify(tile, data.data(), size);
 
 // Find Tile
 file = tc.lookupTile(tile);
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test

2016-08-31 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp  |4 ++--
 loolwsd/test/TileCacheTests.cpp |   17 -
 loolwsd/test/httpwstest.cpp |1 +
 3 files changed, 19 insertions(+), 3 deletions(-)

New commits:
commit 534ab15d2fa3fa49740d0fb595232b7d90b39220
Author: Ashod Nakashian 
Date:   Wed Aug 31 23:41:09 2016 -0400

loolwsd: more aggressive test for unresponsive clients

Change-Id: I9daf81661cf03be2ea38b5bc4d9688039912bd8a
Reviewed-on: https://gerrit.libreoffice.org/28577
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index afa8460..2ae259f 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -491,7 +491,7 @@ void DocumentBroker::handleTileRequest(TileDesc& tile,
 #if ENABLE_DEBUG
 const std::string response = tile.serialize("tile:") + " 
renderid=cached\n";
 #else
-const std::string response = tile.serialize("tile:") + "\n";
+const std::string response = tile.serialize("tile:") + '\n';
 #endif
 
 std::vector output;
@@ -501,7 +501,7 @@ void DocumentBroker::handleTileRequest(TileDesc& tile,
 
 assert(cachedTile->is_open());
 cachedTile->seekg(0, std::ios_base::end);
-size_t pos = output.size();
+const auto pos = output.size();
 std::streamsize size = cachedTile->tellg();
 output.resize(pos + size);
 cachedTile->seekg(0, std::ios_base::beg);
diff --git a/loolwsd/test/TileCacheTests.cpp b/loolwsd/test/TileCacheTests.cpp
index 5a2749d..f3d9564 100644
--- a/loolwsd/test/TileCacheTests.cpp
+++ b/loolwsd/test/TileCacheTests.cpp
@@ -234,8 +234,23 @@ void TileCacheTests::testUnresponsiveClient()
 // Pathologically request tiles and fail to read (say slow connection).
 // Meanwhile, verify that others can get all tiles fine.
 // TODO: Track memory consumption to verify we don't buffer too much.
-for (auto x = 0; x < 5; ++x)
+
+std::ostringstream oss;
+for (auto i = 0; i < 1000; ++i)
+{
+oss << Util::encodeId(Util::rng::getNext(), 6);
+}
+
+const auto documentContents = oss.str();
+for (auto x = 0; x < 8; ++x)
 {
+// Invalidate to force re-rendering.
+sendTextFrame(socket2, "uno .uno:SelectAll");
+sendTextFrame(socket2, "uno .uno:Delete");
+assertResponseLine(socket2, "invalidatetiles:", "client2 ");
+sendTextFrame(socket2, "paste mimetype=text/html\n" + 
documentContents);
+assertResponseLine(socket2, "invalidatetiles:", "client2 ");
+
 // Ask for tiles and don't read!
 sendTextFrame(socket1, "tilecombine part=0 width=256 height=256 
tileposx=0,3840,7680,11520,0,3840,7680,11520 
tileposy=0,0,0,0,3840,3840,3840,3840 tilewidth=3840 tileheight=3840");
 
diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index 1dae4c3..f28c5d1 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -689,6 +689,7 @@ void HTTPWSTest::testLargePaste()
 {
 oss << Util::encodeId(Util::rng::getNext(), 6);
 }
+
 const auto documentContents = oss.str();
 std::cerr << "Pasting " << documentContents.size() << " characters 
into document." << std::endl;
 sendTextFrame(socket, "paste mimetype=text/html\n" + documentContents);
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits


[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test loolwsd/TileCache.cpp loolwsd/TileCache.hpp

2016-05-22 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp  |6 --
 loolwsd/TileCache.cpp   |   95 +---
 loolwsd/TileCache.hpp   |4 -
 loolwsd/test/TileCacheTests.cpp |2 
 4 files changed, 54 insertions(+), 53 deletions(-)

New commits:
commit 6e54fd05f91547d7abda8336fcda248688be71ff
Author: Ashod Nakashian 
Date:   Sun May 22 15:20:24 2016 -0400

loolwsd: merge saveTile and notifyAndRemoveSubscribers

Change-Id: I8282604c02a9fd1a7a1e2a5df29e2f84fca151a6
Reviewed-on: https://gerrit.libreoffice.org/25344
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index c555298..10600da 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -538,8 +538,7 @@ void DocumentBroker::handleTileResponse(const 
std::vector& payload)
 
 if(firstLine.size() < static_cast(length) - 1)
 {
-tileCache().saveTile(tile, buffer + firstLine.size() + 1, length - 
firstLine.size() - 1);
-tileCache().notifyAndRemoveSubscribers(tile);
+tileCache().saveTileAndNotify(tile, buffer + firstLine.size() + 1, 
length - firstLine.size() - 1);
 }
 else
 {
@@ -572,8 +571,7 @@ void DocumentBroker::handleTileCombinedResponse(const 
std::vector& payload
 {
 for (const auto& tile : tileCombined.getTiles())
 {
-tileCache().saveTile(tile, buffer + offset, tile.getImgSize());
-tileCache().notifyAndRemoveSubscribers(tile);
+tileCache().saveTileAndNotify(tile, buffer + offset, 
tile.getImgSize());
 offset += tile.getImgSize();
 }
 }
diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index 48721d2..c006bc1 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -75,12 +75,14 @@ TileCache::~TileCache()
 struct TileCache::TileBeingRendered
 {
 std::vector _subscribers;
-TileBeingRendered(const int version)
+TileBeingRendered(const std::string& cachedName, const int version)
  : _startTime(std::chrono::steady_clock::now()),
+   _cachedName(cachedName),
_ver(version)
 {
 }
 
+const std::string& getCacheName() const { return _cachedName; }
 int getVersion() const { return _ver; }
 
 std::chrono::steady_clock::time_point getStartTime() const { return 
_startTime; }
@@ -91,6 +93,7 @@ struct TileCache::TileBeingRendered
 
 private:
 std::chrono::steady_clock::time_point _startTime;
+std::string _cachedName;
 int _ver;
 };
 
@@ -132,15 +135,52 @@ std::unique_ptr TileCache::lookupTile(const 
TileDesc& tile)
 return nullptr;
 }
 
-void TileCache::saveTile(const TileDesc& tile, const char *data, size_t size)
+void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, 
size_t size)
 {
-const std::string fileName = _cacheDir + "/" + cacheFileName(tile);
+std::unique_lock lock(_tilesBeingRenderedMutex);
 
-Log::trace() << "Saving cache tile: " << fileName << Log::end;
+std::shared_ptr tileBeingRendered = 
findTileBeingRendered(tile);
+if (tileBeingRendered && tileBeingRendered->getVersion() != 
tile.getVersion())
+{
+Log::trace() << "Skipping unexpected tile ver: " << tile.getVersion()
+ << ", waiting for ver " << 
tileBeingRendered->getVersion() << Log::end;
+return;
+}
 
+// Save to disk.
+const auto cachedName = (tileBeingRendered ? 
tileBeingRendered->getCacheName()
+   : cacheFileName(tile));
+const auto fileName = _cacheDir + "/" + cachedName;
+Log::trace() << "Saving cache tile: " << fileName << Log::end;
 std::fstream outStream(fileName, std::ios::out);
 outStream.write(data, size);
 outStream.close();
+
+// Notify subscribers, if any.
+if (tileBeingRendered)
+{
+if (!tileBeingRendered->_subscribers.empty())
+{
+const std::string message = tile.serialize("tile");
+Log::debug("Sending tile message to subscribers: " + message);
+
+for (const auto& i: tileBeingRendered->_subscribers)
+{
+auto subscriber = i.lock();
+if (subscriber)
+{
+//FIXME: This is inefficient; should just send directly to 
each client (although that is risky as well!
+// Re-emit the tile command in the other thread(s) to 
re-check and hit
+// the cache. Construct the message from scratch to 
contain only the
+// mandatory parts of the message.
+subscriber->sendToInputQueue(message);
+}
+}
+}
+
+// Remove subscriptions.
+_tilesBeingRendered.erase(cachedName);
+}
 

[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test loolwsd/Unit.hpp

2016-05-20 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp   |6 
 loolwsd/Unit.hpp |4 ++
 loolwsd/test/UnitPrefork.cpp |   61 +--
 3 files changed, 46 insertions(+), 25 deletions(-)

New commits:
commit 958f6ffcbdbeae39b78acfb7592096851388fb52
Author: Ashod Nakashian 
Date:   Fri May 20 22:31:53 2016 -0400

loolwsd: fix UnitPrefork deadlock/corruption

Reading from the socket in the test is not
thread-safe, and was causing all sorts of
problems.

The new code adds a test API and reads the
incoming data through it and not directly
from the socket. In addition, the read is
synchronized.

Change-Id: Id13821a40a59e32fd8a14f733a47306aee42ada8
Reviewed-on: https://gerrit.libreoffice.org/25244
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 3bb2bcc..de4d984 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -20,6 +20,7 @@
 #include "LOOLProtocol.hpp"
 #include "ClientSession.hpp"
 #include "PrisonerSession.hpp"
+#include "Unit.hpp"
 
 using namespace LOOLProtocol;
 
@@ -28,6 +29,11 @@ void ChildProcess::socketProcessor()
 IoUtil::SocketProcessor(_ws,
 [this](const std::vector& payload)
 {
+if (UnitWSD::get().filterChildMessage(payload))
+{
+return true;
+}
+
 auto docBroker = this->_docBroker.lock();
 if (docBroker)
 {
diff --git a/loolwsd/Unit.hpp b/loolwsd/Unit.hpp
index dcdd36c..9cebfaa 100644
--- a/loolwsd/Unit.hpp
+++ b/loolwsd/Unit.hpp
@@ -134,6 +134,10 @@ public:
  Poco::Net::HTTPServerResponse& /* response */)
 { return false; }
 
+/// Child sent a message
+virtual bool filterChildMessage(const std::vector& /* payload */)
+{ return false; }
+
 //  TileCache hooks 
 /// Called before the lookupTile call returns. Should always be called to 
fire events.
 virtual void lookupTile(int part, int width, int height, int tilePosX, int 
tilePosY,
diff --git a/loolwsd/test/UnitPrefork.cpp b/loolwsd/test/UnitPrefork.cpp
index c265831..f9437bb 100644
--- a/loolwsd/test/UnitPrefork.cpp
+++ b/loolwsd/test/UnitPrefork.cpp
@@ -14,6 +14,9 @@
 #include 
 #include 
 
+#include 
+#include 
+
 #include "Common.hpp"
 #include "IoUtil.hpp"
 #include "LOOLProtocol.hpp"
@@ -32,11 +35,17 @@ class UnitPrefork : public UnitWSD
 int _numStarted;
 std::string _failure;
 Poco::Timestamp _startTime;
+size_t _totalPSS;
+size_t _totalDirty;
+std::mutex _mutex;
+std::condition_variable _cv;
 std::vector< std::shared_ptr > _childSockets;
 
 public:
 UnitPrefork()
-: _numStarted(0)
+: _numStarted(0),
+  _totalPSS(0),
+  _totalDirty(0)
 {
 setHasKitHooks();
 }
@@ -52,29 +61,9 @@ public:
 numPrefork = NumToPrefork;
 }
 
-void getMemory(const std::shared_ptr ,
-   size_t , size_t )
+virtual bool filterChildMessage(const std::vector& payload)
 {
-/// Fetch memory usage data from the last process ...
-socket->sendFrame("unit-memdump: \n", sizeof("unit-memdump: \n")-1);
-
-static const Poco::Timespan waitTime(COMMAND_TIMEOUT_MS * 1000);
-if (!socket->poll(waitTime, Poco::Net::Socket::SELECT_READ))
-{
-_failure = "Timed out waiting for child to respond to unit-memdump 
command.";
-return;
-}
-
-int flags;
-char buffer[4096];
-const int length = IoUtil::receiveFrame(*socket, buffer, sizeof 
(buffer), flags);
-if (length <= 0 || ((flags & Poco::Net::WebSocket::FRAME_OP_BITMASK) 
== Poco::Net::WebSocket::FRAME_OP_CLOSE))
-{
-_failure = "Failed to read child response to unit-memdump 
command.";
-return;
-}
-
-const std::string memory = LOOLProtocol::getFirstLine(buffer, length);
+const std::string memory = LOOLProtocol::getFirstLine(payload);
 if (!memory.compare(0,6,"Error:"))
 {
 _failure = memory;
@@ -84,9 +73,31 @@ public:
 Log::info("Got memory stats [" + memory + "].");
 Poco::StringTokenizer tokens(memory, " ");
 assert(tokens.count() == 2);
-totalPSS += atoi(tokens[0].c_str());
-totalDirty += atoi(tokens[1].c_str());
+_totalPSS += atoi(tokens[0].c_str());
+_totalDirty += atoi(tokens[1].c_str());
 }
+
+// Don't signal before wait.
+std::unique_lock lock(_mutex);
+_cv.notify_one();
+return true;
+}
+
+void getMemory(const std::shared_ptr ,
+   size_t , size_t )
+{
+std::unique_lock lock(_mutex);
+
+/// Fetch 

[Libreoffice-commits] online.git: loolwsd/DocumentBroker.cpp loolwsd/test

2016-04-24 Thread Ashod Nakashian
 loolwsd/DocumentBroker.cpp |1 +
 loolwsd/test/httpcrashtest.cpp |6 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

New commits:
commit 48bdc1e97a49479113fc3d71bdb8a07e9dd827c9
Author: Ashod Nakashian 
Date:   Sat Apr 23 16:00:09 2016 -0400

loolwsd: silence unused-result gcc error

Change-Id: Ide71b0b585a2b822cedc93e0b4aae11ab4aa1b34
Reviewed-on: https://gerrit.libreoffice.org/24333
Reviewed-by: Ashod Nakashian 
Tested-by: Ashod Nakashian 

diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index deab8fc..b749f77 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -287,6 +287,7 @@ size_t 
DocumentBroker::addSession(std::shared_ptr& session
 // Request a new session from the child kit.
 const std::string aMessage = "session " + id + " " + _docKey + "\n";
 Log::debug("DocBroker to Child: " + aMessage.substr(0, aMessage.length() - 
1));
+//FIXME: The socket could be broken, child dead, etc. Must recover!
 _childProcess->getWebSocket()->sendFrame(aMessage.data(), aMessage.size());
 
 return _sessions.size();
diff --git a/loolwsd/test/httpcrashtest.cpp b/loolwsd/test/httpcrashtest.cpp
index 63d2c87..4169ebd 100644
--- a/loolwsd/test/httpcrashtest.cpp
+++ b/loolwsd/test/httpcrashtest.cpp
@@ -140,7 +140,11 @@ void HTTPCrashTest::testCrashKit()
 Poco::StringTokenizer tokens(statString, " ");
 if (tokens.count() > 3 && tokens[1] == "(loolkit)")
 {
-std::system(killLOKit.c_str());
+const auto res = std::system(killLOKit.c_str());
+if (res != 0)
+{
+std::cerr << "exit " + std::to_string(res) + " 
from " + killLOKit << std::endl;
+}
 }
 }
 }
___
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits