From: <ust...@us...> - 2008-09-27 09:34:25
|
Revision: 2897 http://clucene.svn.sourceforge.net/clucene/?rev=2897&view=rev Author: ustramooner Date: 2008-09-27 09:34:20 +0000 (Sat, 27 Sep 2008) Log Message: ----------- threading test and a test suite for it. macros for creating threads also provided Modified Paths: -------------- branches/lucene2_3_2/src/shared/CLucene/LuceneThreads.h branches/lucene2_3_2/src/shared/CLucene/config/_threads.h branches/lucene2_3_2/src/shared/CLucene/config/threads.cpp branches/lucene2_3_2/src/test/index/TestReuters.cpp Modified: branches/lucene2_3_2/src/shared/CLucene/LuceneThreads.h =================================================================== --- branches/lucene2_3_2/src/shared/CLucene/LuceneThreads.h 2008-09-27 09:31:56 UTC (rev 2896) +++ branches/lucene2_3_2/src/shared/CLucene/LuceneThreads.h 2008-09-27 09:34:20 UTC (rev 2897) @@ -18,14 +18,19 @@ #define STATIC_DEFINE_MUTEX(x) #define _LUCENE_CURRTHREADID 1 #define _LUCENE_THREADID_TYPE char + #define _LUCENE_THREAD_FUNC(name, argName) int name(void* argName) + #define _LUCENE_THREAD_CREATE(value, func, arg) func(arg) + #define _LUCENE_THREAD_JOIN(value) //nothing to do... #else #if defined(_LUCENE_DONTIMPLEMENT_THREADMUTEX) //do nothing #else - #if defined(_CL_HAVE_PTHREAD) + #if defined(_CL_HAVE_PTHREAD) #define _LUCENE_THREADID_TYPE pthread_t - class CLUCENE_SHARED_EXPORT mutex_thread + #define _LUCENE_THREAD_FUNC(name, argName) void* name(void* argName) //< use this macro to correctly define the thread start routine + typedef void* (luceneThreadStartRoutine)(void* lpThreadParameter ); + class CLUCENE_SHARED_EXPORT mutex_thread { private: struct Internal; @@ -37,11 +42,15 @@ void lock(); void unlock(); static _LUCENE_THREADID_TYPE _GetCurrentThreadId(); + static _LUCENE_THREADID_TYPE CreateThread(luceneThreadStartRoutine* func, void* arg); + static void JoinThread(_LUCENE_THREADID_TYPE id); }; #elif defined(_CL_HAVE_WIN32_THREADS) #define _LUCENE_THREADID_TYPE uint64_t - class CLUCENE_SHARED_EXPORT mutex_thread + #define _LUCENE_THREAD_FUNC(name, argName) void __stdcall name(void* argName) //< use this macro to correctly define the thread start routine + typedef void (__stdcall luceneThreadStartRoutine)(void* lpThreadParameter ); + class CLUCENE_SHARED_EXPORT mutex_thread { private: struct Internal; @@ -53,14 +62,17 @@ void lock(); void unlock(); static _LUCENE_THREADID_TYPE _GetCurrentThreadId(); + static _LUCENE_THREADID_TYPE CreateThread(luceneThreadStartRoutine* func, void* arg); + static void JoinThread(_LUCENE_THREADID_TYPE id); }; - #else #error A valid thread library was not found #endif //mutex types + #define _LUCENE_THREAD_CREATE(func, arg) mutex_thread::CreateThread(func,arg) + #define _LUCENE_THREAD_JOIN(id) mutex_thread::JoinThread(id) #define _LUCENE_CURRTHREADID mutex_thread::_GetCurrentThreadId() #define _LUCENE_THREADMUTEX CL_NS(util)::mutex_thread #endif //don't implement Modified: branches/lucene2_3_2/src/shared/CLucene/config/_threads.h =================================================================== --- branches/lucene2_3_2/src/shared/CLucene/config/_threads.h 2008-09-27 09:31:56 UTC (rev 2896) +++ branches/lucene2_3_2/src/shared/CLucene/config/_threads.h 2008-09-27 09:34:20 UTC (rev 2897) @@ -25,11 +25,24 @@ void * LockSemaphore; _cl_dword_t SpinCount; }; + + __declspec(dllimport) void __stdcall InitializeCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall EnterCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall LeaveCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) void __stdcall DeleteCriticalSection(CRITICAL_SECTION *); __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(); + + typedef struct _SECURITY_ATTRIBUTES + { + _cl_dword_t nLength; + void* lpSecurityDescriptor; + bool bInheritHandle; + } SECURITY_ATTRIBUTES; + __declspec(dllimport) _cl_dword_t __stdcall WaitForSingleObject( void* hHandle, _cl_dword_t dwMilliseconds ); + void* _beginthread( void( __stdcall *start_address )( void * ), unsigned stack_size, void *arglist ); + + } #endif //_WINBASE_ #elif defined(_CL_HAVE_PTHREAD) @@ -72,6 +85,7 @@ }; // min_buckets = 2 ^^ N, 0 < N bool operator()( pthread_t t1, pthread_t t2 ) const{ + //pthread_equal should be used, but it returns only non-zero if equal, so we can't use it for order compare return t1 < t2; } }; Modified: branches/lucene2_3_2/src/shared/CLucene/config/threads.cpp =================================================================== --- branches/lucene2_3_2/src/shared/CLucene/config/threads.cpp 2008-09-27 09:31:56 UTC (rev 2896) +++ branches/lucene2_3_2/src/shared/CLucene/config/threads.cpp 2008-09-27 09:34:20 UTC (rev 2897) @@ -7,6 +7,7 @@ #include "CLucene/_SharedHeader.h" #include "CLucene/LuceneThreads.h" #include "_threads.h" +#include <assert.h> CL_NS_DEF(util) @@ -57,9 +58,20 @@ _LUCENE_THREADID_TYPE mutex_thread::_GetCurrentThreadId(){ return GetCurrentThreadId(); } + + _LUCENE_THREADID_TYPE mutex_thread::CreateThread(luceneThreadStartRoutine* func, void* arg){ + return (_LUCENE_THREADID_TYPE) ::_beginthread (func, 0, arg); + } + void mutex_thread::JoinThread(_LUCENE_THREADID_TYPE id){ + WaitForSingleObject((void*)id, 0xFFFFFFFF); + } #elif defined(_CL_HAVE_PTHREAD) + #ifndef _REENTRANT + #error ACK! You need to compile with _REENTRANT defined since this uses threads + #endif + #ifdef _CL_HAVE_PTHREAD_MUTEX_RECURSIVE bool mutex_pthread_attr_initd=false; pthread_mutexattr_t mutex_thread_attr; @@ -126,6 +138,15 @@ _LUCENE_THREADID_TYPE mutex_thread::_GetCurrentThreadId(){ return pthread_self(); } + + _LUCENE_THREADID_TYPE mutex_thread::CreateThread(luceneThreadStartRoutine* func, void* arg){ + _LUCENE_THREADID_TYPE ret; + assert(pthread_create(&ret, NULL, func, arg) == 0 ); + return ret; + } + void mutex_thread::JoinThread(_LUCENE_THREADID_TYPE id){ + pthread_join(id, NULL); + } void mutex_thread::lock() { Modified: branches/lucene2_3_2/src/test/index/TestReuters.cpp =================================================================== --- branches/lucene2_3_2/src/test/index/TestReuters.cpp 2008-09-27 09:31:56 UTC (rev 2896) +++ branches/lucene2_3_2/src/test/index/TestReuters.cpp 2008-09-27 09:34:20 UTC (rev 2897) @@ -1,6 +1,7 @@ #include "test.h" #include "CLucene/util/dirent.h" #include "CLucene/util/Reader.h" +#include "CLucene/LuceneThreads.h" #ifdef _CL_HAVE_SYS_STAT_H #include <sys/stat.h> @@ -267,7 +268,68 @@ _CLDELETE(reader1); _CLDELETE(reader2); } + + #define threadsCount 10 + + StandardAnalyzer threadAnalyzer; + void threadSearch(IndexSearcher* searcher, const TCHAR* qry){ + Query* q = NULL; + Hits* h = NULL; + try{ + q = QueryParser::parse(qry , _T("contents"), &threadAnalyzer); + if ( q != NULL ){ + h = searcher->search( q ); + + if ( h->length() > 0 ){ + //check for explanation memory leaks... + Explanation expl1; + searcher->explain(q, h->id(0), &expl1); + TCHAR* tmp = expl1.toString(); + _CLDELETE_CARRAY(tmp); + if ( h->length() > 1 ){ //do a second one just in case + Explanation expl2; + searcher->explain(q, h->id(1), &expl2); + tmp = expl2.toString(); + _CLDELETE_CARRAY(tmp); + } + } + } + }_CLFINALLY( + _CLDELETE(h); + _CLDELETE(q); + ); + } + _LUCENE_THREAD_FUNC(threadedSearcherTest, arg){ + IndexSearcher* searcher = (IndexSearcher*)arg; + printf("thread started :-)...\n"); + + for ( int i=0;i<100;i++ ){ + threadSearch(searcher, _T("test") ); + threadSearch(searcher, _T("reuters") ); + threadSearch(searcher, _T("data") ); + } + printf ("done...\n"); + } + + void testThreaded(CuTest* tc){ + CLUCENE_ASSERT(reuters_ready); + IndexSearcher searcher(reuters_origdirectory); + + //read using multiple threads... + _LUCENE_THREADID_TYPE threads[threadsCount]; + + int i; + for ( i=0;i<threadsCount;i++ ) + threads[i] = _LUCENE_THREAD_CREATE(&threadedSearcherTest, &searcher); + + CL_NS(util)::Misc::sleep(3000); + for ( i=0;i<threadsCount;i++ ) + _LUCENE_THREAD_JOIN(threads[i]); + + searcher.close(); + } + CuSuite *testreuters(void) { CuSuite *suite = CuSuiteNew(_T("CLucene Reuters Test")); @@ -279,6 +341,10 @@ SUITE_ADD_TEST(suite, testReuters); //SUITE_ADD_TEST(suite, testByteForByte); this test rarely works currently, use more robust by section test... SUITE_ADD_TEST(suite, testBySection); + + //we still do this, but it'll be slow because the 'threads' will be run serially. + + SUITE_ADD_TEST(suite, testThreaded); return suite; } // EOF This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |