diff options
Diffstat (limited to '0002-Avoid-deadlock-in-TestIndexSearcher.patch')
-rw-r--r-- | 0002-Avoid-deadlock-in-TestIndexSearcher.patch | 112 |
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 + |