Main Page | Modules | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

sender.h

Go to the documentation of this file.
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

Generated on Mon Sep 26 14:20:12 2005 for Fiasco by  doxygen 1.4.2