1 karl 1.47 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.4 //
|
3 karl 1.39 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.36 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.39 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.40 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.47 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.4 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 chip 1.8 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.4 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.47 //
|
21 chip 1.8 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.4 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 chip 1.8 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.4 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
|
34 mike 1.5 #include <Pegasus/Common/HashTable.h>
|
35 kumpf 1.19 #include <Pegasus/Common/Tracer.h>
|
36 kumpf 1.51 #include <Pegasus/Common/CimomMessage.h>
|
37 mike 1.4 #include "MessageQueue.h"
|
38 mike 1.48 #include "IDFactory.h"
39
|
40 mike 1.4 PEGASUS_USING_STD;
41
42 PEGASUS_NAMESPACE_BEGIN
43
|
44 mike 1.5 typedef HashTable<Uint32, MessageQueue*, EqualFunc<Uint32>, HashFunc<Uint32> >
45 QueueTable;
46
|
47 mday 1.33 static QueueTable _queueTable(256);
|
48 mday 1.28 static Mutex q_table_mut ;
|
49 mike 1.5
|
50 mike 1.48 static IDFactory _qidFactory(CIMOM_Q_ID + 1);
|
51 mday 1.35
|
52 david.dillard 1.43 Uint32 MessageQueue::getNextQueueId()
|
53 mike 1.5 {
|
54 mike 1.48 return _qidFactory.getID();
|
55 aruran.ms 1.46 }
|
56 chip 1.8
|
57 aruran.ms 1.46 void MessageQueue::putQueueId(Uint32 queueId)
58 {
|
59 mike 1.48 if (queueId != CIMOM_Q_ID)
|
60 kumpf 1.54 _qidFactory.putID(queueId);
|
61 aruran.ms 1.46 }
|
62 mday 1.24
|
63 mike 1.16 MessageQueue::MessageQueue(
|
64 david.dillard 1.43 const char* name,
|
65 mike 1.16 Boolean async,
66 Uint32 queueId)
|
67 kumpf 1.52 : _queueId(queueId), _capabilities(0), _async(async)
|
68 mike 1.5 {
|
69 mike 1.16 //
70 // Copy the name:
71 //
72
|
73 david.dillard 1.43 PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::MessageQueue()");
|
74 kumpf 1.19
|
75 mike 1.16 if (!name)
|
76 david.dillard 1.43 name = "";
|
77 mike 1.16
78 _name = new char[strlen(name) + 1];
79 strcpy(_name, name);
80
|
81 kumpf 1.25 Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
|
82 kumpf 1.42 "MessageQueue::MessageQueue name = %s, queueId = %u", name, queueId);
|
83 kumpf 1.19
|
84 mike 1.16 //
85 // Insert into queue table:
86 //
|
87 a.arora 1.38 AutoMutex autoMut(q_table_mut);
|
88 david.dillard 1.43 while (!_queueTable.insert(_queueId, this))
89 ;
|
90 chip 1.8
|
91 david.dillard 1.43 PEG_METHOD_EXIT();
|
92 mike 1.5 }
93
94 MessageQueue::~MessageQueue()
95 {
96 // ATTN-A: thread safety!
|
97 kumpf 1.25 PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::~MessageQueue()");
98 Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
|
99 kumpf 1.19 "MessageQueue::~MessageQueue queueId = %i, name = %s", _queueId, _name);
100
|
101 a.arora 1.38 {
|
102 david.dillard 1.43 AutoMutex autoMut(q_table_mut);
103 _queueTable.remove(_queueId);
|
104 a.arora 1.38 } // mutex unlocks here
|
105 david.dillard 1.43
|
106 mike 1.16 // Free the name:
|
107 david.dillard 1.43
|
108 mike 1.16 delete [] _name;
|
109 kumpf 1.19
|
110 aruran.ms 1.46 // Return the queue id.
111
112 putQueueId(_queueId);
|
113 joyce.j 1.41
|
114 kumpf 1.25 PEG_METHOD_EXIT();
|
115 chip 1.8 }
116
|
117 kumpf 1.37 void MessageQueue::enqueue(Message* message)
|
118 mike 1.4 {
|
119 kumpf 1.25 PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::enqueue()");
|
120 kumpf 1.19
|
121 kumpf 1.52 PEGASUS_ASSERT(message != 0);
|
122 mike 1.7
|
123 kumpf 1.54 PEG_TRACE_STRING(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
124 String("Queue name: ") + getQueueName());
125 Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
126 "Message: [%s]",
127 MessageTypeToString(message->getType()));
|
128 david.dillard 1.43
|
129 kumpf 1.52 _messageList.insert_back(message);
|
130 david.dillard 1.43
|
131 mday 1.22 handleEnqueue();
|
132 kumpf 1.25 PEG_METHOD_EXIT();
|
133 mday 1.15 }
134
|
135 david.dillard 1.43 Message* MessageQueue::dequeue()
|
136 mike 1.4 {
|
137 kumpf 1.25 PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::dequeue()");
138
|
139 kumpf 1.52 Message* message = _messageList.remove_front();
140
|
141 kumpf 1.25 PEG_METHOD_EXIT();
|
142 kumpf 1.52 return message;
|
143 mike 1.4 }
144
|
145 mike 1.7 const char* MessageQueue::getQueueName() const
|
146 mike 1.5 {
|
147 david.dillard 1.43 return _name;
|
148 mike 1.5 }
149
|
150 david.dillard 1.43 MessageQueue* MessageQueue::lookup(Uint32 queueId)
|
151 mike 1.5 {
|
152 kumpf 1.19
|
153 mike 1.5 MessageQueue* queue = 0;
|
154 a.arora 1.38 AutoMutex autoMut(q_table_mut);
|
155 chip 1.8
|
156 mike 1.5 if (_queueTable.lookup(queueId, queue))
|
157 mike 1.7 {
|
158 david.dillard 1.43 return queue;
|
159 mike 1.7 }
|
160 chip 1.8
|
161 mike 1.7 // Not found!
|
162 mike 1.5
|
163 kumpf 1.25 Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
|
164 kumpf 1.42 "MessageQueue::lookup failure queueId = %u", queueId);
|
165 kumpf 1.19
|
166 mike 1.4 return 0;
|
167 mike 1.6 }
|
168 mike 1.7
169
|
170 david.dillard 1.43 MessageQueue* MessageQueue::lookup(const char *name)
|
171 mike 1.7 {
|
172 kumpf 1.19
|
173 kumpf 1.54 if (name == NULL)
|
174 david.dillard 1.43 throw NullPointer();
|
175 chip 1.8
|
176 david.dillard 1.43 AutoMutex autoMut(q_table_mut);
|
177 kumpf 1.54 for (QueueTable::Iterator i = _queueTable.start(); i; i++)
178 {
|
179 mike 1.7 // ATTN: Need to decide how many characters to compare in queue names
|
180 kumpf 1.54 if (!strcmp(((MessageQueue *)i.value())->getQueueName(), name))
|
181 david.dillard 1.43 {
|
182 kumpf 1.54 return (MessageQueue *)i.value();
|
183 david.dillard 1.43 }
184 }
|
185 chip 1.8
|
186 david.dillard 1.43 Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3,
|
187 kumpf 1.54 "MessageQueue::lookup failure - name = %s", name);
|
188 kumpf 1.19
|
189 david.dillard 1.43 return 0;
|
190 mike 1.7 }
191
|
192 mike 1.6
193 void MessageQueue::handleEnqueue()
194 {
195
|
196 mike 1.4 }
197
198 PEGASUS_NAMESPACE_END
|