summaryrefslogtreecommitdiff
path: root/cpp/managementgen
diff options
context:
space:
mode:
authorKim van der Riet <kpvdr@apache.org>2008-04-04 18:14:42 +0000
committerKim van der Riet <kpvdr@apache.org>2008-04-04 18:14:42 +0000
commita2ea9d432dc5713dadd4c710a982cc466de3ea8b (patch)
treed7c955359c88b80b24c4f70146309a806511adda /cpp/managementgen
parent2193d76646028d97b7bfff69335d4239954adbe5 (diff)
downloadqpid-python-a2ea9d432dc5713dadd4c710a982cc466de3ea8b.tar.gz
Patch from Ted Ross (see QPID-902): This patch contains the following improvements for management:\n1) Schema display cleaned up in the python mgmt-cli\n2) Locking added automatically to management object accessors (manual locking removed from broker/Queue.cpp)\n3) Schemas are now pre-registered with the management agent using a package initializer. This allows management consoles to get schema information for a class even if no instances of the class exist.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@644806 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/managementgen')
-rwxr-xr-xcpp/managementgen/generate.py18
-rwxr-xr-xcpp/managementgen/main.py8
-rwxr-xr-xcpp/managementgen/schema.py31
-rw-r--r--cpp/managementgen/templates/Class.cpp15
-rw-r--r--cpp/managementgen/templates/Class.h5
5 files changed, 56 insertions, 21 deletions
diff --git a/cpp/managementgen/generate.py b/cpp/managementgen/generate.py
index 4c042bd3f6..e1c01de9b0 100755
--- a/cpp/managementgen/generate.py
+++ b/cpp/managementgen/generate.py
@@ -187,7 +187,15 @@ class Generator:
pass
os.rename (tempFile, target)
- print "Generated:", target
+ print "Generated:", target
+
+ def targetPackageFile (self, schema, templateFile):
+ dot = templateFile.find(".")
+ if dot == -1:
+ raise ValueError ("Invalid template file name %s" % templateFile)
+ extension = templateFile[dot:len (templateFile)]
+ path = self.dest + "Package" + schema.getPackageName().capitalize() + extension
+ return path
def targetClassFile (self, _class, templateFile):
dot = templateFile.find(".")
@@ -244,6 +252,14 @@ class Generator:
stream = template.expand (method)
self.writeIfChanged (stream, target, force)
+ def makePackageFile (self, templateFile, schema, force=False):
+ """ Generate a package-specific file """
+ template = Template (self.input + templateFile, self)
+ self.templateFiles.append (templateFile)
+ target = self.targetPackageFile (schema, templateFile)
+ stream = template.expand (schema)
+ self.writeIfChanged (stream, target, force)
+
def makeSingleFile (self, templateFile, target, force=False):
""" Generate a single expanded template """
makefile = Makefile (self.filelists, self.templateFiles)
diff --git a/cpp/managementgen/main.py b/cpp/managementgen/main.py
index 677c7321ae..87ef3d5298 100755
--- a/cpp/managementgen/main.py
+++ b/cpp/managementgen/main.py
@@ -48,9 +48,11 @@ if opts.include_prefix == ".":
gen = Generator (outdir, templatedir)
schema = PackageSchema (typefile, schemafile, opts)
-gen.makeClassFiles ("Class.h", schema)
-gen.makeClassFiles ("Class.cpp", schema)
-gen.makeMethodFiles ("Args.h", schema)
+gen.makeClassFiles ("Class.h", schema)
+gen.makeClassFiles ("Class.cpp", schema)
+gen.makeMethodFiles ("Args.h", schema)
+gen.makePackageFile ("Package.h", schema)
+gen.makePackageFile ("Package.cpp", schema)
if opts.makefile != None:
gen.makeSingleFile ("Makefile.mk", opts.makefile, force=True)
diff --git a/cpp/managementgen/schema.py b/cpp/managementgen/schema.py
index fd76ba9112..44fc091372 100755
--- a/cpp/managementgen/schema.py
+++ b/cpp/managementgen/schema.py
@@ -78,6 +78,7 @@ class SchemaType:
def genAccessor (self, stream, varName, changeFlag = None):
if self.accessor == "direct":
stream.write (" inline void set_" + varName + " (" + self.cpp + " val){\n");
+ stream.write (" sys::RWlock::ScopedWlock writeLock (accessLock);\n")
if self.style != "mma":
stream.write (" " + varName + " = val;\n");
if self.style == "wm":
@@ -97,6 +98,7 @@ class SchemaType:
stream.write (" }\n");
elif self.accessor == "counter":
stream.write (" inline void inc_" + varName + " (" + self.cpp + " by = 1){\n");
+ stream.write (" sys::RWlock::ScopedWlock writeLock (accessLock);\n")
stream.write (" " + varName + " += by;\n")
if self.style == "wm":
stream.write (" if (" + varName + "High < " + varName + ")\n")
@@ -105,6 +107,7 @@ class SchemaType:
stream.write (" " + changeFlag + " = true;\n")
stream.write (" }\n");
stream.write (" inline void dec_" + varName + " (" + self.cpp + " by = 1){\n");
+ stream.write (" sys::RWlock::ScopedWlock writeLock (accessLock);\n")
stream.write (" " + varName + " -= by;\n")
if self.style == "wm":
stream.write (" if (" + varName + "Low > " + varName + ")\n")
@@ -796,6 +799,9 @@ class SchemaClass:
def genNameLower (self, stream, variables):
stream.write (self.name.lower ())
+ def genNamePackageCap (self, stream, variables):
+ stream.write (self.packageName.capitalize ())
+
def genNamePackageLower (self, stream, variables):
stream.write (self.packageName.lower ())
@@ -867,3 +873,28 @@ class PackageSchema:
def getClasses (self):
return self.classes
+
+ def genPackageNameUpper (self, stream, variables):
+ stream.write (self.packageName.upper ())
+
+ def genPackageNameCap (self, stream, variables):
+ stream.write (self.packageName.capitalize ())
+
+ def genClassIncludes (self, stream, variables):
+ for _class in self.classes:
+ stream.write ("#include \"qpid/management/")
+ _class.genNameCap (stream, variables)
+ stream.write (".h\"\n")
+
+ def genClassRegisters (self, stream, variables):
+ for _class in self.classes:
+ stream.write ("agent->RegisterClass (")
+ _class.genNameCap (stream, variables)
+ stream.write ("::packageName, ")
+ _class.genNameCap (stream, variables)
+ stream.write ("::className, ")
+ _class.genNameCap (stream, variables)
+ stream.write ("::md5Sum, ")
+ _class.genNameCap (stream, variables)
+ stream.write ("::writeSchema);\n")
+
diff --git a/cpp/managementgen/templates/Class.cpp b/cpp/managementgen/templates/Class.cpp
index 3c3dfff5a2..5862685670 100644
--- a/cpp/managementgen/templates/Class.cpp
+++ b/cpp/managementgen/templates/Class.cpp
@@ -35,7 +35,6 @@ string /*MGEN:Class.NameCap*/::packageName = string ("/*MGEN:Class.NamePackage
string /*MGEN:Class.NameCap*/::className = string ("/*MGEN:Class.NameLower*/");
uint8_t /*MGEN:Class.NameCap*/::md5Sum[16] =
{/*MGEN:Class.SchemaMD5*/};
-bool /*MGEN:Class.NameCap*/::firstInst = true;
/*MGEN:Class.NameCap*/::/*MGEN:Class.NameCap*/ (Manageable* _core/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/) :
ManagementObject(_core)
@@ -63,18 +62,6 @@ namespace {
const string DEFAULT("default");
}
-bool /*MGEN:Class.NameCap*/::firstInstance (void)
-{
- Mutex::ScopedLock alock(accessorLock);
- if (firstInst)
- {
- firstInst = false;
- return true;
- }
-
- return false;
-}
-
void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
{
FieldTable ft;
@@ -100,6 +87,7 @@ void /*MGEN:Class.NameCap*/::writeSchema (Buffer& buf)
void /*MGEN:Class.NameCap*/::writeConfig (Buffer& buf)
{
+ sys::RWlock::ScopedRlock readLock (accessLock);
configChanged = false;
writeTimestamps (buf);
@@ -108,6 +96,7 @@ void /*MGEN:Class.NameCap*/::writeConfig (Buffer& buf)
void /*MGEN:Class.NameCap*/::writeInstrumentation (Buffer& buf, bool skipHeaders)
{
+ sys::RWlock::ScopedWlock writeLock (accessLock);
instChanged = false;
if (!skipHeaders)
diff --git a/cpp/managementgen/templates/Class.h b/cpp/managementgen/templates/Class.h
index 047d7cc950..d95a06479e 100644
--- a/cpp/managementgen/templates/Class.h
+++ b/cpp/managementgen/templates/Class.h
@@ -23,7 +23,6 @@
/*MGEN:Root.Disclaimer*/
-#include "qpid/sys/Mutex.h"
#include "qpid/management/ManagementObject.h"
#include "qpid/framing/Uuid.h"
@@ -37,7 +36,6 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
static std::string packageName;
static std::string className;
static uint8_t md5Sum[16];
- static bool firstInst;
// Configuration Elements
/*MGEN:Class.ConfigDeclarations*/
@@ -52,13 +50,12 @@ class /*MGEN:Class.NameCap*/ : public ManagementObject
qpid::framing::Buffer& inBuf,
qpid::framing::Buffer& outBuf);
writeSchemaCall_t getWriteSchemaCall (void) { return writeSchema; }
- bool firstInstance (void);
/*MGEN:Class.InstChangedStub*/
public:
+ friend class Package/*MGEN:Class.NamePackageCap*/;
typedef boost::shared_ptr</*MGEN:Class.NameCap*/> shared_ptr;
- qpid::sys::Mutex accessorLock;
/*MGEN:Class.NameCap*/ (Manageable* coreObject/*MGEN:Class.ParentArg*//*MGEN:Class.ConstructorArgs*/);
~/*MGEN:Class.NameCap*/ (void);