/* $Revision: 3 $ $Date: 15/11/04 10:53 $ Copyright © 2004, FSL Technologies Limited. Contact "http://fost3.fsltech.com". */ #include "stdafx.h" #include "FOST.kpi.hpp" #include using namespace FSLib; namespace { Revision c_header( FOST_KPI_HPP_ARCHIVE, __DATE__, FOST_KPI_HPP_REVISION, FOST_KPI_HPP_DATE ); Revision c_revision( L"$Archive: /FOST.3/F3Util/manager.cpp $", __DATE__, L"$Revision: 3 $", L"$Date: 15/11/04 10:53 $" ); const Setting c_forceAll( L"$Archive: /FOST.3/F3Util/manager.cpp $", L"KPI", L"ForceAll", L"0", true ); FSLib::ExclusiveWrite &managerLock() { static FSLib::ExclusiveWrite lock( 20 ); return lock; } std::list< init_ptr< const Process::Manager > > &g_managers() { static std::list< init_ptr< const Process::Manager > > list; return list; } } /* FSLib::Process::Manager */ FSLib::Process::Manager::Manager( const FSLib::wstring &name ) : m_name( name ), m_force( L"$Revision: 3 $", L"KPI", L"Force-" + name, L"0", true ) { boost::scoped_ptr< FSLib::ExclusiveWrite::WriteLock > lock( new FSLib::ExclusiveWrite::WriteLock( managerLock() ) ); g_managers().push_back( init_ptr< const Process::Manager >( this ) ); } FSLib::Process::Manager::~Manager() { boost::scoped_ptr< FSLib::ExclusiveWrite::WriteLock > lock( new FSLib::ExclusiveWrite::WriteLock( managerLock() ) ); std::list< init_ptr< const Process::Manager > >::iterator pos = std::find( g_managers().begin(), g_managers().end(), init_ptr< const Process::Manager >( this ) ); if ( pos != g_managers().end() ) g_managers().erase( pos ); } void FSLib::Process::Manager::start( const Process::Task &tick, std::list< init_ptr< const Manager > > &managers ) { boost::scoped_ptr< FSLib::ExclusiveWrite::ReadLock > lock( new FSLib::ExclusiveWrite::ReadLock( managerLock() ) ); for ( std::list< init_ptr< const Process::Manager > >::const_iterator it( g_managers().begin() ); it != g_managers().end(); ++it ) { if ( _wtoi( c_forceAll.value().c_str() ) || _wtoi( (*it)->m_force.value().c_str() ) ) { managers.push_back( *it ); (*it)->start( tick ); } } } /* FSLib::Process::Tick */ FSLib::Process::Task &FSLib::Process::Task::task() { throw Exceptions::NotImplemented( L"Tick &FSLib::Process::Task::task()" ); } inline FSLib::Process::Task::Task( const wstring &pos ) : m_position( pos ), m_during( TimeStamp::now(), Null ), m_done( 0 ), m_reference( guid() ) { Process::Manager::start( *this, this->m_managers ); } inline FSLib::Process::Task::Task( unsigned __int64 number, const wstring &pos ) : m_position( pos ), m_during( TimeStamp::now(), Null ), m_work( number ), m_done( 0 ), m_reference( guid() ) { Process::Manager::start( *this, this->m_managers ); } inline FSLib::Process::Task::Task( const wstring &ref, const wstring &pos ) : m_position( pos ), m_during( TimeStamp::now(), Null ), m_workUnit( ref ), m_done( 0 ), m_reference( guid() ) { Process::Manager::start( *this, this->m_managers ); } inline FSLib::Process::Task::Task( const wstring &ref, unsigned __int64 number, const wstring &pos ) : m_position( pos ), m_during( TimeStamp::now(), Null ), m_work( number ), m_workUnit( ref ), m_done( 0 ), m_reference( guid() ) { Process::Manager::start( *this, this->m_managers ); } inline FSLib::Process::Task::~Task() { complete(); } inline void FSLib::Process::Task::done( unsigned __int64 amount ) { m_done += amount; for( std::list< init_ptr< const Manager > >::const_iterator it( m_managers.begin() ); it != m_managers.end(); ++it ) (*it)->done( *this ); } inline void FSLib::Process::Task::complete() { if ( m_during.end().isnull() ) { if ( m_done == 0 ) done(); m_during.end( TimeStamp::now() ); for( std::list< init_ptr< const Manager > >::const_iterator it( m_managers.begin() ); it != m_managers.end(); ++it ) (*it)->complete( *this ); } } Nullable< TimeStamp > FSLib::Process::Task::eta() const { return Null; } std::pair< Time::t_seconds, FSLib::Process::Task::t_time > FSLib::Process::Task::rate() const { if ( m_done == 0 ) return std::make_pair( 0, e_second ); Nullable< TimeStamp > e = m_during.end(); if ( e.isnull() ) e = TimeStamp::now(); Time::t_seconds s = e.value() - m_during.start().value(); return std::make_pair( m_done / s, e_second ); } template<> FSLib::wstring FSLib::toString< FSLib::Process::Task::t_time >( const FSLib::Process::Task::t_time & t ) { switch ( t ) { case FSLib::Process::Task::e_second: return L"second"; default: return L"(unknown - " + toString( int( t ) ) + L" )"; }; } /* $History: manager.cpp $ * * ***************** Version 3 ***************** * User: Kirit Date: 15/11/04 Time: 10:53 * Updated in $/FOST.3/F3Util * Moved managers into a seperate file. * * ***************** Version 2 ***************** * User: Kirit Date: 6/11/04 Time: 21:49 * Updated in $/FOST.3/F3Util * Added basics of new KPI based logging system. * * ***************** Version 1 ***************** * User: Kirit Date: 4/11/04 Time: 18:07 * Created in $/FOST.3/F3Util * Added initial outline for KPI manager. */