diff options
| author | Kim van der Riet <kpvdr@apache.org> | 2008-04-04 18:14:42 +0000 |
|---|---|---|
| committer | Kim van der Riet <kpvdr@apache.org> | 2008-04-04 18:14:42 +0000 |
| commit | a2ea9d432dc5713dadd4c710a982cc466de3ea8b (patch) | |
| tree | d7c955359c88b80b24c4f70146309a806511adda /cpp/managementgen | |
| parent | 2193d76646028d97b7bfff69335d4239954adbe5 (diff) | |
| download | qpid-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-x | cpp/managementgen/generate.py | 18 | ||||
| -rwxr-xr-x | cpp/managementgen/main.py | 8 | ||||
| -rwxr-xr-x | cpp/managementgen/schema.py | 31 | ||||
| -rw-r--r-- | cpp/managementgen/templates/Class.cpp | 15 | ||||
| -rw-r--r-- | cpp/managementgen/templates/Class.h | 5 |
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); |
