📄 component.cpp
字号:
/*
* TOPPERS/JSP Kernel
* Toyohashi Open Platform for Embedded Real-Time Systems/
* Just Standard Profile Kernel
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
*
* 忋婰挊嶌尃幰偼丆埲壓偺 (1)乣(4) 偺忦審偐丆Free Software Foundation
* 偵傛偭偰岞昞偝傟偰偄傞 GNU General Public License 偺 Version 2 偵婰
* 弎偝傟偰偄傞忦審傪枮偨偡応崌偵尷傝丆杮僜僼僩僂僃傾乮杮僜僼僩僂僃傾
* 傪夵曄偟偨傕偺傪娷傓丏埲壓摨偠乯傪巊梡丒暋惢丒夵曄丒嵞攝晍乮埲壓丆
* 棙梡偲屇傇乯偡傞偙偲傪柍彏偱嫋戻偡傞丏
* (1) 杮僜僼僩僂僃傾傪僜乕僗僐乕僪偺宍偱棙梡偡傞応崌偵偼丆忋婰偺挊嶌
* 尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕偑丆偦偺傑傑偺宍偱僜乕
* 僗僐乕僪拞偵娷傑傟偰偄傞偙偲丏
* (2) 杮僜僼僩僂僃傾傪丆儔僀僽儔儕宍幃側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒傞宍偱嵞攝晍偡傞応崌偵偼丆嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡
* 幰儅僯儏傾儖側偳乯偵丆忋婰偺挊嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰
* 偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (3) 杮僜僼僩僂僃傾傪丆婡婍偵慻傒崬傓側偳丆懠偺僜僼僩僂僃傾奐敪偵巊
* 梡偱偒側偄宍偱嵞攝晍偡傞応崌偵偼丆師偺偄偢傟偐偺忦審傪枮偨偡偙
* 偲丏
* (a) 嵞攝晍偵敽偆僪僉儏儊儞僩乮棙梡幰儅僯儏傾儖側偳乯偵丆忋婰偺挊
* 嶌尃昞帵丆偙偺棙梡忦審偍傛傃壓婰偺柍曐徹婯掕傪宖嵹偡傞偙偲丏
* (b) 嵞攝晍偺宍懺傪丆暿偵掕傔傞曽朄偵傛偭偰丆TOPPERS僾儘僕僃僋僩偵
* 曬崘偡傞偙偲丏
* (4) 杮僜僼僩僂僃傾偺棙梡偵傛傝捈愙揑傑偨偼娫愙揑偵惗偠傞偄偐側傞懝
* 奞偐傜傕丆忋婰挊嶌尃幰偍傛傃TOPPERS僾儘僕僃僋僩傪柶愑偡傞偙偲丏
*
* 杮僜僼僩僂僃傾偼丆柍曐徹偱採嫙偝傟偰偄傞傕偺偱偁傞丏忋婰挊嶌尃幰偍
* 傛傃TOPPERS僾儘僕僃僋僩偼丆杮僜僼僩僂僃傾偵娭偟偰丆偦偺揔梡壜擻惈傕
* 娷傔偰丆偄偐側傞曐徹傕峴傢側偄丏傑偨丆杮僜僼僩僂僃傾偺棙梡偵傛傝捈
* 愙揑傑偨偼娫愙揑偵惗偠偨偄偐側傞懝奞偵娭偟偰傕丆偦偺愑擟傪晧傢側偄丏
*
* @(#) $Id: component.cpp,v 1.1 2006/04/14 02:46:02 9564907 Exp $
*/
// $Header: J:\\SapporoSoft\\usb20\\S1R72V05\\Debug\\Repository/S1R72V05_Toppers/Toppers/cfg/base/component.cpp,v 1.1 2006/04/14 02:46:02 9564907 Exp $
#include "base/component.h"
#include <iostream>
using namespace std;
//僐儞億乕僱儞僩慡懱偑巊梡偱偒傞側傜true
bool Component::is_valid = true;
//僐儞億乕僱儞僩偺搊榐
bool Component::ComponentInfo::addComponent(Component * component, int order) throw()
{
bool result = false;
if(this != 0 && component != 0) {
componentList.insert(multimap<int, Component *>::value_type(order, component));
result = true;
}
return result;
}
//僐儞億乕僱儞僩偺搊榐夝彍
void Component::ComponentInfo::removeComponent(Component * component, int order) throw()
{
if(this != 0 && component != 0) {
multimap<int, Component *>::iterator scope;
scope = componentList.lower_bound(order);
while(scope != componentList.end()) {
//傕偆巜掕偝傟偨桪愭搙偼偡傋偰尒偨
if(scope->first != order)
break;
//巜掕偝傟偨僐儞億乕僱儞僩偵堦抳偟偨傜嶍彍
if(scope->second == component) {
multimap<int, Component *>::iterator target = scope;
++ scope;
componentList.erase(target);
}
else
++ scope;
}
}
}
//僐儞億乕僱儞僩偺搊榐夝彍
void Component::ComponentInfo::removeComponent(Component * component) throw()
{
if(this != 0 && component != 0) {
multimap<int, Component *>::iterator scope;
//巜掕偝傟偨僐儞億乕僱儞僩偵堦抳偡傞傕偺傪慡偰嶍彍
scope = componentList.begin();
while(scope != componentList.end()) {
if(scope->second == component) {
multimap<int, Component *>::iterator target = scope;
++ scope;
componentList.erase(target);
}
else
++ scope;
}
}
}
//僐儞億乕僱儞僩偺婲摦梫媮偺敪峴
bool Component::ComponentInfo::activateComponent(Component * component) throw()
{
bool result = false;
if(this != 0 && component != 0) {
//婲摦梫媮偺枛旜偵壛偊傞
activatedComponentList.push_back(component);
result = true;
}
return result;
}
//僆僾僔儑儞偺僷乕僗
void Component::ComponentInfo::parseOption(OptionParameter & option)
{
if(this != 0) {
multimap<int, Component *>::iterator scope;
//慡偰偺僐儞億乕僱儞僩偺parseOption傪幚峴
scope = componentList.begin();
while(scope != componentList.end()) {
DebugMessage("Component::parseOption start - %\n") << typeid(*scope->second).name();
scope->second->parseOption(option);
DebugMessage("Component::parseOption finish - %\n") << typeid(*scope->second).name();
++ scope;
}
}
}
//僐儞億乕僱儞僩偺婲摦
void Component::ComponentInfo::activateComponent(void)
{
if(this != 0) {
list<Component *>::iterator scope;
try {
//婲摦梫媮偺偁偭偨慡偰偺僐儞億乕僱儞僩傪婲摦
scope = activatedComponentList.begin();
while(scope != activatedComponentList.end()) {
DebugMessage("Component::body start - %\n") << typeid(**scope).name();
(*scope)->body();
DebugMessage("Component::body finish - %\n") << typeid(**scope).name();
++ scope;
}
//梫媮儕僗僩傪僋儕傾
activatedComponentList.clear();
}
catch(...) {
//onFatalExit梡偵丄activatedComponentList傪婲摦傪偐偗偨僐儞億乕僱儞僩偩偗偵峣傞
++ scope;
if(scope != activatedComponentList.end())
activatedComponentList.erase(scope, activatedComponentList.end());
throw;
}
}
}
//堎忢張棟僴儞僪儔偺婲摦
void Component::ComponentInfo::onFatalExit(void)
{
if(this != 0) {
Component * handler;
//婲摦梫媮偺偁偭偨慡偰偺僐儞億乕僱儞僩傪婲摦
while(!activatedComponentList.empty()) {
handler = *activatedComponentList.begin();
activatedComponentList.pop_front();
//僴儞僪儔傪婲摦
DebugMessage("Component::onFatalExit start - %\n") << typeid(*handler).name();
handler->onFatalExit();
DebugMessage("Component::onFatalExit fihish - %\n") << typeid(*handler).name();
}
//梫媮儕僗僩傪僋儕傾
activatedComponentList.clear();
}
}
/*
* Component : 僐儞億乕僱儞僩
*/
//僐儞僗僩儔僋僞
Component::Component(int order) throw() : RuntimeObject()
{
//偙偙偱弶傔偰僔儞僌儖僩儞僀儞僗僞儞僗偵傾僋僙僗偡傞偺偱丄bad_alloc偑敪惗偡傞壜擻惈偑偁傞
try {
Singleton<ComponentInfo>::getInstance()->addComponent(this, order);
}
catch(bad_alloc) {
is_valid = false;
}
}
//僨僗僩儔僋僞
Component::~Component(void) throw()
{ Singleton<ComponentInfo>::getInstance()->removeComponent(this); }
//僐儞億乕僱儞僩偺幚峴
void Component::executeComponents(int argc, char * argv [])
{
OptionParameter & option = getOptionParameter();
option.parseOption(argc, argv);
executeComponents(option);
}
//僐儞億乕僱儞僩偺幚峴
void Component::executeComponents(OptionParameter & option)
{
if(isValid()) {
_parseCommonOption(option);
try {
//僆僾僔儑儞偺僷乕僗
Singleton<ComponentInfo>::getInstance()->parseOption(option);
//慡偰偺僆僾僔儑儞偑巊梡嵪傒偱側偗傟偽僄儔乕
if(!option.validateOption()) {
CHECKPOINT("Exception_UnknownOption");
ExceptionMessage("Unknown option [%] found.","晄柧側僆僾僔儑儞偑巜掕偝傟偨 : %") << option.getInvalidOptions() << throwException;
}
else {
//僐儞億乕僱儞僩偺幚峴
Singleton<ComponentInfo>::getInstance()->activateComponent();
}
}
//椺奜偺敪惗 -> 堎忢廔椆僴儞僪儔偺婲摦
catch(...) {
bool continuation;
do {
try {
continuation = true;
Singleton<ComponentInfo>::getInstance()->onFatalExit();
continuation = false;
}
catch(Exception & e) {
CHECKPOINT("Exception_onFatalExit");
cerr << Message("[Internal error] onFatalExit threw an exception! : ","[撪晹僄儔乕] onFatalExit拞偺椺奜! : ") << e.getDetails() << '\n';
}
} while(continuation);
throw;
}
}
}
//堦斒揑側僆僾僔儑儞偺張棟
void Component::_parseCommonOption(OptionParameter & option) throw()
{
//僨僶僢僌張棟
if(option.find("debug")) {
DebugMessage::setStream(&cerr);
DebugMessage::setVerbose(true);
}
//尵岅慖戰
if(option.find("lj") || option.find("-japanese"))
Message::selectLanguage(Message::JAPANESE);
if(option.find("le") || option.find("-english"))
Message::selectLanguage(Message::ENGLISH);
//忕挿儊僢僙乕僕
if(option.find("v") || option.find("-verbose")) {
VerboseMessage::setStream(&cout);
VerboseMessage::setVerbose(true);
}
//僶僫乕昞帵
if(!getBanner().empty() && option.find("v") || option.find("-verbose") || option.find("h") || option.find("-help"))
cout << getBanner() << endl;
//僿儖僾昞帵
if(option.find("h") || option.find("-help"))
cout << '\n' << Message(
"Global option\n"
" -lj, --japanese : Use Japanese as default language\n"
" -le, --english : Use English as default language\n"
" -v, --verbose : Verbose Message\n",
"慡懱偺僆僾僔儑儞\n"
" -lj, --japanese : 擔杮岅偱昞帵偟傑偡\n"
" -le, --english : 塸岅偱昞帵偟傑偡\n"
" -v, --verbose : 忕挿儊僢僙乕僕傪弌椡偟傑偡\n");
}
//僶僫乕傾僋僙僒
void Component::setBanner(string src) throw(bad_alloc)
{
ComponentInfo * info = Singleton<ComponentInfo>::getInstance();
info->setBanner(src);
}
string Component::getBanner(void) throw(bad_alloc)
{
ComponentInfo * info = Singleton<ComponentInfo>::getInstance();
return info->getBanner();
}
/*
* 夁嫀偲偺屳姺惈偺偨傔偺僷儔儊乕僞憖嶌API
*/
/* 巜掕偝傟偨僆僾僔儑儞偺懚嵼傪妋擣偟丄昁梫偱偁傟偽偦偺僷儔儊乕僞傪庢摼偡傞 */
bool Component::findOption(const char * key1, const char * key2, std::string * element) throw()
{
OptionParameter::OptionItem item;
item = getOption(key1, key2, true);
if(item.isValid() && element != 0 && item.hasParameter())
*element = item[0];
return item.isValid();
}
/* 懚嵼妋擣 + 僠僃僢僋傪偮偗傞 */
bool Component::checkOption(const char * key1, const char * key2) throw()
{ return getOption(key1, key2, true).isValid(); }
/* 巜掕偝傟偨柤慜偺僆僾僔儑儞僷儔儊乕僞傪庢摼 */
OptionParameter::OptionItem Component::getOption(const char * key1, const char * key2, bool dirty) throw()
{
OptionParameter::OptionItem item;
if(key1 != 0)
item = getOptionParameter().get(key1, dirty);
if(key2 != 0) {
if(item.isValid())
item.mergeItem(getOptionParameter().get(string("-") + key2, dirty));
else
item = getOptionParameter().get(string("-") + key2, dirty);
}
return item;
}
/* 2偮偺僆僾僔儑儞崁栚傪儅乕僕偡傞 (曻偭偰偍偄偰傕儅乕僕偝傟傞偺偱婥偵偟側偄) */
OptionParameter::OptionItem Component::mergeOption(const char * key1, const char * key2) throw()
{ return getOption(key1, key2); }
/****************************************************** 僥僗僩僗傿乕僩 ******************************************************/
#ifdef TESTSUITE
#include "coverage_undefs.h"
namespace {
int counter = 0;
class TestComponent : public Component
{
public:
bool check_parseOption;
bool check_body;
bool check_onFatalExit;
bool activation;
bool throw_parseOption;
bool throw_body;
bool throw_onFatalExit;
int actcnt;
TestComponent(int order = GENERAL_PURPOSE) : Component(order)
{
check_parseOption = false;
check_body = false;
check_onFatalExit = false;
activation = false;
throw_parseOption = false;
throw_body = false;
throw_onFatalExit = false;
}
void parseOption(OptionParameter & option) throw(Exception)
{
actcnt = ++counter;
check_parseOption = true;
if(activation)
activateComponent();
if(throw_parseOption)
ExceptionMessage("exception","exception").throwException();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -