(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 mike  1.5     while (!_queueTable.insert(_queueId = _GetNextQueueId(), this))
 58           	;
 59           }
 60           
 61           MessageQueue::~MessageQueue()
 62           {
 63               // ATTN-A: thread safety!
 64           
 65               _queueTable.remove(_queueId);
 66           }
 67           
 68 mike  1.4 void MessageQueue::enqueue(Message* message)
 69           {
 70               if (!message)
 71           	throw NullPointer();
 72           
 73               if (_back)
 74               {
 75           	_back->_next = message;
 76           	message->_prev = _back;
 77           	message->_next = 0;
 78           	_back = message;
 79               }
 80               else
 81               {
 82           	_front = message;
 83           	_back = message;
 84           	message->_prev = 0;
 85           	message->_next = 0;
 86               }
 87               message->_owner = this;
 88               _count++;
 89 mike  1.4 }
 90           
 91           Message* MessageQueue::dequeue()
 92           {
 93               if (_front)
 94               {
 95           	Message* message = _front;
 96           	_front = _front->_next;
 97           	if (_front)
 98           	    _front->_prev = 0;
 99           
100           	if (_back == message)
101           	    _back = 0;
102           	
103           	message->_next = 0;
104           	message->_prev = 0;
105           	message->_owner = 0;
106           	_count--;
107           	return message;
108               }
109               return 0;
110 mike  1.4 }
111           
112           void MessageQueue::remove(Message* message)
113           {
114               if (!message)
115           	throw NullPointer();
116           
117               if (message->_owner != this)
118           	throw NoSuchMessageOnQueue();
119           
120               if (message->_next)
121           	message->_next->_prev = message->_prev;
122               else
123           	_back = message->_prev;
124           
125               if (message->_prev)
126           	message->_prev->_next = message->_next;
127               else
128           	_front = message->_next;
129           
130               message->_prev = 0;
131 mike  1.4     message->_next = 0;
132               message->_owner = 0;
133               _count--;
134           }
135           
136           Message* MessageQueue::findByType(Uint32 type)
137           {
138               for (Message* m = front(); m; m = m->getNext())
139               {
140           	if (m->getType() == type)
141           	    return m;
142               }
143           
144               return 0;
145           }
146           
147           Message* MessageQueue::findByKey(Uint32 key)
148           {
149               for (Message* m = front(); m; m = m->getNext())
150               {
151           	if (m->getKey() == key)
152 mike  1.4 	    return m;
153               }
154           
155               return 0;
156           }
157           
158           void MessageQueue::print(ostream& os) const
159           {
160               for (const Message* m = front(); m; m = m->getNext())
161           	m->print(os);
162           }
163           
164           Message* MessageQueue::find(Uint32 type, Uint32 key)
165           {
166               for (Message* m = front(); m; m = m->getNext())
167               {
168           	if (m->getType() == type && m->getKey() == key)
169           	    return m;
170               }
171           
172 mike  1.5     return 0;
173           }
174           
175           void MessageQueue::lock()
176           {
177           
178           }
179           
180           void MessageQueue::unlock()
181           {
182           
183           }
184           
185           MessageQueue* MessageQueue::lookup(Uint32 queueId)
186           {
187               MessageQueue* queue = 0;
188           
189               if (_queueTable.lookup(queueId, queue))
190           	return queue;
191           
192               // Not found!
193 mike  1.4     return 0;
194           }
195           
196           PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2