00001 // AUTOMATICALLY GENERATED -- DO NOT EDIT! -*- c++ -*- 00002 00003 #ifndef sender_h 00004 #define sender_h 00005 00006 #include "l4_types.h" 00007 00008 // 00009 // INTERFACE definition follows 00010 // 00011 00012 00013 class Receiver; 00014 00017 class Sender 00018 { 00019 public: 00023 virtual void ipc_receiver_ready() = 0; 00024 00025 protected: 00026 Receiver * _receiver; 00027 00028 private: 00029 Global_id _id; 00030 Sender *sender_next, *sender_prev; 00031 00032 friend class Jdb; 00033 friend class Jdb_thread_list; 00034 00035 public: 00039 inline Global_id id() const; 00040 00044 inline Receiver * receiver() const; 00045 00046 // 00047 // queueing functions 00048 // 00049 00054 inline bool in_sender_list(); 00055 00059 inline void sender_dequeue(Sender **r); 00060 00061 protected: 00062 // 00063 // state requests/manipulation 00064 // 00065 00074 explicit inline Sender(const Global_id& id, int /*ignored*/); 00075 00079 inline void set_receiver(Receiver* receiver); 00080 00084 inline void sender_enqueue(Sender **r); 00085 00089 inline Sender(const Global_id& id); 00090 }; 00091 00092 // 00093 // IMPLEMENTATION includes follow (for use by inline functions) 00094 // 00095 00096 00097 #include <cassert> 00098 00099 #include "cpu_lock.h" 00100 #include "lock_guard.h" 00101 00102 // 00103 // IMPLEMENTATION of inline functions (and needed classes) 00104 // 00105 00106 00107 00112 inline Global_id 00113 Sender::id() const 00114 { 00115 return _id; 00116 } 00117 00118 00123 inline Receiver * 00124 Sender::receiver() const 00125 { 00126 return _receiver; 00127 } 00128 00129 00130 // 00131 // queueing functions 00132 // 00133 00139 inline bool 00140 Sender::in_sender_list() 00141 { 00142 return sender_next; 00143 } 00144 00145 00150 inline void 00151 Sender::sender_dequeue(Sender **r) 00152 { 00153 Lock_guard<Cpu_lock> guard (&cpu_lock); 00154 00155 if (in_sender_list()) 00156 { 00157 if (sender_next == this) // are we alone in the list? 00158 { 00159 assert(*r == this); 00160 00161 *r = 0; 00162 } 00163 else 00164 { 00165 if (*r == this) // are we first in the list? 00166 *r = sender_next; 00167 00168 sender_prev->sender_next = sender_next; 00169 sender_next->sender_prev = sender_prev; 00170 } 00171 00172 sender_next = 0; 00173 } 00174 } 00175 00176 00177 // 00178 // state requests/manipulation 00179 // 00180 00189 inline Sender::Sender(const Global_id& id, int /*ignored*/) 00190 : _receiver (0), 00191 _id (id) 00192 {} 00193 00194 00199 inline void 00200 Sender::set_receiver(Receiver* receiver) 00201 { 00202 _receiver = receiver; 00203 } 00204 00205 00210 inline void 00211 Sender::sender_enqueue(Sender **r) 00212 { 00213 Lock_guard<Cpu_lock> guard (&cpu_lock); 00214 00215 if (! in_sender_list()) 00216 { 00217 if (*r) 00218 { 00219 sender_next = *r; 00220 sender_prev = sender_next->sender_prev; 00221 sender_prev->sender_next = this; 00222 sender_next->sender_prev = this; 00223 } 00224 else 00225 { 00226 *r = sender_prev = sender_next = this; 00227 } 00228 } 00229 } 00230 00231 00236 inline Sender::Sender(const Global_id& id) 00237 : _id (id), sender_next (0) 00238 {} 00239 00240 #endif // sender_h