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

toppers/rendezvous.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: rendezvous.hpp,v 1.1.1.1 2004/04/14 09:30:30 takagi-n Exp $
00036  */
00037 
00050 #ifndef TOPPERS_RENDEZVOUS_HPP_
00051 #define TOPPERS_RENDEZVOUS_HPP_
00052 
00053 #include <toppers/object.hpp>
00054 
00055 namespace toppers
00056 {
00057 
00068     template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00069               class Stub = TOPPERS_DEFAULT_STUB >
00070     class rendezvous : Diagnostics
00071     {
00072         RDVNO rdvno_;
00073 
00074     public:
00076         typedef t_rrdv reference;
00077 
00079         explicit rendezvous(RDVNO rdvno = 0) : rdvno_(rdvno) {}
00080 
00082         ER refer(reference* pk_robj) const
00083         {
00084             ER ercd = Stub::stub_ref_rdv(rdvno_, pk_robj);
00085             return handle_error(ercd);
00086         }
00087 
00089         ER reply(const void* msg, UINT rmsgsz)
00090         {
00091             ER ercd = Stub::stub_rpl_rdv(rdvno_, msg, rmsgsz);
00092             if (ercd == E_OK)
00093                 rdvno_ = 0;
00094             return handle_error(ercd);
00095         }
00096 
00098         RDVNO no() const { return rdvno_; }
00100         void attach(RDVNO rdvno) { rdvno_ = rdvno; }
00101     };
00102 
00113     template <ID Id = 0,
00114               class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00115               class Stub = TOPPERS_DEFAULT_STUB >
00116     class rendezvousport : Diagnostics
00117     {
00118         typedef object_controller<Id, obj_rendezvousport, Stub> controller;
00119         object_id<Id> objid_;
00120 
00121     public:
00123         typedef t_cpor creation;
00125         typedef t_rpor reference;
00126 
00129 
00131         rendezvousport() {}
00133         explicit rendezvousport(ID id) : objid_(id) {}
00134 
00136         template <ID Id2, class Diagnostics2, class Stub2>
00137         rendezvousport(const rendezvousport<Id2, Diagnostics2, Stub2>& other)
00138             : objid_(get_unsafe_id(other))
00139         {
00140             TOPPERS_STATIC_ASSERT(Id == 0);
00141         }
00142 
00144 
00147 
00148         //  互換性のための多重定義
00149         ER create(creation* pk_cobj)
00150         {
00151             ER ercd = controller::create(objid_, pk_cobj);
00152             return handle_error(ercd);
00153         }
00155         ER create(const creation* pk_cobj)
00156         {
00157             ER ercd = controller::create(objid_, pk_cobj);
00158             return handle_error(ercd);
00159         }
00161         ER create(ATR poratr = TA_TFIFO, UINT maxcmsz = 256, UINT maxrmsz = 256)
00162         {
00163             creation packet;
00164             packet.poratr  = poratr;
00165             packet.maxcmsz = maxcmsz;
00166             packet.maxrmsz = maxrmsz;
00167             return create(&packet);
00168         }
00170         ER destroy()
00171         {
00172             ER ercd = controller::destroy(objid_);
00173             return handle_error(ercd);
00174         }
00175 
00177 
00180 
00182         ER refer(reference* pk_robj) const
00183         {
00184             ER ercd = controller::refer(objid_, pk_robj);
00185             return handle_error(ercd);
00186         }
00187 
00189 
00192 
00194         ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, forever_tag = forever) const
00195         {
00196             ER_UINT ercd = Stub::stub_cal_por(objid_.id(), calptn, msg, cmsgsz);
00197             return handle_error(ercd);
00198         }
00200         ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, TMO tmout) const
00201         {
00202             ER_UINT ercd = Stub::stub_tcal_por(objid_.id(), calptn, msg, cmsgsz, tmout);
00203             return handle_error(ercd);
00204         }
00205 
00207         template <class Diagnostics2, class Stub2>
00208         ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, forever_tag = forever) const
00209         {
00210             RDVNO rdvno;
00211             ER_UINT ercd = Stub::stub_acp_por(objid_.id(), acpptn, &rdvno, msg);
00212             rdvobj.attach(rdvno);
00213             return handle_error(ercd);
00214         }
00216         template <class Diagnostics2, class Stub2>
00217         ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, polling_tag) const
00218         {
00219             RDVNO rdvno;
00220             ER_UINT ercd = Stub::stub_pacp_por(objid_.id(), acpptn, &rdvno, msg);
00221             rdvobj.attach(rdvno);
00222             return handle_error(ercd);
00223         }
00225         template <class Diagnostics2, class Stub2>
00226         ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, TMO tmout) const
00227         {
00228             RDVNO rdvno;
00229             ER_UINT ercd = Stub::stub_tacp_por(objid_.id(), acpptn, &rdvno, msg, tmout);
00230             rdvobj.attach(rdvno);
00231             return handle_error(ercd);
00232         }
00233 
00235         template <class Diagnostics2, class Stub2>
00236         ER forward(RDVPTN calptn, const rendezvous<Diagnostics2, Stub2>& rdvobj, const void* msg, UINT cmsgsz) const
00237         {
00238             ER ercd = Stub::stub_fwd_por(objid_.id(), calptn, rdvobj.no(), msg, cmsgsz);
00239             return handle_error(ercd);
00240         }
00241 
00243 
00245         friend ID get_unsafe_id(const rendezvousport<Id, Diagnostics, Stub>& obj)
00246         {
00247             return obj.objid_.id();
00248         }
00249     private:
00250         //  誤ってポーリング指定で呼出すことを禁止する
00251         ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, polling_tag) const;
00252     };
00253 
00254 }
00255 
00256 #endif  // ! TOPPERS_RENDEZVOUS_HPP_