summaryrefslogtreecommitdiff
path: root/qpid/cpp/managementgen
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2016-06-22 20:41:55 +0000
committerAlan Conway <aconway@apache.org>2016-06-22 20:41:55 +0000
commit7b8a91375dc0528e2c15686ab71c3647ac3e2f96 (patch)
tree37b11722254d3109e23ebe676a1137840120a107 /qpid/cpp/managementgen
parente1d9be1b3590c79a0b2a6b6ad4cd3e6a65877401 (diff)
downloadqpid-python-7b8a91375dc0528e2c15686ab71c3647ac3e2f96.tar.gz
QPID-7306: Fix race conditions during Queue destruction.
Stack traces indicate a Queue was being destroyed concurrently while still in use by its ManagedObject. ManagedObject holds a plain pointer to the Manageable object (e.g. Queue) it belongs to. The Manageable calls ManagedObject::resourceDestroy() when it is deleted, but without any locking. Added a locked wrapper class ManageablePtr so destroy is atomic with respect to other calls via ManageablePtr, calls after pointer is reset to 0 in destroy() are skipped. Call resourceDestroy() in Queue::~Queue if it was not called already. This is probably redundant given given the fixes above but can't hurt. Queue::destroyed() was also being called without locking and could be called concurrrently, e.g. if auto-delete happens concurrently with delete via QMF or by a 0-10 client. Moved the destroyed() call into QueueRegistry::destroy(), using QueueRegistry lock to guarantee it is called exactly once. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1749782 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/managementgen')
-rwxr-xr-xqpid/cpp/managementgen/qmfgen/schema.py8
1 files changed, 4 insertions, 4 deletions
diff --git a/qpid/cpp/managementgen/qmfgen/schema.py b/qpid/cpp/managementgen/qmfgen/schema.py
index 7bf161dc2b..19da8ef5fb 100755
--- a/qpid/cpp/managementgen/qmfgen/schema.py
+++ b/qpid/cpp/managementgen/qmfgen/schema.py
@@ -1371,10 +1371,10 @@ class SchemaClass:
arg.dir.lower () + "_" +\
arg.name, "inBuf") + ";\n")
- stream.write (" bool allow = coreObject->AuthorizeMethod(METHOD_" +\
+ stream.write (" bool allow = manageable.AuthorizeMethod(METHOD_" +\
method.getName().upper() + ", ioArgs, userId);\n")
stream.write (" if (allow)\n")
- stream.write (" status = coreObject->ManagementMethod (METHOD_" +\
+ stream.write (" status = manageable.ManagementMethod (METHOD_" +\
method.getName().upper() + ", ioArgs, text);\n")
stream.write (" else\n")
stream.write (" status = Manageable::STATUS_FORBIDDEN;\n")
@@ -1413,10 +1413,10 @@ class SchemaClass:
False,
arg.default)
- stream.write (" bool allow = coreObject->AuthorizeMethod(METHOD_" +\
+ stream.write (" bool allow = manageable.AuthorizeMethod(METHOD_" +\
method.getName().upper() + ", ioArgs, userId);\n")
stream.write (" if (allow)\n")
- stream.write (" status = coreObject->ManagementMethod (METHOD_" +\
+ stream.write (" status = manageable.ManagementMethod (METHOD_" +\
method.getName().upper() + ", ioArgs, text);\n")
stream.write (" else\n")
stream.write (" status = Manageable::STATUS_FORBIDDEN;\n")