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_DATAQUEUE_HPP_
00050 #define TOPPERS_DATAQUEUE_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 dataqueue : Diagnostics
00069 {
00070 typedef object_controller<Id, obj_dataqueue, Stub> controller;
00071 object_id<Id> objid_;
00072
00073 public:
00075 typedef t_cdtq creation;
00077 typedef t_rdtq reference;
00078
00081
00083 dataqueue() {}
00085 explicit dataqueue(ID id) : objid_(id) {}
00086
00088 template <ID Id2, class Diagnostics2, class Stub2>
00089 dataqueue(const dataqueue<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 dtqatr = TA_TFIFO, UINT dtqcnt = 0, VP dtq = 0)
00114 {
00115 creation packet;
00116 packet.dtqatr;
00117 packet.dtqcnt;
00118 packet.dtq;
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(VP_INT data, forever_tag = forever, task_context_tag = task_context) const
00147 {
00148 ER ercd = Stub::stub_snd_dtq(objid_.id(), data);
00149 return handle_error(ercd);
00150 }
00152 ER send(VP_INT data, polling_tag, task_context_tag = task_context) const
00153 {
00154 ER ercd = Stub::stub_psnd_dtq(objid_.id(), data);
00155 return handle_error(ercd);
00156 }
00158 ER send(VP_INT data, TMO tmout, task_context_tag = task_context) const
00159 {
00160 ER ercd = Stub::stub_tsnd_dtq(objid_.id(), data, tmout);
00161 return handle_error(ercd);
00162 }
00164 ER send(VP_INT data, forced_tag, task_context_tag = task_context) const
00165 {
00166 ER ercd = Stub::stub_fsnd_dtq(objid_.id(), data);
00167 return handle_error(ercd);
00168 }
00170 ER send(VP_INT data, polling_tag, non_task_context_tag) const
00171 {
00172 ER ercd = Stub::stub_ipsnd_dtq(objid_.id(), data);
00173 return handle_error(ercd);
00174 }
00176 ER send(VP_INT data, forced_tag, non_task_context_tag) const
00177 {
00178 ER ercd = Stub::stub_ifsnd_dtq(objid_.id(), data);
00179 return handle_error(ercd);
00180 }
00182 ER send(VP_INT data, polling_tag, context_independent_tag) const
00183 {
00184 ER ercd;
00185 if (Stub::stub_sns_ctx())
00186 ercd = Stub::stub_ipsnd_dtq(objid_.id(), data);
00187 else
00188 ercd = Stub::stub_psnd_dtq(objid_.id(), data);
00189 return handle_error(ercd);
00190 }
00192 ER send(VP_INT data, forced_tag, context_independent_tag) const
00193 {
00194 ER ercd;
00195 if (Stub::stub_sns_ctx())
00196 ercd = Stub::stub_ifsnd_dtq(objid_.id(), data);
00197 else
00198 ercd = Stub::stub_fsnd_dtq(objid_.id(), data);
00199 return handle_error(ercd);
00200 }
00201
00203 ER receive(VP_INT* p_data, forever_tag = forever) const
00204 {
00205 ER ercd = Stub::stub_rcv_dtq(objid_.id(), p_data);
00206 return handle_error(ercd);
00207 }
00209 ER receive(VP_INT* p_data, polling_tag) const
00210 {
00211 ER ercd = Stub::stub_prcv_dtq(objid_.id(), p_data);
00212 return handle_error(ercd);
00213 }
00215 ER receive(VP_INT* p_data, TMO tmout) const
00216 {
00217 ER ercd = Stub::stub_trcv_dtq(objid_.id(), p_data, tmout);
00218 return handle_error(ercd);
00219 }
00220
00222
00224 friend ID get_unsafe_id(const dataqueue<Id, Diagnostics, Stub>& obj)
00225 {
00226 return obj.objid_.id();
00227 }
00228 };
00229
00230 }
00231
00232 #endif // ! TOPPERS_DATAQUEUE_HPP_