(file) Return to MessageQueue.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 mike  1.4 //%/////////////////////////////////////////////////////////////////////////////
  2           //
  3           // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM
  4           //
  5           // Permission is hereby granted, free of charge, to any person obtaining a copy
  6           // of this software and associated documentation files (the "Software"), to 
  7           // deal in the Software without restriction, including without limitation the 
  8           // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
  9           // sell copies of the Software, and to permit persons to whom the Software is
 10           // furnished to do so, subject to the following conditions:
 11           // 
 12           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN 
 13           // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 14           // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 15           // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 16           // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 17           // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
 18           // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 19           // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 20           //
 21           //==============================================================================
 22 mike  1.4 //
 23           // Author: Mike Brasher (mbrasher@bmc.com)
 24           //
 25           // Modified By:
 26           //
 27           //%/////////////////////////////////////////////////////////////////////////////
 28           
 29 mike  1.5 #include <Pegasus/Common/HashTable.h>
 30 mike  1.4 #include "MessageQueue.h"
 31           
 32           PEGASUS_USING_STD;
 33           
 34           PEGASUS_NAMESPACE_BEGIN
 35           
 36 mike  1.5 typedef HashTable<Uint32, MessageQueue*, EqualFunc<Uint32>, HashFunc<Uint32> >
 37               QueueTable;
 38           
 39           static QueueTable _queueTable(128);
 40           
 41           static Uint32 _GetNextQueueId()
 42           {
 43               static Uint32 _queueId = 1;
 44           
 45               // Handle wrap-around!
 46           
 47               if (_queueId == 0)
 48           	_queueId++;
 49               
 50               return _queueId++;
 51           }
 52           
 53           MessageQueue::MessageQueue() : _count(0), _front(0), _back(0)
 54           {
 55               // ATTN-A: thread safety!
 56           
 57 mday  1.6.2.3    memset(_name, 0x00, 16);
 58 mike  1.5         while (!_queueTable.insert(_queueId = _GetNextQueueId(), this))
 59               	;
 60               }
 61               
 62 mday  1.6.2.3 MessageQueue::MessageQueue(char *name) : _count(0), _front(0), _back(0)
 63               {
 64                  if(name != NULL)
 65                  {
 66                     strncpy(_name, name, 15);
 67                     _name[15] = 0x00;
 68                  }
 69                  
 70                  else
 71                     memset(_name, 0x00,16);
 72                   while (!_queueTable.insert(_queueId = _GetNextQueueId(), this))
 73                      ;
 74               }
 75               
 76               
 77 mike  1.5     MessageQueue::~MessageQueue()
 78               {
 79                   // ATTN-A: thread safety!
 80               
 81                   _queueTable.remove(_queueId);
 82               }
 83               
 84 mike  1.4     void MessageQueue::enqueue(Message* message)
 85               {
 86                   if (!message)
 87               	throw NullPointer();
 88               
 89 mike  1.6.2.1     if (getenv("PEGASUS_TRACE"))
 90                   {
 91 mike  1.6.2.2 	cout << "===== " << getQueueName() << ": ";
 92 mike  1.6.2.1 	message->print(cout);
 93                   }
 94               
 95 mike  1.4         if (_back)
 96                   {
 97               	_back->_next = message;
 98               	message->_prev = _back;
 99               	message->_next = 0;
100               	_back = message;
101                   }
102                   else
103                   {
104               	_front = message;
105               	_back = message;
106               	message->_prev = 0;
107               	message->_next = 0;
108                   }
109                   message->_owner = this;
110                   _count++;
111 mike  1.6     
112                   handleEnqueue();
113 mike  1.4     }
114               
115               Message* MessageQueue::dequeue()
116               {
117                   if (_front)
118                   {
119               	Message* message = _front;
120               	_front = _front->_next;
121               	if (_front)
122               	    _front->_prev = 0;
123               
124               	if (_back == message)
125               	    _back = 0;
126               	
127               	message->_next = 0;
128               	message->_prev = 0;
129               	message->_owner = 0;
130               	_count--;
131 mike  1.6.2.1 
132 mike  1.4     	return message;
133                   }
134                   return 0;
135               }
136               
137               void MessageQueue::remove(Message* message)
138               {
139                   if (!message)
140               	throw NullPointer();
141               
142                   if (message->_owner != this)
143               	throw NoSuchMessageOnQueue();
144               
145                   if (message->_next)
146               	message->_next->_prev = message->_prev;
147                   else
148               	_back = message->_prev;
149               
150                   if (message->_prev)
151               	message->_prev->_next = message->_next;
152                   else
153 mike  1.4     	_front = message->_next;
154               
155                   message->_prev = 0;
156                   message->_next = 0;
157                   message->_owner = 0;
158                   _count--;
159               }
160               
161               Message* MessageQueue::findByType(Uint32 type)
162               {
163                   for (Message* m = front(); m; m = m->getNext())
164                   {
165               	if (m->getType() == type)
166               	    return m;
167                   }
168               
169                   return 0;
170               }
171               
172               Message* MessageQueue::findByKey(Uint32 key)
173               {
174 mike  1.4         for (Message* m = front(); m; m = m->getNext())
175                   {
176               	if (m->getKey() == key)
177               	    return m;
178                   }
179               
180                   return 0;
181               }
182               
183               void MessageQueue::print(ostream& os) const
184               {
185                   for (const Message* m = front(); m; m = m->getNext())
186               	m->print(os);
187               }
188               
189               Message* MessageQueue::find(Uint32 type, Uint32 key)
190               {
191                   for (Message* m = front(); m; m = m->getNext())
192                   {
193               	if (m->getType() == type && m->getKey() == key)
194               	    return m;
195 mike  1.4         }
196               
197 mike  1.5         return 0;
198               }
199               
200               void MessageQueue::lock()
201               {
202               
203               }
204               
205               void MessageQueue::unlock()
206               {
207               
208 mike  1.6.2.1 }
209               
210               const char* MessageQueue::getQueueName() const
211               {
212 mday  1.6.2.3    if(_name[0] != 0x00)
213                     return _name;
214                  return "unknown";
215 mike  1.5     }
216               
217               MessageQueue* MessageQueue::lookup(Uint32 queueId)
218               {
219                   MessageQueue* queue = 0;
220               
221                   if (_queueTable.lookup(queueId, queue))
222               	return queue;
223               
224                   // Not found!
225 mike  1.4         return 0;
226 mike  1.6     }
227 mday  1.6.2.3 
228               
229               MessageQueue* MessageQueue::lookup(const char *name)
230               {
231                  if(name == NULL)
232                     throw NullPointer();
233                  for(QueueTable::Iterator i = _queueTable.start(); i; i++)
234                  {
235                     if(! strncmp( ((MessageQueue *)i.value())->_name, name, 16) )
236               	 return( (MessageQueue *)i.value());
237                  }
238                  return 0;
239               }
240               
241 mike  1.6     
242               void MessageQueue::handleEnqueue()
243               {
244               
245 mike  1.4     }
246               
247               PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2