X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_session_shared.cpp;h=d14dc1b140c728275524659b244cdc27e5310989;hb=d5f308247c260a15729ce7b5fb2933c778c75b2b;hp=fb81b98512e296ad1e413e6579efcdae618d783e;hpb=b02df3fd0849c5222081013420c18f949c55f9c5;p=metaproxy-moved-to-github.git diff --git a/src/filter_session_shared.cpp b/src/filter_session_shared.cpp index fb81b98..d14dc1b 100644 --- a/src/filter_session_shared.cpp +++ b/src/filter_session_shared.cpp @@ -41,6 +41,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include namespace mp = metaproxy_1; namespace yf = metaproxy_1::filter; @@ -193,6 +194,7 @@ namespace metaproxy_1 { void release_frontend(Package &package); Rep(); public: + ~Rep(); void expire(); private: void expire_classes(); @@ -202,6 +204,7 @@ namespace metaproxy_1 { void start(); boost::mutex m_mutex; boost::condition m_cond_session_ready; + boost::condition m_cond_expire_ready; std::map m_clients; BackendClassMap m_backend_map; @@ -215,6 +218,7 @@ namespace metaproxy_1 { int m_session_max; Odr_int m_preferredMessageSize; Odr_int m_maximumRecordSize; + bool close_down; }; } } @@ -1055,11 +1059,16 @@ void yf::SessionShared::Frontend::present(mp::Package &package, return; Z_NamePlusRecordList *npr_res = 0; - if (found_set->m_record_cache.lookup(odr, &npr_res, - *req->resultSetStartPoint, - *req->numberOfRecordsRequested, - req->preferredRecordSyntax, - req->recordComposition)) + // record_cache.lookup types are int's. Avoid non-fitting values + if (*req->resultSetStartPoint > 0 + && *req->resultSetStartPoint < INT_MAX + && *req->numberOfRecordsRequested > 0 + && *req->numberOfRecordsRequested < INT_MAX + && found_set->m_record_cache.lookup(odr, &npr_res, + *req->resultSetStartPoint, + *req->numberOfRecordsRequested, + req->preferredRecordSyntax, + req->recordComposition)) { Z_APDU *f_apdu_res = odr.create_presentResponse(apdu_req, 0, 0); Z_PresentResponse *f_resp = f_apdu_res->u.presentResponse; @@ -1118,17 +1127,23 @@ void yf::SessionShared::Frontend::present(mp::Package &package, if (b_resp->records && b_resp->records->which == Z_Records_DBOSD) { + Z_NamePlusRecordList *npr = + b_resp->records->u.databaseOrSurDiagnostics; + // record_cache.add types are int's. Avoid non-fitting values + if (*req->resultSetStartPoint > 0 + && npr->num_records + *req->resultSetStartPoint < INT_MAX) + { #if 0 - yaz_log(YLOG_LOG, "Adding " ODR_INT_PRINTF "+" ODR_INT_PRINTF - " records to cache %p", - *req->resultSetStartPoint, - *f_resp->numberOfRecordsReturned, - &found_set->m_record_cache); + yaz_log(YLOG_LOG, "Adding " ODR_INT_PRINTF "+" ODR_INT_PRINTF + " records to cache %p", + *req->resultSetStartPoint, + *f_resp->numberOfRecordsReturned, + &found_set->m_record_cache); #endif - found_set->m_record_cache.add( - odr, - b_resp->records->u.databaseOrSurDiagnostics, - *req->resultSetStartPoint, p_req->recordComposition); + found_set->m_record_cache.add( + odr, npr, *req->resultSetStartPoint, + p_req->recordComposition); + } } bc->release_backend(found_backend); } @@ -1239,15 +1254,19 @@ void yf::SessionShared::Rep::expire() { boost::xtime xt; boost::xtime_get(&xt, -#if BOOST_VERSION >= 105000 +#if BOOST_VERSION >= 105000 boost::TIME_UTC_ #else boost::TIME_UTC #endif ); xt.sec += m_session_ttl / 3; - boost::thread::sleep(xt); - + { + boost::mutex::scoped_lock lock(m_mutex); + m_cond_expire_ready.timed_wait(lock, xt); + if (close_down) + break; + } stat(); expire_classes(); } @@ -1263,6 +1282,17 @@ yf::SessionShared::Rep::Rep() m_session_max = 100; m_preferredMessageSize = 0; m_maximumRecordSize = 0; + close_down = false; +} + +yf::SessionShared::Rep::~Rep() +{ + { + boost::mutex::scoped_lock lock(m_mutex); + close_down = true; + m_cond_expire_ready.notify_all(); + } + m_thrds.join_all(); } void yf::SessionShared::Rep::start()