From e8c25d5f7215a4165144427074cc777569dedcec Mon Sep 17 00:00:00 2001 From: tanuma Date: Thu, 28 Jan 2010 06:06:58 +0000 Subject: [PATCH] ticket #450 git-svn-id: http://10.144.169.20/repos/um/branches/l7vsd-3.x-ramiel@9924 1ed66053-1c2d-0410-8867-f7571e6e31d3 --- l7vsd/src/l7vsd.cpp | 26 ++++++++++++++++++++++++-- l7vsd/src/session_thread_control.cpp | 30 ++++++++++++++++++++++++++++++ l7vsd/src/virtualservice_tcp.cpp | 35 ++++++++++++++++++++++++----------- 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/l7vsd/src/l7vsd.cpp b/l7vsd/src/l7vsd.cpp index 017ed3d8..dd924017 100644 --- a/l7vsd/src/l7vsd.cpp +++ b/l7vsd/src/l7vsd.cpp @@ -251,9 +251,31 @@ void l7vsd::add_virtual_service( const virtualservice_element* in_vselement, vsptr->set_virtualservice( *in_vselement, err ); if( err ) return; - // create thread and run - vs_threads.create_thread( boost::bind( &virtual_service::run, vsptr ) ); + try{ + + // create thread and run + vs_threads.create_thread( boost::bind( &virtual_service::run, vsptr ) ); + } + catch( ... ){ + std::stringstream buf; + buf << "virtualservice thread initialize failed."; + Logger::putLogError(LOG_CAT_L7VSD_MAINTHREAD, 8, buf.str(), __FILE__, __LINE__); + err.setter( true, buf.str() ); + + vsptr->stop(); + l7vs::error_code finalize_err; + vsptr->finalize( finalize_err ); + + /*-------- DEBUG LOG --------*/ + if( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_MAINTHREAD ) ){ + Logger::putLogDebug( LOG_CAT_L7VSD_MAINTHREAD, 41, "out l7vsd::add_virtual_service", __FILE__, __LINE__ ); + } + /*------ DEBUG LOG END ------*/ + + return; + } + // add to vslist vslist.push_back( vsptr ); diff --git a/l7vsd/src/session_thread_control.cpp b/l7vsd/src/session_thread_control.cpp index 77588f41..b06162b1 100644 --- a/l7vsd/src/session_thread_control.cpp +++ b/l7vsd/src/session_thread_control.cpp @@ -30,6 +30,36 @@ namespace l7vs{ // +//! @brief create up down thread +// +void session_thread_control::start_thread(){ + + int int_val; + + upthread.reset( new boost::thread( &session_thread_control::upstream_run, this ) ); //! upstream thread create + downthread.reset( new boost::thread( &session_thread_control::downstream_run, this ) );//! downstream thread create + + //pthread_setschedparam + int retval, sched_policy; + sched_param scheduler_param; + int_val = pthread_getschedparam( upthread->native_handle(), &sched_policy, &scheduler_param ); + if( SCHED_FIFO == sched_algorithm ){ + scheduler_param.__sched_priority = sched_priority; + sched_policy = SCHED_FIFO; + }else if( SCHED_RR == sched_algorithm ){ + scheduler_param.__sched_priority = sched_priority; + sched_policy = SCHED_RR; + }else if( SCHED_BATCH == sched_algorithm ){ + sched_policy = SCHED_BATCH; + } + if( 0 <= sched_algorithm ){ + retval = pthread_setschedparam( upthread->native_handle(), sched_algorithm, &scheduler_param ); + retval = pthread_setschedparam( downthread->native_handle(), sched_algorithm, &scheduler_param ); + } + +} + +// //! @brief upstream thread bind function. // void session_thread_control::upstream_run(){ diff --git a/l7vsd/src/virtualservice_tcp.cpp b/l7vsd/src/virtualservice_tcp.cpp index 8cfb2be4..e2a2ff0e 100644 --- a/l7vsd/src/virtualservice_tcp.cpp +++ b/l7vsd/src/virtualservice_tcp.cpp @@ -406,7 +406,7 @@ void l7vs::virtualservice_tcp::handle_accept( const l7vs::session_thread_cont while( unlikely( !stc_ptr_register_accept ) ){ boost::this_thread::yield(); stc_ptr_register_accept = pool_sessions.pop(); - } + } //session add wait_sessions boost::mutex::scoped_lock up_wait_lk( stc_ptr_register_accept->get_upthread_mutex() ); @@ -704,11 +704,20 @@ void l7vs::virtualservice_tcp::initialize( l7vs::error_code& err ){ return; } session_thread_control* p_stc = new session_thread_control( sess, vsnic_cpumask, rsnic_cpumask, -1 ); + p_stc->start_thread(); while( !pool_sessions.push( p_stc ) ){} } - catch( std::bad_alloc ex ){ + catch( ... ){ Logger::putLogFatal( LOG_CAT_L7VSD_VIRTUALSERVICE, 1, "error, create session.", __FILE__, __LINE__ ); + + err.setter( true, "error, create session." ); + + stop(); + l7vs::error_code finalize_err; + finalize_err.setter(false,""); + finalize( finalize_err ); + if( unlikely( LOG_LV_DEBUG == Logger::getLogLevel( LOG_CAT_L7VSD_VIRTUALSERVICE ) ) ){ boost::format formatter("out_function : void virtualservice_tcp::initialize( " "l7vs::error_code& err ) : err = %s, err.message = %s"); @@ -765,18 +774,22 @@ void l7vs::virtualservice_tcp::finalize( l7vs::error_code& err ){ boost::this_thread::yield(); } - for(;;){ - tcp_session* tmp_session = NULL; - session_thread_control* tmp_stc = NULL; - waiting_sessions.pop( tmp_session, tmp_stc ); - if( !tmp_stc ){ - break; - } + if( waiting_sessions.size() > 0 ) { + for(;;){ - if( likely( pool_sessions.push( tmp_stc ) ) )break; + tcp_session* tmp_session = NULL; + session_thread_control* tmp_stc = NULL; + waiting_sessions.pop( tmp_session, tmp_stc ); + if( !tmp_stc ){ + break; + } + for(;;){ + if( likely( pool_sessions.push( tmp_stc ) ) )break; + } } - } + } + //release sessions[i]->join(); while( !pool_sessions.empty() ){ session_thread_control* stc = pool_sessions.pop(); -- 2.11.0