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

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2