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
|