* ./crlcore:

- New: In <tools.configuration.xml>, added parameters for verbosity, info
        and trace level.
    - New: Uniform mecanism to get the "/etc" path. Now System reads the
        environment variables (thanks to boost::program_option).
    - Change: In Utility, correct "when first called" initialisation of the
        System singleton. Access to members only through static members that
        ensure the initialisation of the singleton first.
    - Change: In System, makes uses of the callback feature of Parameter to
        initialize the new configuration parameters (verbosity, coredump, ...).
    - Change: In linefill, build upon mstream instead of ostream. Now dual
        aspect, inherit ostream and have a mstream member.
This commit is contained in:
Jean-Paul Chaput 2010-06-22 13:55:37 +00:00
parent 82fe4c2348
commit fcbd24a9e2
5 changed files with 244 additions and 69 deletions

View File

@ -1,5 +1,12 @@
<configuration> <configuration>
<!-- Miscellaneous -->
<parameter id="misc.catchCore" type="bool" value="true"/>
<parameter id="misc.verboseLevel1" type="bool" value="true"/>
<parameter id="misc.verboseLevel2" type="bool" value="false"/>
<parameter id="misc.info" type="bool" value="false"/>
<parameter id="misc.logMode" type="bool" value="true"/>
<parameter id="misc.traceLevel" type="int" value="1000" min="0"/>
<!-- Nimbus --> <!-- Nimbus -->
<parameter id="nimbus.cellGauge" type="string" value="sxlib"/> <parameter id="nimbus.cellGauge" type="string" value="sxlib"/>
<parameter id="nimbus.routingGauge" type="string" value="sxlib"/> <parameter id="nimbus.routingGauge" type="string" value="sxlib"/>
@ -74,6 +81,16 @@
<parameter id="kite.longGlobalRipupLimit" type="int" value="5" min="1"/> <parameter id="kite.longGlobalRipupLimit" type="int" value="5" min="1"/>
<parameter id="kite.eventsLimit" type="int" value="4000000" min="1"/> <parameter id="kite.eventsLimit" type="int" value="4000000" min="1"/>
<layout> <layout>
<!-- Miscellaneous -->
<tab name="Misc.">
<widget type="title" label="Miscellaneous"/>
<widget id="misc.catchCore" label="Catch Core Dumps" column="1"/>
<widget id="misc.verboseLevel1" label="Verbose" column="0"/>
<widget id="misc.verboseLevel2" label="Very Verbose" column="0"/>
<widget id="misc.info" label="Show Info" column="0"/>
<widget id="misc.logMode" label="Output is a TTY" column="0"/>
<widget id="misc.traceLevel" label="Trace Level" column="1"/>
</tab>
<tab name="Mauka"> <tab name="Mauka">
<!-- hMETIS --> <!-- hMETIS -->
<widget type="title" label="hMETIS - Partitionner"/> <widget type="title" label="hMETIS - Partitionner"/>

View File

@ -29,9 +29,72 @@
#include <cstring> #include <cstring>
#include <iomanip> #include <iomanip>
#include <boost/program_options.hpp>
namespace boptions = boost::program_options;
#include "hurricane/Warning.h"
#include "vlsisapd/configuration/Configuration.h"
#include "crlcore/Utilities.h" #include "crlcore/Utilities.h"
namespace {
using namespace Hurricane;
using namespace CRL;
void verboseLevel1Changed ( Cfg::Parameter* p )
{
if ( p->asBool() ) mstream::enable ( mstream::Verbose1 );
else mstream::disable ( mstream::Verbose1 );
//cerr << "Verbose Level 1: " << boolalpha << p->asBool() << endl;
}
void verboseLevel2Changed ( Cfg::Parameter* p )
{
if ( p->asBool() ) mstream::enable ( mstream::Verbose2 );
else mstream::disable ( mstream::Verbose2 );
}
void infoChanged ( Cfg::Parameter* p )
{
if ( p->asBool() ) mstream::enable ( mstream::Info );
else mstream::disable ( mstream::Info );
}
void catchCoreChanged ( Cfg::Parameter* p )
{
System::setCatchCore ( p->asBool() );
}
void logModeChanged ( Cfg::Parameter* p )
{
if ( p->asBool() ) tty::enable ();
else tty::disable ();
}
void traceLevelChanged ( Cfg::Parameter* p )
{
ltracelevel ( p->asInt() );
}
std::string environmentMapper ( std::string environmentName )
{
if ( environmentName == "CORIOLIS_TOP" ) return "coriolis_top";
return "";
}
} // End of anonymous namespace.
int tty::_width = 80; int tty::_width = 80;
bool tty::_enabled = true; bool tty::_enabled = true;
unsigned int mstream::_activeMask = mstream::Verbose0; unsigned int mstream::_activeMask = mstream::Verbose0;
@ -132,41 +195,113 @@ namespace CRL {
const char* BadColorValue = "%s() :\n\n" const char* BadColorValue = "%s() :\n\n"
" Invalid color value for color \"%s\" : \"%s\".\n"; " Invalid color value for color \"%s\" : \"%s\".\n";
System* System::_singleton = System::create ();
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CRL::System". // Class : "CRL::System".
System *System::create () System* System::_singleton = System::get();
{
if ( _singleton != NULL ) {
cerr << "[WARNING] Attempt to re-create System() singleton." << endl;
return _singleton;
}
_singleton = new System ();
System::System ()
: _catchCore(true)
{
// Immediate setup to avoid some tiresome looping...
_singleton = this;
// Set the trap function for the SIGINT signal (CTRL-C). // Set the trap function for the SIGINT signal (CTRL-C).
//if ( signal(SIGINT,System::TrapSig) == SIG_ERR ) //if ( signal(SIGINT,System::TrapSig) == SIG_ERR )
// System::TrapSig ( SIGTFLT ); // System::TrapSig ( SIGTFLT );
// Set the trap function for SIGFPE, SIGBUS, SIGABRT and SIGSEGV signals. // Set the trap function for SIGFPE, SIGBUS, SIGABRT and SIGSEGV signals.
if ( ( signal(SIGFPE , System::trapSig) == SIG_ERR ) if ( ( signal(SIGFPE , System::_trapSig) == SIG_ERR )
|| ( signal(SIGBUS , System::trapSig) == SIG_ERR ) || ( signal(SIGBUS , System::_trapSig) == SIG_ERR )
|| ( signal(SIGABRT, System::trapSig) == SIG_ERR ) || ( signal(SIGABRT, System::_trapSig) == SIG_ERR )
|| ( signal(SIGPIPE, System::trapSig) == SIG_ERR ) || ( signal(SIGPIPE, System::_trapSig) == SIG_ERR )
|| ( signal(SIGSEGV, System::trapSig) == SIG_ERR ) ) || ( signal(SIGSEGV, System::_trapSig) == SIG_ERR ) )
System::trapSig ( SIGTFLT ); System::_trapSig ( SIGTFLT );
// Environment variables reading.
boptions::options_description options ("Environment Variables");
options.add_options()
( "coriolis_top", boptions::value<string>()
, "The root directory of the Coriolis installation tree." );
boptions::variables_map arguments;
boptions::store ( boptions::parse_environment(options,environmentMapper), arguments );
boptions::notify ( arguments );
bfs::path::default_name_check ( bfs::portable_posix_name );
const string strSysConfDir = SYS_CONF_DIR;
bfs::path sysConfDir ( strSysConfDir );
if ( not sysConfDir.has_root_path() ) {
if ( arguments.count("coriolis_top") ) {
sysConfDir = arguments["coriolis_top"].as<string>() / sysConfDir;
} else {
cerr << Error("Environment variable CORIOLIS_TOP not set,"
" may be unable to read configuration...") << endl;
}
}
sysConfDir /= "coriolis2";
_pathes.insert ( make_pair("etc",sysConfDir) );
// Default configuration loading.
Cfg::Configuration* conf = Cfg::Configuration::get ();
Cfg::getParamBool("misc.catchCore" ,true )->registerCb ( catchCoreChanged );
Cfg::getParamBool("misc.verboseLevel1",true )->registerCb ( verboseLevel1Changed );
Cfg::getParamBool("misc.verboseLevel2",true )->registerCb ( verboseLevel2Changed );
Cfg::getParamBool("misc.info" ,false)->registerCb ( infoChanged );
Cfg::getParamBool("misc.logMode" ,true )->registerCb ( logModeChanged );
Cfg::getParamInt ("misc.traceLevel" ,1000 )->registerCb ( traceLevelChanged );
// Immediate update from the configuration.
catchCoreChanged ( Cfg::getParamBool("misc.catchCore" ) );
verboseLevel1Changed ( Cfg::getParamBool("misc.verboseLevel1") );
verboseLevel2Changed ( Cfg::getParamBool("misc.verboseLevel2") );
infoChanged ( Cfg::getParamBool("misc.info" ) );
logModeChanged ( Cfg::getParamBool("misc.logMode" ) );
traceLevelChanged ( Cfg::getParamInt ("misc.traceLevel" ) );
bool systemConfFound = false;
bfs::path systemConfFile = sysConfDir / "tools.configuration.xml";
if ( bfs::exists(systemConfFile) ) {
systemConfFound = true;
conf->readFromFile ( systemConfFile.string() );
} else {
cerr << Warning("System configuration file:\n <%s> not found."
,systemConfFile.string().c_str()) << endl;
}
bool dotConfFound = false;
bfs::path dotConfFile = "./.coriolis2.configuration.xml";
if ( bfs::exists(dotConfFile) ) {
dotConfFound = true;
conf->readFromFile ( dotConfFile.string() );
}
// Delayed printing, as we known only now whether VerboseLevel1 is requested.
if ( cmess1.enabled() ) {
cmess1 << " o Reading Configuration. " << endl;
if (systemConfFound) cmess1 << " - <" << systemConfFile.string() << ">." << endl;
if (dotConfFound) cmess1 << " - <" << dotConfFile.string() << ">." << endl;
}
}
System *System::get ()
{
if ( _singleton == NULL ) {
_singleton = new System ();
}
return _singleton; return _singleton;
} }
void System::trapSig ( int sig ) void System::_trapSig ( int sig )
{ {
cerr << "\n\n[CRL ERROR] System::trapSig():\n" << endl; cerr << "\n\n[CRL ERROR] System::_trapSig():\n" << endl;
switch ( sig ) { switch ( sig ) {
case SIGINT: case SIGINT:
@ -193,7 +328,7 @@ namespace CRL {
cerr << "\n Please e-mail to <alliance-users@asim.lip6.fr>.\n" cerr << "\n Please e-mail to <alliance-users@asim.lip6.fr>.\n"
<< "\n program terminated "; << "\n program terminated ";
if ( getSystem()->getCatchCore() ) { if ( getCatchCore() ) {
cerr << "(core not dumped).\n"; cerr << "(core not dumped).\n";
exit ( 1 ); exit ( 1 );
} else { } else {
@ -221,7 +356,20 @@ namespace CRL {
} }
System *System::getSystem () { return _singleton; } const bfs::path& System::_getPath ( const string& key )
{
static bfs::path nullPath ("no_path");
cerr << "Looking up: " << key << endl;
map<const string,bfs::path>::const_iterator ipath = _pathes.find ( key );
if ( ipath == _pathes.end() ) return nullPath;
cerr << "Successfull lookup: "; cerr.flush();
cerr << (*ipath).second.string() << endl;
return (*ipath).second;
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------

View File

@ -33,6 +33,9 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <boost/filesystem/operations.hpp>
namespace bfs = boost::filesystem;
#include "hurricane/Commons.h" #include "hurricane/Commons.h"
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "hurricane/Slot.h" #include "hurricane/Slot.h"
@ -55,26 +58,30 @@ namespace CRL {
class System { class System {
public: public:
// Constructor & Destructor. static System* get ();
static System* create (); static inline bool getCatchCore ();
// Methods. static inline const bfs::path& getPath ( const std::string& );
static System* getSystem (); static inline bool setCatchCore ( bool catchCore );
static void trapSig ( int sig );
inline bool getCatchCore ();
inline bool setCatchCore ( bool catchCore );
private: private:
// Internal: Attributes.
static System* _singleton; static System* _singleton;
bool _catchCore; bool _catchCore;
std::map<const std::string,bfs::path> _pathes;
// Constructors & Destructors. private:
inline System (); System ();
System ( const System &other ); System ( const System &other );
System& operator= ( const System &other ); System& operator= ( const System &other );
static void _trapSig ( int sig );
inline bool _getCatchCore ();
const bfs::path& _getPath ( const std::string& );
inline bool _setCatchCore ( bool catchCore );
}; };
inline bool System::getCatchCore () { return get()->_getCatchCore(); }
inline const bfs::path& System::getPath ( const std::string& key ) { return get()->_getPath(key); }
inline bool System::setCatchCore ( bool catchCore ) { return get()->_setCatchCore(catchCore); }
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "CRL::IoFile ()". // Class : "CRL::IoFile ()".
// //
@ -123,9 +130,8 @@ namespace CRL {
// Inline Methods. // Inline Methods.
inline System::System (): _catchCore(true) { } inline bool System::_getCatchCore () { return _catchCore; }
inline bool System::getCatchCore () { return _catchCore; } inline bool System::_setCatchCore ( bool catchCore ) { return _catchCore = catchCore; }
inline bool System::setCatchCore ( bool catchCore ) { return _catchCore = catchCore; }
inline IoFile::IoFile ( string path ): _file(NULL) inline IoFile::IoFile ( string path ): _file(NULL)
, _path(path) , _path(path)
@ -273,6 +279,7 @@ inline std::string tty::bgcolor ( unsigned int mask )
static void disable ( unsigned int mask ); static void disable ( unsigned int mask );
inline mstream ( unsigned int mask, std::ostream &s ); inline mstream ( unsigned int mask, std::ostream &s );
inline unsigned int getStreamMask() const; inline unsigned int getStreamMask() const;
static inline unsigned int getActiveMask();
inline bool enabled () const; inline bool enabled () const;
// Overload for formatted outputs. // Overload for formatted outputs.
template<typename T> inline mstream& operator<< ( T& t ); template<typename T> inline mstream& operator<< ( T& t );
@ -292,6 +299,7 @@ inline std::string tty::bgcolor ( unsigned int mask )
inline mstream::mstream ( unsigned int mask, std::ostream& s ): std::ostream(s.rdbuf()) , _streamMask(mask) {} inline mstream::mstream ( unsigned int mask, std::ostream& s ): std::ostream(s.rdbuf()) , _streamMask(mask) {}
inline unsigned int mstream::getStreamMask() const { return _streamMask; } inline unsigned int mstream::getStreamMask() const { return _streamMask; }
inline unsigned int mstream::getActiveMask() { return _activeMask; }
inline bool mstream::enabled () const { return (_streamMask & _activeMask); } inline bool mstream::enabled () const { return (_streamMask & _activeMask); }
inline mstream& mstream::flush () { if (enabled()) static_cast<std::ostream*>(this)->flush(); return *this; } inline mstream& mstream::flush () { if (enabled()) static_cast<std::ostream*>(this)->flush(); return *this; }
inline mstream& mstream::operator<< ( std::ostream& (*pf)(std::ostream&) ) { if (enabled()) (*pf)(*this); return *this; } inline mstream& mstream::operator<< ( std::ostream& (*pf)(std::ostream&) ) { if (enabled()) (*pf)(*this); return *this; }
@ -377,13 +385,13 @@ class Dots {
class linefill : public std::ostream { class linefill : public std::ostream {
public: public:
inline linefill ( const std::string& header, std::ostream &s ); inline linefill ( const std::string& header, mstream &s );
// Overload for formatted outputs. // Overload for formatted outputs.
template<typename T> inline linefill& operator<< ( T& t ); template<typename T> inline linefill& operator<< ( T& t );
template<typename T> inline linefill& operator<< ( T* t ); template<typename T> inline linefill& operator<< ( T* t );
template<typename T> inline linefill& operator<< ( const T& t ); template<typename T> inline linefill& operator<< ( const T& t );
template<typename T> inline linefill& operator<< ( const T* t ); template<typename T> inline linefill& operator<< ( const T* t );
inline std::ostream& base (); inline mstream& base ();
inline void _print ( const std::string& field ); inline void _print ( const std::string& field );
inline linefill& flush (); inline linefill& flush ();
inline linefill& reset (); inline linefill& reset ();
@ -392,17 +400,19 @@ class linefill : public std::ostream {
// Internal: Attributes. // Internal: Attributes.
private: private:
mstream& _base;
std::string _header; std::string _header;
size_t _width; size_t _width;
size_t _lines; size_t _lines;
}; };
inline linefill::linefill ( const std::string& header, std::ostream& s ): std::ostream(s.rdbuf()) , _header(header), _width(0), _lines(0) {} inline linefill::linefill ( const std::string& header, mstream& s ): std::ostream(s.rdbuf()), _base(s), _header(header), _width(0), _lines(0) {}
inline std::ostream& linefill::base () { return (*static_cast<std::ostream*>(this)); } //inline std::ostream& linefill::base () { return (*static_cast<std::ostream*>(this)); }
inline linefill& linefill::reset () { (*this) << std::endl; _width=0; return *this; } inline mstream& linefill::base () { return _base; }
inline linefill& linefill::flush () { static_cast<std::ostream*>(this)->flush(); return *this; } inline linefill& linefill::reset () { _base << std::endl; _width=0; return *this; }
inline linefill& linefill::operator<< ( std::ostream& (*pf)(std::ostream&) ) { (*pf)(*this); return *this; } inline linefill& linefill::flush () { static_cast<mstream&>(_base).flush(); return *this; }
inline linefill& linefill::operator<< ( std::ostream& (*pf)(std::ostream&) ) { (*pf)(static_cast<mstream&>(_base)); return *this; }
inline void linefill::_print ( const std::string& field ) { inline void linefill::_print ( const std::string& field ) {
size_t fieldWidth = field.length(); size_t fieldWidth = field.length();

View File

@ -128,7 +128,7 @@ int main ( int argc, char *argv[] )
exit ( 0 ); exit ( 0 );
} }
System::getSystem()->setCatchCore ( not coreDump ); System::get()->setCatchCore ( not coreDump );
if ( verbose1 ) mstream::enable ( mstream::VerboseLevel1 ); if ( verbose1 ) mstream::enable ( mstream::VerboseLevel1 );
if ( verbose2 ) mstream::enable ( mstream::VerboseLevel2 ); if ( verbose2 ) mstream::enable ( mstream::VerboseLevel2 );

View File

@ -45,7 +45,7 @@ int main(int argc, char *argv[]) {
exit ( 0 ); exit ( 0 );
} }
System::getSystem()->setCatchCore ( not coreDump ); System::get()->setCatchCore ( not coreDump );
if ( verbose1 ) mstream::enable ( mstream::VerboseLevel1 ); if ( verbose1 ) mstream::enable ( mstream::VerboseLevel1 );
if ( verbose2 ) mstream::enable ( mstream::VerboseLevel2 ); if ( verbose2 ) mstream::enable ( mstream::VerboseLevel2 );