Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: test/FilterEngine.cpp

Issue 29361562: Issue 3594 - remove circular references JsEngine-JsValue-JsEngine (Closed)
Patch Set: temporary workaround for race condition Created Dec. 1, 2016, 10:26 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/JsValue.cpp ('K') | « test/BaseJsTest.cpp ('k') | test/JsEngine.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/FilterEngine.cpp
diff --git a/test/FilterEngine.cpp b/test/FilterEngine.cpp
index 177c0c7f2147850c3d846786858b9817c14155b3..c1c34f36231c207ea2d6ca09e3b4a24ab3a80ba9 100644
--- a/test/FilterEngine.cpp
+++ b/test/FilterEngine.cpp
@@ -16,6 +16,8 @@
*/
#include "BaseJsTest.h"
+#include <thread>
+#include <chrono>
namespace
{
@@ -533,3 +535,27 @@ TEST_F(FilterEngineTest, ElemhideWhitelisting)
"http://example.co.uk",
documentUrls1));
}
+
+TEST(NewFilterEngineTest, MemoryLeak_NoCircularReferences)
+{
+ std::weak_ptr<AdblockPlus::JsEngine> weakJsEngine;
+ {
+ auto jsEngine = AdblockPlus::JsEngine::New();
+ weakJsEngine = jsEngine;
+ jsEngine->SetFileSystem(AdblockPlus::FileSystemPtr(new LazyFileSystem()));
+ jsEngine->SetWebRequest(AdblockPlus::WebRequestPtr(new LazyWebRequest()));
+ jsEngine->SetLogSystem(AdblockPlus::LogSystemPtr(new LazyLogSystem()));
+ auto filterEngine = FilterEnginePtr(new AdblockPlus::FilterEngine(jsEngine));
+ }
+ {
+ // It's a hack to figure current race condition out (better than nothing):
+ // IO or timer thread still can aquire a strong reference to JsEngine right
+ // before destroying filterEngine holding JsEngine and keep it for some
+ // time, so here we need to give it a reasonable amount of time to finish
+ // the current operation.
+ uint16_t attempts = 10;
+ while (attempts-- > 0 && weakJsEngine.lock())
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ }
+ EXPECT_FALSE(weakJsEngine.lock());
+}
« src/JsValue.cpp ('K') | « test/BaseJsTest.cpp ('k') | test/JsEngine.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld