GslSvc.cpp
Go to the documentation of this file.00001
00002
00003
00004 #include "GaudiKernel/SvcFactory.h"
00005 #include "GaudiKernel/MsgStream.h"
00006 #include "GaudiKernel/System.h"
00007 #include "GaudiKernel/ISvcLocator.h"
00008 #include "GaudiKernel/IToolSvc.h"
00009
00010 #include <algorithm>
00011 #include <functional>
00012
00013 #include "GaudiGSL/IGslErrorHandler.h"
00014 #include "GaudiGSL/GslError.h"
00015
00016 #include "GaudiGSL/GaudiGSL.h"
00017 #include "GslSvc.h"
00018 #include "GaudiGSL/GslErrorHandlers.h"
00019
00020 #include "gsl/gsl_errno.h"
00021
00022
00030
00031
00032
00038
00039 DECLARE_SERVICE_FACTORY(GslSvc)
00040
00041
00042
00047
00048 GslSvc::GslSvc( const std::string& name ,
00049 ISvcLocator* svc )
00050 : base_class ( name , svc )
00051 , m_errorPolicy ( "GSL" )
00052 , m_handlersTypeNames ()
00053 , m_handlers ()
00054 , m_ignore ()
00055 {
00056 declareProperty( "ErrorPolicy" , m_errorPolicy ) ;
00057 declareProperty( "Handlers" , m_handlersTypeNames ) ;
00058 declareProperty( "IgnoreCodes" , m_ignore ) ;
00059 };
00060
00061
00062
00064
00065 GslSvc::~GslSvc() {};
00066
00067
00068
00074
00075 StatusCode GslSvc::initialize()
00076 {
00077
00078 StatusCode sc = Service::initialize();
00079 MsgStream log( msgSvc() , name() );
00080 if( sc.isFailure() )
00081 { log << MSG::ERROR
00082 << " Error in initialization of base class 'Service'"<< endmsg;
00083 return sc;
00084 }
00085
00086 GaudiGSL::setGslSvc( this );
00087
00088 if ( "GSL" == m_errorPolicy ) { }
00089 else if ( "Off" == m_errorPolicy )
00090 { gsl_set_error_handler_off() ; }
00091 else if ( "Abort" == m_errorPolicy )
00092 { gsl_set_error_handler ( 0 ) ; }
00093 else if ( "Ignore" == m_errorPolicy )
00094 { gsl_set_error_handler ( GslErrorHandlers::ignoreTheError ) ; }
00095 else if ( "Exception" == m_errorPolicy )
00096 { gsl_set_error_handler ( GslErrorHandlers::throwException ) ; }
00097 else if ( "Handle" == m_errorPolicy )
00098 { gsl_set_error_handler ( GslErrorHandlers::handleTheError ) ; }
00099 else
00100 { log << MSG::ERROR
00101 << " Unknown Error policy '" << m_errorPolicy << "'"
00102 << " Valid policies: "
00103 << "[ 'GSL' , 'Off' , 'Abort' , 'Ignore' , 'Exception' , 'Handle' ]"
00104 << endmsg;
00105 return StatusCode::FAILURE ;
00106 }
00109 GslErrorHandler handler = gsl_set_error_handler( 0 );
00110 gsl_set_error_handler( handler );
00111 if( 0 != handler )
00112 { log << MSG::VERBOSE
00113 << " GSL Error Handler is '"
00114 << System::typeinfoName( typeid(*handler) ) << "'"
00115 << endmsg; }
00116 else { log << MSG::INFO << " Error Handler is NULL" << endmsg ; }
00117
00118 if( !m_handlersTypeNames.empty() )
00119 {
00121 SmartIF<IToolSvc> toolsvc(serviceLocator()->service("ToolSvc"));
00122 if (!toolsvc.isValid()) {
00123 log << MSG::ERROR << " Could not locate Tool Service! " << endmsg;
00124 return StatusCode::FAILURE;
00125 }
00126 StatusCode sc;
00127 for( Names::const_iterator it = m_handlersTypeNames.begin() ;
00128 m_handlersTypeNames.end() != it ; ++it )
00129 {
00130 std::string::const_iterator ipos =
00131 std::find( it->begin() , it->end() , '/');
00132 const std::string::size_type pos = ipos - it->begin() ;
00133 IGslErrorHandler* eh = 0 ;
00134 if( it->end() != ipos )
00135 { sc = toolsvc->retrieveTool
00136 ( std::string( *it , 0 , pos ) ,
00137 std::string( *it , pos + 1, it->length() ), eh , this ) ; }
00138 else
00139 { sc = toolsvc->retrieveTool
00140 ( *it , std::string( *it , pos + 1, it->length() ) ,
00141 eh , this ) ; }
00142 if( sc.isFailure() )
00143 { log << MSG::ERROR
00144 << " Could not retrieve tool '" << *it << "'"<< endmsg ;
00145 return sc ; }
00146 if( 0 == eh )
00147 { log << MSG::ERROR
00148 << " Could not retrieve tool '" << *it << "'"<< endmsg ;
00149 return StatusCode::FAILURE ; }
00150 m_handlers.push_back( eh );
00151 }
00152 }
00153
00154 return StatusCode::SUCCESS;
00155 };
00156
00157
00158
00164
00165 StatusCode GslSvc::finalize()
00166 {
00167 MsgStream log(msgSvc(), name());
00168 log << MSG::DEBUG << "==> Finalize" << endmsg;
00169
00170
00171 GaudiGSL::setGslSvc( 0 );
00172
00173
00174 return Service::finalize() ;
00175 };
00176
00177
00178
00182
00183 IGslSvc::GslErrorHandler GslSvc::handler () const
00184 {
00185 GslErrorHandler hh = gsl_set_error_handler( 0 );
00186 gsl_set_error_handler( hh );
00187 return hh ;
00188 };
00189
00190
00191
00196
00197 IGslSvc::GslErrorHandler GslSvc::setHandler
00198 ( IGslSvc::GslErrorHandler handler ) const
00199 {
00200 gsl_set_error_handler( handler );
00201 {
00202 MsgStream log( msgSvc(), name() );
00203 log << MSG::DEBUG << " New GSL handler is set '" ;
00204 if( 0 == handler ) { log << "NULL" ; }
00205 else { log << System::typeinfoName( typeid(handler) ) ; }
00206 log << "'" << endmsg ;
00207 }
00208 return handler ;
00209 };
00210
00211
00212
00217
00218 StatusCode GslSvc::status ( const int error ) const
00219 {
00220 if( GSL_SUCCESS == error ){ return StatusCode::SUCCESS ; }
00221 StatusCode sc( error );
00222 if( sc.isSuccess() ){ return StatusCode::FAILURE ; }
00223 return sc ;
00224 };
00225
00226
00227
00232
00233 StatusCode GslSvc::handle
00234 ( const GslError& error ) const
00235 {
00236 StatusCode sc = StatusCode::SUCCESS ;
00237
00238 if( m_ignore.end() != std::find( m_ignore.begin () ,
00239 m_ignore.end () ,
00240 error.code ) ) { return sc ; }
00241
00242 for( Handlers::const_iterator handler = m_handlers.begin() ;
00243 sc.isSuccess() && m_handlers.end() != handler ; ++handler )
00244 { sc = (*handler)->handle( error ); }
00245
00246 return sc ;
00247 };
00248
00249
00250
00251
00252
00253
00254
00255