version 1.51, 2006/08/25 17:48:11
|
version 1.54, 2006/11/10 18:14:58
|
|
|
const char* name, | const char* name, |
Boolean async, | Boolean async, |
Uint32 queueId) | Uint32 queueId) |
: _queueId(queueId), _capabilities(0), _count(0), _front(0), _back(0), _async(async) |
: _queueId(queueId), _capabilities(0), _async(async) |
{ | { |
// | // |
// Copy the name: | // Copy the name: |
|
|
| |
delete [] _name; | delete [] _name; |
| |
while(_front) |
|
{ |
|
Message* tmp = _front; |
|
_front = _front->_next; |
|
delete tmp; |
|
} |
|
|
|
// Return the queue id. | // Return the queue id. |
| |
putQueueId(_queueId); | putQueueId(_queueId); |
|
|
{ | { |
PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::enqueue()"); | PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::enqueue()"); |
| |
if (!message) |
PEGASUS_ASSERT(message != 0); |
{ |
|
Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3, |
|
"MessageQueue::enqueue failure"); |
|
PEG_METHOD_EXIT(); |
|
throw NullPointer(); |
|
} |
|
| |
PEG_TRACE_STRING( TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3, | PEG_TRACE_STRING( TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3, |
String("Queue name: ") + getQueueName() ) ; | String("Queue name: ") + getQueueName() ) ; |
Tracer::trace ( TRC_MESSAGEQUEUESERVICE, |
Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL3, |
Tracer::LEVEL3, |
|
"Message: [%s]", | "Message: [%s]", |
MessageTypeToString(message->getType())); | MessageTypeToString(message->getType())); |
| |
{ |
_messageList.insert_back(message); |
AutoMutex autoMut(_mut); |
|
if (_back) |
|
{ |
|
_back->_next = message; |
|
message->_prev = _back; |
|
message->_next = 0; |
|
_back = message; |
|
} |
|
else |
|
{ |
|
_front = message; |
|
_back = message; |
|
message->_prev = 0; |
|
message->_next = 0; |
|
} |
|
message->_owner = this; |
|
|
|
_count++; |
|
Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL4, |
|
"MessageQueue::enqueue _queueId = %d, _count = %d", _queueId, _count); |
|
|
|
} // mutex unlocks here |
|
| |
handleEnqueue(); | handleEnqueue(); |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
{ | { |
PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::dequeue()"); | PEG_METHOD_ENTER(TRC_MESSAGEQUEUESERVICE,"MessageQueue::dequeue()"); |
| |
AutoMutex autoMut(_mut); |
Message* message = _messageList.remove_front(); |
if (_front) |
|
{ |
|
Message* message = _front; |
|
_front = _front->_next; |
|
if (_front) |
|
_front->_prev = 0; |
|
|
|
if (_back == message) |
|
_back = 0; |
|
|
|
_count--; |
|
Tracer::trace(TRC_MESSAGEQUEUESERVICE, Tracer::LEVEL4, |
|
"MessageQueue::dequeue _queueId = %d, _count = %d", |
|
_queueId, _count); |
|
|
|
message->_next = 0; |
|
message->_prev = 0; |
|
message->_owner = 0; |
|
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
return message; | return message; |
} | } |
| |
PEG_METHOD_EXIT(); |
|
return 0; |
|
} |
|
|
|
|
|
#ifdef PEGASUS_DEBUG |
|
void MessageQueue::print(ostream& os) const |
|
{ |
|
AutoMutex autoMut(const_cast<MessageQueue *>(this)->_mut); |
|
|
|
for (const Message* m = _front; m; m = m->getNext()) |
|
m->print(os); |
|
} |
|
#endif |
|
|
|
const char* MessageQueue::getQueueName() const | const char* MessageQueue::getQueueName() const |
{ | { |
return _name; | return _name; |
|
|
// ATTN: Need to decide how many characters to compare in queue names | // ATTN: Need to decide how many characters to compare in queue names |
if(! strcmp( ((MessageQueue *)i.value())->getQueueName(), name) ) | if(! strcmp( ((MessageQueue *)i.value())->getQueueName(), name) ) |
{ | { |
return( (MessageQueue *)i.value()); |
return (MessageQueue *)i.value(); |
} | } |
} | } |
| |