00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00049 #ifndef TOPPERS_MAILBOX_HPP_
00050 #define TOPPERS_MAILBOX_HPP_
00051
00052 #include <toppers/object.hpp>
00053
00054 namespace toppers
00055 {
00056
00065 template <ID Id = 0,
00066 class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00067 class Stub = TOPPERS_DEFAULT_STUB >
00068 class mailbox : Diagnostics
00069 {
00070 typedef object_controller<Id, obj_mailbox, Stub> controller;
00071 object_id<Id> objid_;
00072
00073 public:
00075 typedef t_cmbx creation;
00077 typedef t_rmbx reference;
00078
00081
00083 mailbox() {}
00085 explicit mailbox(ID id) : objid_(id) {}
00086
00088 template <ID Id2, class Diagnostics2, class Stub2>
00089 mailbox(const mailbox<Id2, Diagnostics2, Stub2>& other)
00090 : objid_(get_unsafe_id(other))
00091 {
00092 TOPPERS_STATIC_ASSERT(Id == 0);
00093 }
00094
00096
00099
00100
00101 ER create(creation* pk_cobj)
00102 {
00103 ER ercd = controller::create(objid_, pk_cobj);
00104 return handle_error(ercd);
00105 }
00107 ER create(const creation* pk_cobj)
00108 {
00109 ER ercd = controller::create(objid_, pk_cobj);
00110 return handle_error(ercd);
00111 }
00113 ER create(ATR mbxatr = TA_TFIFO | TA_MFIFO, PRI maxmpri = TMAX_MPRI, VP mprihd = 0)
00114 {
00115 creation packet;
00116 packet.mbxatr = mbxatr;
00117 packet.maxmpri = maxmpri;
00118 packet.mprihd = mprihd;
00119 return create(&packet);
00120 }
00122 ER destroy()
00123 {
00124 ER ercd = controller::destroy(objid_);
00125 return handle_error(ercd);
00126 }
00127
00129
00132
00134 ER refer(reference* pk_robj) const
00135 {
00136 ER ercd = controller::refer(objid_, pk_robj);
00137 return handle_error(ercd);
00138 }
00139
00141
00144
00146 ER send(t_msg* pk_msg) const
00147 {
00148 ER ercd = Stub::stub_snd_mbx(objid_.id(), pk_msg);
00149 return handle_error(ercd);
00150 }
00151
00153 ER receive(t_msg** ppk_msg, forever_tag = forever) const
00154 {
00155 ER ercd = Stub::stub_rcv_mbx(objid_.id(), ppk_msg);
00156 return handle_error(ercd);
00157 }
00159 ER receive(t_msg** ppk_msg, polling_tag) const
00160 {
00161 ER ercd = Stub::stub_prcv_mbx(objid_.id(), ppk_msg);
00162 return handle_error(ercd);
00163 }
00165 ER receive(t_msg** ppk_msg, TMO tmout) const
00166 {
00167 ER ercd = Stub::stub_trcv_mbx(objid_.id(), ppk_msg, tmout);
00168 return handle_error(ercd);
00169 }
00170
00172
00174 friend ID get_unsafe_id(const mailbox<Id, Diagnostics, Stub>& obj)
00175 {
00176 return obj.objid_.id();
00177 }
00178 };
00179
00180 }
00181
00182 #endif // ! TOPPERS_MAILBOX_HPP_