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_MUTEX_HPP_
00050 #define TOPPERS_MUTEX_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 mutex : Diagnostics
00073 {
00074 typedef object_controller<Id, obj_mutex, Stub> controller;
00075 object_id<Id> objid_;
00076
00077 public:
00079 typedef t_cmtx creation;
00081 typedef t_rmtx reference;
00082
00085
00087 mutex() {}
00089 explicit mutex(ID id) : objid_(id) {}
00090
00092 template <ID Id2, class Diagnostics2, class Stub2>
00093 mutex(const mutex<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 mtxatr = TA_TFIFO, PRI ceilpri = 1)
00118 {
00119 creation packet;
00120 packet.mtxatr = mtxatr;
00121 packet.ceilpri = ceilpri;
00122 return create(&packet);
00123 }
00125 ER destroy()
00126 {
00127 ER ercd = controller::destroy(objid_);
00128 return handle_error(ercd);
00129 }
00130
00132
00135
00137 ER refer(reference* pk_robj) const
00138 {
00139 ER ercd = controller::refer(objid_, pk_robj);
00140 return handle_error(ercd);
00141 }
00142
00144
00147
00149 ER lock(forever_tag = forever) const
00150 {
00151 ER ercd = Stub::stub_loc_mtx(objid_.id());
00152 return handle_error(ercd);
00153 }
00155 ER lock(polling_tag) const
00156 {
00157 ER ercd = Stub::stub_ploc_mtx(objid_.id());
00158 return handle_error(ercd);
00159 }
00161 ER lock(TMO tmout) const
00162 {
00163 ER ercd = Stub::stub_tloc_mtx(objid_.id(), tmout);
00164 return handle_error(ercd);
00165 }
00166
00168 ER unlock() const
00169 {
00170 ER ercd = Stub::stub_unl_mtx(objid_.id());
00171 return handle_error(ercd);
00172 }
00173
00175
00177 friend ID get_unsafe_id(const mutex<Id, Diagnostics, Stub>& obj)
00178 {
00179 return obj.objid_.id();
00180 }
00181 };
00182
00183 namespace detail
00184 {
00185
00186 template <bool SenseKernel, class LockObj> class lock_helper;
00187
00188 template <bool SenseKernel, ID Id, class Diagnostics, class Stub>
00189 class lock_helper<SenseKernel, mutex<Id, Diagnostics, Stub> >
00190 {
00191 public:
00192 typedef mutex<Id, Diagnostics, Stub> sync_type;
00193
00194 static ER lock(const sync_type& sync)
00195 {
00196 return sense_kernel<SenseKernel>() ? E_OK : sync.lock();
00197 }
00198 static ER unlock(const sync_type& sync)
00199 {
00200 return sense_kernel<SenseKernel>() ? E_OK : sync.unlock();
00201 }
00202 };
00203
00204 }
00205
00206 }
00207
00208 #endif // ! TOPPERS_MUTEX_HPP_