メインページ | モジュール | 名前空間一覧 | クラス階層 | 構成 | ファイル一覧 | 名前空間メンバ | 構成メンバ | ファイルメンバ | 関連ページ

toppers/semaphore.hpp

解説を見る。
00001 /*
00002  *  TOPPERS/C++ API Template Library
00003  *      Toyohashi Open Platform for Embedded Real-Time Systems/
00004  *      C++ API Template Library
00005  *
00006  *  Copyright (C) 2004 by TAKAGI Nobuhisa
00007  *
00008  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
00009  *  によって公表されている GNU General Public License の Version 2 に記
00010  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
00011  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
00012  *  利用と呼ぶ)することを無償で許諾する.
00013  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
00014  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
00015  *      スコード中に含まれていること.
00016  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
00017  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
00018  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
00019  *      の無保証規定を掲載すること.
00020  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
00021  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
00022  *      と.
00023  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
00024  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
00025  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
00026  *        報告すること.
00027  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
00028  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
00029  *
00030  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
00031  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
00032  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
00033  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
00034  *
00035  *  @(#) $Id: semaphore.hpp,v 1.1.1.1 2004/04/14 09:30:30 takagi-n Exp $
00036  */
00037 
00049 #ifndef TOPPERS_SEMAPHORE_HPP_
00050 #define TOPPERS_SEMAPHORE_HPP_
00051 
00052 #include <toppers/object.hpp>
00053 
00054 namespace toppers
00055 {
00056 
00069     template <ID Id = 0,
00070               class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00071               class Stub = TOPPERS_DEFAULT_STUB >
00072     class semaphore : Diagnostics
00073     {
00074         typedef object_controller<Id, obj_semaphore, Stub> controller;
00075         object_id<Id> objid_;
00076 
00077     public:
00079         typedef t_csem creation;
00081         typedef t_rsem reference;
00082 
00085 
00087         semaphore() {}
00089         explicit semaphore(ID id) : objid_(id) {}
00090 
00092         template <ID Id2, class Diagnostics2, class Stub2>
00093         semaphore(const semaphore<Id2, Diagnostics2, Stub2>& other)
00094             : objid_(get_unsafe_id(other))
00095         {
00096             TOPPERS_STATIC_ASSERT(Id == 0);
00097         }
00098 
00100 
00103 
00104         //  互換性のための多重定義
00105         ER create(creation* pk_cobj)
00106         {
00107             ER ercd = controller::create(objid_, pk_cobj);
00108             return handle_error(ercd);
00109         }
00111         ER create(const creation* pk_cobj)
00112         {
00113             ER ercd = controller::create(objid_, pk_cobj);
00114             return handle_error(ercd);
00115         }
00117         ER create(ATR sematr = TA_TFIFO, UINT isemcnt = 1, UINT maxsem = 1)
00118         {
00119             creation packet;
00120             packet.sematr  = sematr;
00121             packet.isemcnt = isemcnt;
00122             packet.maxsem  = maxsem;
00123             return create(&packet);
00124         }
00126         ER destroy()
00127         {
00128             ER ercd = controller::destroy(objid_);
00129             return handle_error(ercd);
00130         }
00131 
00133 
00136 
00138         ER refer(reference* pk_robj) const
00139         {
00140             ER ercd = controller::refer(objid_, pk_robj);
00141             return handle_error(ercd);
00142         }
00143 
00145 
00148 
00150         ER signal(task_context_tag = task_context) const
00151         {
00152             ER ercd = Stub::stub_sig_sem(objid_.id());
00153             return handle_error(ercd);
00154         }
00156         ER signal(non_task_context_tag) const
00157         {
00158             ER ercd = Stub::stub_isig_sem(objid_.id());
00159             return handle_error(ercd);
00160         }
00162         ER signal(context_independent_tag) const
00163         {
00164             ER ercd;
00165             if (Stub::stub_sns_ctx())
00166                 ercd = Stub::stub_isig_sem(objid_.id());
00167             else
00168                 ercd = Stub::stub_sig_sem(objid_.id());
00169             return handle_error(ercd);
00170         }
00171 
00173         ER wait(forever_tag = forever) const
00174         {
00175             ER ercd = Stub::stub_wai_sem(objid_.id());
00176             return handle_error(ercd);
00177         }
00179         ER wait(polling_tag) const
00180         {
00181             ER ercd = Stub::stub_pol_sem(objid_.id());
00182             return handle_error(ercd);
00183         }
00185         ER wait(TMO tmout) const
00186         {
00187             ER ercd = Stub::stub_twai_sem(objid_.id(), tmout);
00188             return handle_error(ercd);
00189         }
00190 
00192 
00194         friend ID get_unsafe_id(const semaphore<Id, Diagnostics, Stub>& obj)
00195         {
00196             return obj.objid_.id();
00197         }
00198     };
00199 
00200     namespace detail
00201     {
00202 
00203         template <bool SenseKernel, class LockObj> class lock_helper;
00204 
00205         template <bool SenseKernel, ID Id, class Diagnostics, class Stub>
00206         class lock_helper<SenseKernel, semaphore<Id, Diagnostics, Stub> >
00207         {
00208         public:
00209             typedef semaphore<Id, Diagnostics, Stub> sync_type;
00210 
00211             static ER lock(const sync_type& sync)
00212             {
00213                 return sense_kernel<SenseKernel>() ? E_OK : sync.wait();
00214             }
00215             static ER unlock(const sync_type& sync)
00216             {
00217                 return sense_kernel<SenseKernel>() ? E_OK : sync.signal();
00218             }
00219         };
00220 
00221     }
00222 
00223 }
00224 
00225 #endif  // ! TOPPERS_SEMAPHORE_HPP_