クラス toppers::itron::kernel_object

カーネルオブジェクト管理クラス [詳細]

#include "toppers/itron/kernel_object.hpp"

toppers::itron::kernel_objectに対する継承グラフ

Inheritance graph
[凡例]
toppers::itron::kernel_objectのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public 型

typedef boost::shared_ptr<
kernel_cfg::initial_block
inib_ptr
typedef boost::shared_ptr<
kernel_id::id_number
idb_ptr
typedef std::map< std::string,
std::string > 
arg_type
typedef const boost::shared_ptr<
kernel_object >(* 
builder_type )(const static_api &, std::vector< boost::shared_ptr< kernel_object > > &)

Public メソッド

 kernel_object ()
 デフォルトコンストラクタ
virtual ~kernel_object ()
 デストラクタ
const inib_ptr get_inib () const
 初期化ブロック情報の取得
const idb_ptr get_idb () const
 ID番号情報の取得
const char * get_object_type () const
bool has_id () const
long id () const
 ID番号の取得
const std::string & name () const
 オブジェクト名の取得
const std::string & get (const std::string &key) const
 フィールドの参照
void set (const std::string &key, const std::string &value)
 フィールドの設定
bool analyze (const static_api &api)
 静的APIの解析
bool analyze_id (const std::string &arg)
 ID番号の解析
bool analyze_parameters (const static_api &api, const std::string &parameters)
 パラメータリストの解析
void swap (kernel_object &other) throw ()
 オブジェクトの交換

Static Public メソッド

template<class Iterator>
static bool assign_id (Iterator first, Iterator last)
 ID番号に自動割付け

Protected メソッド

virtual bool do_analyze (const static_api &api)=0
 analyze 関数の実体
virtual const inib_ptr do_get_inib () const
 初期化ブロック情報の取得
virtual const idb_ptr do_get_idb () const
 ID情報の取得
virtual const char * do_get_object_type () const =0
 カーベルオブジェクトの種類の参照
virtual bool do_has_id () const =0
virtual bool do_check_id_range (long id) const =0

Static Protected メソッド

static bool assign_id_helper (std::vector< kernel_object * >::const_iterator first, std::vector< kernel_object * >::const_iterator last)
 ID番号の割付補助関数

説明

カーネルオブジェクト管理クラス

kernel_object.hpp63 行で定義されています。


関数

bool toppers::itron::kernel_object::analyze const static_api api  )  [inline]
 

静的APIの解析

引数:
api 静的APIのパラメータ情報
戻り値:
解析に成功すれば true を返す

kernel_object.hpp111 行で定義されています。

参照先 do_analyze().

00111 { return do_analyze( api ); }

関数の呼び出しグラフ:

bool toppers::itron::kernel_object::analyze_id const std::string &  arg  ) 
 

ID番号の解析

引数:
arg 解析する引数
戻り値:
解析に成功すれば true を返す
自動割付け対応整数値パラメータを解析し、数値の場合は id_ に設定し、 識別子の場合は name_ に設定します。

kernel_object.cpp238 行で定義されています。

参照元 analyze_parameters().

00239     {
00240       using namespace boost::spirit;
00241       id_ = -1L;
00242       name_.clear();
00243       if ( parse( arg.begin(), arg.end(), c_int_parser<long>()[ assign_a( id_ ) ] ).full )
00244       {
00245         if ( !do_check_id_range( id_ ) )
00246         {
00247           return false;
00248         }
00249       }
00250       else
00251       {
00252         if ( !parse( arg.begin(), arg.end(), c99_ident_p[ assign_a( name_ ) ] ).full )
00253         {
00254           return false;
00255         }
00256       }
00257       return true;
00258     }

bool toppers::itron::kernel_object::analyze_parameters const static_api api,
const std::string &  parameters
 

パラメータリストの解析

引数:
api 静的API情報
parameters パラメータリスト情報
戻り値:
解析に成功すれば true を返す
パラメータリスト情報に基づいて静的APIの引数を解析します。 パラメータリスト情報 params は次のように、パラメータ文字列を指定します。

  // CRE_TSKの場合
  const char cre_tsk_params[] = "$tskid { #tskatr exinf task itskpri stksz stk }";

パラメータの種類に応じて、文字列の先頭に記号を付けることができます。 (μITRON 4.0仕様 2.1.11 静的APIの仕様とパラメータを参照)

  • '$': 自動割付け対応整数パラメータ
  • '': 自動割付け非対応整数パラメータ
  • '#': プリプロセッサ定数式パラメータ
  • なし: 一般定数式パラメータ

他に、':'で始まるパラメータを記述した場合、静的APIのパラメータから読み取るのでは なく、':'に続く文字列をパラメータの値として設定します。
例えば、":RID"と記述した場合、":RID"をキーとしたフィールドに"RID"を設定します。

パケットの場合は、両端の中括弧("{"および"}")も配列に含めてください。

kernel_object.cpp109 行で定義されています。

参照先 _analyze_id()toppers::itron::static_api::begin()toppers::itron::static_api::end()toppers::error()toppers::itron::static_api::line()set().

00110     {
00111       std::istringstream istr( parameters );
00112       std::vector<std::string> params;
00113       typedef std::istream_iterator<std::string> istream_iterator;
00114       std::copy( istream_iterator( istr ), istream_iterator(), std::back_inserter( params ) );
00115       static_api::const_iterator iter( api.begin() );
00116       static_api::const_iterator last( api.end() );
00117 
00118       ++iter; // API名をスキップ
00119       
00120       typedef std::vector<std::string>::const_iterator params_iterator;
00121       for ( params_iterator i( params.begin() ), t( params.end() ); i != t; ++i, ++iter )
00122       {
00123         std::string param( *i );
00124 
00125         char ch = param[0];
00126         switch ( ch )
00127         {
00128         case '{':
00129         case '}':
00130           if ( iter == last || *iter != param )
00131           {
00132             static_api::line_type line( api.line() );
00133             std::string token( ")" );
00134             if ( iter != last )
00135             {
00136               token = *iter;
00137             }
00138             error( line.file_.native_file_string(), line.line_, _( "missing `%1%\' before `%2%\'" ) % ch % token );
00139             return false;
00140           }
00141           break;
00142         case '$': // 自動割付け対応整数パラメータ
00143         case '%': // 自動割付け非対応整数パラメータ
00144           if ( iter == last || !analyze_id( *iter ) )
00145           {
00146             static_api::line_type line( api.line() );
00147             std::string token( ")" );
00148             if ( iter != last )
00149             {
00150               token = *iter;
00151             }
00152             error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % token );
00153             return false;
00154           }
00155           set( param, *iter );
00156           break;
00157         case ':':
00158           set( param, param.substr( 1 ) );
00159           break;
00160         case '#': // プリプロセッサ定数式パラメータ
00161         default:  // 一般定数式パラメータ
00162           if ( iter == last )
00163           {
00164             static_api::line_type line( api.line() );
00165             error( line.file_.native_file_string(), line.line_, _( "illegal argument `%1%'" ) % ")" );
00166             return false;
00167           }
00168           set( param, *iter );
00169           break;
00170         }
00171       }
00172       return true;
00173     }

関数の呼び出しグラフ:

template<class Iterator>
static bool toppers::itron::kernel_object::assign_id Iterator  first,
Iterator  last
[inline, static]
 

ID番号に自動割付け

引数:
first kernel_object コンテナの先頭位置
last kernel_object コンテナの終端位置+1
戻り値:
ID番号の割付けに成功すれば true を返す

kernel_object.hpp124 行で定義されています。

参照元 toppers::itron::cfg_contents::do_classify().

00125       {
00126         typedef std::vector<kernel_object*> vector_t;
00127         typedef std::map<std::string, vector_t> map_t;
00128         map_t map;
00129         for ( Iterator iter( first ); iter != last; ++iter )
00130         {
00131           std::string key( ( *iter )->get_object_type() );
00132           kernel_object* ptr = &**iter;
00133           map[key].push_back( ptr );
00134         }
00135         for ( map_t::const_iterator iter2( map.begin() ), last2( map.end() ); iter2 != last2; ++iter2 )
00136         {
00137           if ( !iter2->second.empty() && iter2->second.front()->has_id() )  // ID番号割付が必要な場合に限る
00138           {
00139             if ( !assign_id_helper( iter2->second.begin(), iter2->second.end() ) )
00140             {
00141               return false;
00142             }
00143           }
00144         }
00145         return true;
00146       }

bool toppers::itron::kernel_object::assign_id_helper std::vector< kernel_object * >::const_iterator  first,
std::vector< kernel_object * >::const_iterator  last
[static, protected]
 

ID番号の割付補助関数

引数:
first カーネルオブジェクト列の先頭位置
last カーネルオブジェクト列の終端位置+1
戻り値:
ID番号の割付けに成功すれば true を返す

kernel_object.cpp266 行で定義されています。

参照先 _toppers::error()id()set().

00267     {
00268       typedef std::vector<kernel_object*> vector_t;
00269       vector_t::size_type size = last - first;
00270       vector_t t( size, static_cast<kernel_object*>( 0 ) );
00271       std::set<std::string> set;
00272 
00273       // 1パス目で決め打ちのID番号を調べる
00274       for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
00275       {
00276         kernel_object* pobj = *iter;
00277         long id = pobj->id();
00278         if ( id > 0 )
00279         {
00280           if ( t[id-1] != 0 )
00281           {
00282             error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
00283             return false;
00284           }
00285           t[id-1] = pobj;
00286         }
00287         else
00288         {
00289           std::string id( pobj->name() );
00290           if ( !set.insert( id ).second )
00291           {
00292             error( _( "id `%1%\' of %2% is duplicated" ) % id % pobj->get_object_type() );
00293           }
00294         }
00295       }
00296       // 2パス目で空きID番号を順番に割り付ける
00297       vector_t::size_type pos = 0;
00298       for ( vector_t::const_iterator iter( first ); iter != last; ++iter )
00299       {
00300         kernel_object* pobj = *iter;
00301         long id = pobj->id();
00302         if ( id < 0 )
00303         {
00304           while ( t[pos] != 0 )
00305           {
00306             ++pos;
00307           }
00308           t[pos] = pobj;
00309           pobj->id_ = pos+1;
00310         }
00311       }
00312       return true;
00313     }

関数の呼び出しグラフ:

bool toppers::itron::kernel_object::do_analyze const static_api api  )  [protected, pure virtual]
 

analyze 関数の実体

引数:
api 解析する静的API情報
戻り値:
解析に成功すれば true を返す

toppers::itron::specified_object< Policy >で実装されています。

参照元 analyze().

const kernel_object::idb_ptr toppers::itron::kernel_object::do_get_idb  )  const [protected, virtual]
 

ID情報の取得

戻り値:
ID情報へのスマートポインタを返す

kernel_object.cpp223 行で定義されています。

参照元 get_idb().

00224     {
00225       std::auto_ptr<kernel_id::id_number> ptr( new kernel_id::id_number );
00226       ptr->set( name_, id_ );
00227       return idb_ptr( ptr.release() );
00228     }

const kernel_object::inib_ptr toppers::itron::kernel_object::do_get_inib  )  const [protected, virtual]
 

初期化ブロック情報の取得

戻り値:
初期化ブロック情報へのスマートポインタを返す

kernel_object.cpp191 行で定義されています。

参照元 get_inib().

00192     {
00193       std::auto_ptr<kernel_cfg::initial_block> ptr( new kernel_cfg::initial_block );
00194       ptr->id( id_ );
00195       if ( !name_.empty() )
00196       {
00197         ptr->set( "name", name_ );
00198         // 割り込みやCPU例外等、ID番号自動割付を行わないオブジェクトのための仮番号。
00199         // 静的APIで即値が使用されていない場合に、ID番号が負になり、初期化コードが
00200         // 正しく生成されない不具合の対策
00201         if ( id_ < 0 )
00202         {
00203           ptr->id( std::numeric_limits<long>::max() );
00204         }
00205       }
00206       else
00207       {
00208         std::ostringstream osstr;
00209         osstr << id_;
00210         ptr->set( "name", osstr.str() );
00211       }
00212       for ( arg_type::const_iterator iter( args_.begin() ), last( args_.end() ); iter != last; ++iter )
00213       {
00214         ptr->set( iter->first, iter->second );
00215       }
00216       return inib_ptr( ptr.release() );
00217     }

const char * toppers::itron::kernel_object::do_get_object_type  )  const [protected, pure virtual]
 

カーベルオブジェクトの種類の参照

戻り値:
種類を表す文字列を返す

toppers::itron::specified_object< Policy >で実装されています。

参照元 get_object_type().

bool toppers::itron::kernel_object::do_has_id  )  const [protected, pure virtual]
 

戻り値:
ID番号を使用する場合には true を返す
覚え書き:
"do has"というのは英語的には間違いですが、検索の便宜のために 敢えてこのように命名しています。

toppers::itron::specified_object< Policy >で実装されています。

参照元 has_id().

const std::string & toppers::itron::kernel_object::get const std::string &  key  )  const
 

フィールドの参照

引数:
key フィールド名
戻り値:
フィールドに設定された値を返す

kernel_object.cpp59 行で定義されています。

参照元 toppers::itron::jsp::task_policy::verify()toppers::itron::jsp::mempfix_policy::verify()toppers::itron::jsp::mailbox_policy::verify()toppers::itron::jsp::interrupt_policy::verify()toppers::itron::jsp::exception_policy::verify()toppers::itron::jsp::dataqueue_policy::verify()toppers::itron::include_policy::verify().

00060     {
00061       arg_type::const_iterator iter( args_.find( key ) );
00062       if ( iter == args_.end() )
00063       {
00064         static const std::string dummy;
00065         return dummy;
00066       }
00067       return iter->second;
00068     }

const idb_ptr toppers::itron::kernel_object::get_idb  )  const [inline]
 

ID番号情報の取得

戻り値:
ID番号情報へのスマートポインタを返す

kernel_object.hpp89 行で定義されています。

参照先 do_get_idb().

00089 { return do_get_idb(); }

関数の呼び出しグラフ:

const inib_ptr toppers::itron::kernel_object::get_inib  )  const [inline]
 

初期化ブロック情報の取得

戻り値:
初期化ブロック情報へのスマートポインタを返す

kernel_object.hpp84 行で定義されています。

参照先 do_get_inib().

00084 { return do_get_inib(); }

関数の呼び出しグラフ:

long toppers::itron::kernel_object::id  )  const [inline]
 

ID番号の取得

戻り値:
ID番号を返す

kernel_object.hpp97 行で定義されています。

参照元 assign_id_helper().

00097 { return id_; }

const std::string& toppers::itron::kernel_object::name  )  const [inline]
 

オブジェクト名の取得

戻り値:
オブジェクト名を返す

kernel_object.hpp102 行で定義されています。

00102 { return name_; }

void toppers::itron::kernel_object::set const std::string &  key,
const std::string &  value
 

フィールドの設定

引数:
key 名前
value 
key で指定した名前のフィールドを value に設定します。

kernel_object.cpp182 行で定義されています。

参照元 analyze_parameters()assign_id_helper().

00183     {
00184       args_[key] = value;
00185     }

void toppers::itron::kernel_object::swap kernel_object other  )  throw ()
 

オブジェクトの交換

引数:
other kernel_object 型またはその派生型のオブジェクト

kernel_object.cpp74 行で定義されています。

00075     {
00076       std::swap( id_, other.id_ );
00077       name_.swap( other.name_ );
00078       args_.swap( other.args_ );
00079     }


このクラスの説明は次のファイルから生成されました:
Copyright © 2006 by TAKAGI Nobuhisa.
このページは Wed Apr 12 16:32:06 2006 に Doxygen によって生成されました。