summaryrefslogtreecommitdiff
path: root/0002-Avoid-deadlock-in-TestIndexSearcher.patch
diff options
context:
space:
mode:
Diffstat (limited to '0002-Avoid-deadlock-in-TestIndexSearcher.patch')
-rw-r--r--0002-Avoid-deadlock-in-TestIndexSearcher.patch112
1 files changed, 112 insertions, 0 deletions
diff --git a/0002-Avoid-deadlock-in-TestIndexSearcher.patch b/0002-Avoid-deadlock-in-TestIndexSearcher.patch
new file mode 100644
index 0000000..a7e020b
--- /dev/null
+++ b/0002-Avoid-deadlock-in-TestIndexSearcher.patch
@@ -0,0 +1,112 @@
+From bdc374bfbb0ca34ddb40713eb51d8535fdf11952 Mon Sep 17 00:00:00 2001
+From: Stephan Bergmann <sbergman@redhat.com>
+Date: Wed, 31 Jul 2019 16:27:33 +0200
+Subject: [PATCH 2/2] Avoid deadlock in TestIndexSearcher
+
+---
+ src/test/search/TestIndexSearcher.cpp | 51 +++++++++++++++++++++------
+ 1 file changed, 41 insertions(+), 10 deletions(-)
+
+diff --git a/src/test/search/TestIndexSearcher.cpp b/src/test/search/TestIndexSearcher.cpp
+index 02c21aaf..a6dde5ba 100644
+--- a/src/test/search/TestIndexSearcher.cpp
++++ b/src/test/search/TestIndexSearcher.cpp
+@@ -8,9 +8,11 @@
+
+ DEFINE_MUTEX(searchMutex);
+ DEFINE_CONDITION(searchCondition);
++bool searchReady;
+
+ DEFINE_MUTEX(deleteMutex);
+ DEFINE_CONDITION(deleteCondition);
++bool deleteReady;
+
+ _LUCENE_THREAD_FUNC(searchDocs, _searcher) {
+
+@@ -19,15 +21,20 @@ _LUCENE_THREAD_FUNC(searchDocs, _searcher) {
+ Query * query = QueryParser::parse(_T("one"), _T("content"), &an);
+ Hits * hits = searcher->search(query);
+
+-// _LUCENE_SLEEP(9999); //make sure that searchMutex is being waited on...
++ {
++ SCOPED_LOCK_MUTEX(searchMutex);
++ searchReady = true;
++ CONDITION_NOTIFYALL(searchCondition);
++ }
+
+- CONDITION_NOTIFYALL(searchCondition);
+ SCOPED_LOCK_MUTEX(deleteMutex);
+
+ _CLLDELETE(hits);
+ _CLLDELETE(query);
+
+- CONDITION_WAIT(deleteMutex, deleteCondition);
++ while (!deleteReady) {
++ CONDITION_WAIT(deleteMutex, deleteCondition);
++ }
+ _LUCENE_THREAD_FUNC_RETURN(0);
+ }
+
+@@ -55,13 +62,24 @@ void testEndThreadException(CuTest *tc) {
+
+ // this sequence is OK: delete searcher after search thread finish
+ {
++ searchReady = false;
++ deleteReady = false;
++
+ IndexSearcher * searcher = _CLNEW IndexSearcher(&ram);
+ _LUCENE_THREADID_TYPE thread = _LUCENE_THREAD_CREATE(&searchDocs, searcher);
+- SCOPED_LOCK_MUTEX(searchMutex);
+
+- CONDITION_WAIT(searchMutex, searchCondition);
+-// _LUCENE_SLEEP(9999); //make sure that deleteMutex is being waited on...
+- CONDITION_NOTIFYALL(deleteCondition);
++ {
++ SCOPED_LOCK_MUTEX(searchMutex);
++ while (!searchReady) {
++ CONDITION_WAIT(searchMutex, searchCondition);
++ }
++ }
++
++ {
++ SCOPED_LOCK_MUTEX(deleteMutex);
++ deleteReady = true;
++ CONDITION_NOTIFYALL(deleteCondition);
++ }
+
+ _LUCENE_THREAD_JOIN(thread);
+
+@@ -71,14 +89,27 @@ void testEndThreadException(CuTest *tc) {
+
+ // this produces memory exception: delete searcher after search finish but before thread finish
+ {
++ searchReady = false;
++ deleteReady = false;
++
+ IndexSearcher * searcher = _CLNEW IndexSearcher(&ram);
+ _LUCENE_THREADID_TYPE thread = _LUCENE_THREAD_CREATE(&searchDocs, searcher);
+- SCOPED_LOCK_MUTEX(searchMutex);
+
+- CONDITION_WAIT(searchMutex, searchCondition);
++ {
++ SCOPED_LOCK_MUTEX(searchMutex);
++ while (!searchReady) {
++ CONDITION_WAIT(searchMutex, searchCondition);
++ }
++ }
++
+ searcher->close();
+ _CLLDELETE(searcher);
+- CONDITION_NOTIFYALL(deleteCondition);
++
++ {
++ SCOPED_LOCK_MUTEX(deleteMutex);
++ deleteReady = true;
++ CONDITION_NOTIFYALL(deleteCondition);
++ }
+
+ _LUCENE_THREAD_JOIN(thread);
+ }
+--
+2.21.0
+