HP-RK Bugzilla 710 (Binary Compatibility broken in ResponseHandler).
authorkumpf <kumpf>
Fri, 17 Oct 2003 23:14:18 +0000 (23:14 +0000)
committerkumpf <kumpf>
Fri, 17 Oct 2003 23:14:18 +0000 (23:14 +0000)
src/Pegasus/Common/ResponseHandler.cpp
src/Pegasus/Common/ResponseHandler.h

index 9477b506a0b356a3a63c9b6370c8c5a05a2f6a88..34d0cca2c0bd6968a877831474462b2955d3bbc1 100644 (file)
 //
 // Author: Chip Vincent (cvincent@us.ibm.com)
 //
-// Modified By:
+// Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
 //
 //%/////////////////////////////////////////////////////////////////////////////
 
 #include "ResponseHandler.h"
 #include "ResponseHandlerRep.h"
+#include "InternalException.h"
+#include "HashTable.h"
+#include "IPC.h"
 
 PEGASUS_NAMESPACE_BEGIN
 
+PEGASUS_TEMPLATE_SPECIALIZATION struct HashFunc<void*>
+{
+    static Uint32 hash(void* x) { return Uint32(x) + 13; }
+};
+
+typedef HashTable<ResponseHandler*, ResponseHandlerRep*,
+                  EqualFunc<void*>,
+                  HashFunc<void*> > RepTable;
+
+static RepTable repTable(512);
+static Mutex repTableMutex;
+
+ResponseHandlerRep* _newRep(
+    ResponseHandler* object)
+{
+    ResponseHandlerRep* newRep = new ResponseHandlerRep();
+
+    auto_mutex lock(&repTableMutex);
+    repTable.insert(object, newRep);
+    return newRep;
+}
+
+ResponseHandlerRep* _newRep(
+    ResponseHandler* object,
+    const ResponseHandlerRep* rep)
+{
+    ResponseHandlerRep* newRep = new ResponseHandlerRep(*rep);
+
+    auto_mutex lock(&repTableMutex);
+    repTable.insert(object, newRep);
+    return newRep;
+}
+
+ResponseHandlerRep* _getRep(
+    const ResponseHandler* object)
+{
+    ResponseHandlerRep* rep;
+    Boolean found;
+
+    auto_mutex lock(&repTableMutex);
+    found = repTable.lookup(const_cast<ResponseHandler*>(object), rep);
+    PEGASUS_ASSERT(found == true);
+    return rep;
+}
+
+void _deleteRep(
+    ResponseHandler* object)
+{
+    ResponseHandlerRep* rep;
+    Boolean found;
+
+    auto_mutex lock(&repTableMutex);
+    found = repTable.lookup(object, rep);
+    PEGASUS_ASSERT(found == true);
+    delete rep;
+    repTable.remove(object);
+}
+
+
 ResponseHandler::ResponseHandler()
 {
-    _rep = new ResponseHandlerRep();
+    _newRep(this);
 }
 
 ResponseHandler::ResponseHandler(const ResponseHandler& handler)
 {
-    _rep = new ResponseHandlerRep(*handler._rep);
+    _newRep(this, _getRep(&handler));
 }
 
 ResponseHandler& ResponseHandler::operator=(const ResponseHandler& handler)
 {
-    if (handler._rep != _rep)
+    if (&handler != this)
     {
-        delete _rep;
-        _rep = new ResponseHandlerRep(*handler._rep);
+        _deleteRep(this);
+        _newRep(this, _getRep(&handler));
     }
     return *this;
 }
 
 ResponseHandler::~ResponseHandler()
 {
-    delete _rep;
+    _deleteRep(this);
 }
 
 OperationContext ResponseHandler::getContext(void) const
 {
-    return(_rep->getContext());
+    return(_getRep(this)->getContext());
 }
 
 void ResponseHandler::setContext(const OperationContext & context)
 {
-    _rep->setContext(context);
+    _getRep(this)->setContext(context);
 }
 
 PEGASUS_NAMESPACE_END
index bc55c2aec60159801b87d9964b82e1ddff61e265..28a5a630856f6fbbce30c460af8558480b9d0b36 100644 (file)
@@ -139,8 +139,6 @@ protected:
     // Gets the context for the results delivered to the CIM Server.
     //
     OperationContext getContext(void) const;
-
-    ResponseHandlerRep* _rep;
 };