unsigned/size_t/shared ptrs

This commit is contained in:
Matej Sekoranja
2012-06-15 14:47:16 +02:00
parent 7307529f7f
commit 4b5bc38835
31 changed files with 742 additions and 543 deletions

174
.cproject
View File

@@ -3,11 +3,11 @@
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> <cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings"> <storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1356606915"> <cconfiguration id="0.1711304068">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1356606915" moduleId="org.eclipse.cdt.core.settings" name="Default"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1711304068" moduleId="org.eclipse.cdt.core.settings" name="Default">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> <extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
@@ -16,44 +16,28 @@
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.base.1356606915" name="Default" parent="org.eclipse.cdt.build.core.emptycfg"> <configuration buildProperties="" description="" id="0.1711304068" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
<folderInfo id="cdt.managedbuild.toolchain.gnu.base.1356606915.922814002" name="/" resourcePath=""> <folderInfo id="0.1711304068." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.base.1290391524" name="cdt.managedbuild.toolchain.gnu.base" superClass="cdt.managedbuild.toolchain.gnu.base"> <toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1124923904" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.1695206694" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/> <targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1124923904.1662419075" name=""/>
<builder id="cdt.managedbuild.target.gnu.builder.base.1065831114" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/> <builder id="org.eclipse.cdt.build.core.settings.default.builder.2130969774" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
<tool id="cdt.managedbuild.tool.gnu.archiver.base.766076070" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/> <tool id="org.eclipse.cdt.build.core.settings.holder.libs.1725950754" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1359276119" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"> <tool id="org.eclipse.cdt.build.core.settings.holder.1831860297" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="gnu.cpp.compiler.option.include.paths.1856220007" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.386696398" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
<listOptionValue builtIn="false" value="/opt/epics/base/include"/> </tool>
<listOptionValue builtIn="false" value="/opt/epics/base/include/os/Linux"/> <tool id="org.eclipse.cdt.build.core.settings.holder.314251929" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.910187613" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
<listOptionValue builtIn="false" value="/Users/msekoranja/tmp/pvDataCPP/include"/>
</option> </option>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1316200261" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1715506878" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool> </tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.1053490390" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base"> <tool id="org.eclipse.cdt.build.core.settings.holder.1947872318" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
<option id="gnu.c.compiler.option.include.paths.1102959803" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath"> <inputType id="org.eclipse.cdt.build.core.settings.holder.inType.277964485" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
<listOptionValue builtIn="false" value="/opt/epics/base/include"/>
<listOptionValue builtIn="false" value="/opt/epics/base/include/os/Linux"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1997080176" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.base.1783519900" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.1802914254" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base">
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1133209566" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
<tool id="cdt.managedbuild.tool.gnu.assembler.base.898309292" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
<option id="gnu.both.asm.option.include.paths.288017456" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths"/>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.342310237" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool> </tool>
</toolChain> </toolChain>
</folderInfo> </folderInfo>
</configuration> </configuration>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
<externalSettings containerId="pvDataCPP;" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier"/>
</storageModule>
<storageModule moduleId="scannerConfiguration"> <storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
@@ -302,44 +286,96 @@
</scannerInfoProvider> </scannerInfoProvider>
</profile> </profile>
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="0.1711304068">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="makefileGenerator">
<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"> <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
<buildTargets> <storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
<buildCommand>make</buildCommand>
<buildTarget>all</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>false</runAllBuilders>
</target>
<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildTarget>clean</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>false</runAllBuilders>
</target>
<target name="uninstall" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>uninstall</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>false</runAllBuilders>
</target>
<target name="debug" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>clean all DEBUG=1</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>false</runAllBuilders>
</target>
</buildTargets>
</storageModule>
</cconfiguration> </cconfiguration>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="pvAccessCPP.null.2070236580" name="pvAccessCPP"/> <project id="pvAccessCPP.null.1359070792" name="pvAccessCPP"/>
</storageModule> </storageModule>
</cproject> </cproject>

19
README
View File

@@ -3,4 +3,21 @@ Define
EPICS_BASE EPICS_BASE
PVDATA_HOME PVDATA_HOME
variables that points to EPICS base and pvDataCPP installation directory (includes and libraries) in configure/RELEASE. variables that points to EPICS base and pvDataCPP installation directory (includes and libraries) in configure/RELEASE.local
Google C++ Testing Framework
----------------------------
Download:
http://code.google.com/p/googletest/
Extract, go to its root directory and in run:
export GTEST_DIR=$PWD
g++ -g -O3 -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc
g++ -g -O3 -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest_main.cc
ar -rv libgtest_main.a gtest_main.o gtest-all.o
mkdir -p $EPICS_HOME/gtest/lib
cp -r ${GTEST_DIR}/include $EPICS_HOME/gtest
cp libgtest_main.a $EPICS_HOME/gtest/lib
(you can use cmake, see gtest README)

View File

@@ -43,7 +43,7 @@ private:
return findMatchingBrace(request,closeBrace,numOpen-1); return findMatchingBrace(request,closeBrace,numOpen-1);
} }
static void createFieldRequest(PVStructure* pvParent,std::string request,bool fieldListOK) { static void createFieldRequest(PVStructurePtr const & pvParent,std::string request,bool fieldListOK) {
trim(request); trim(request);
if(request.length()<=0) return; if(request.length()<=0) return;
size_t comma = request.find(','); size_t comma = request.find(',');
@@ -57,9 +57,12 @@ private:
THROW_BASE_EXCEPTION("mismatched { }"); THROW_BASE_EXCEPTION("mismatched { }");
} }
String fieldName = request.substr(0,openBrace); String fieldName = request.substr(0,openBrace);
std::auto_ptr<PVStructure> pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0));
createFieldRequest(pvStructure.get(),request.substr(openBrace+1,closeBrace-openBrace-1),false); PVFieldPtrArray fields;
pvParent->appendPVField(pvStructure.release()); StringArray fieldNames;
PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields));
createFieldRequest(pvStructure,request.substr(openBrace+1,closeBrace-openBrace-1),false);
pvParent->appendPVField(fieldName, pvStructure);
if(request.length()>closeBrace+1) { if(request.length()>closeBrace+1) {
if(request.at(closeBrace+1) != ',') { if(request.at(closeBrace+1) != ',') {
THROW_BASE_EXCEPTION("misssing , after }"); THROW_BASE_EXCEPTION("misssing , after }");
@@ -69,9 +72,9 @@ private:
return; return;
} }
if(openBracket==std::string::npos && fieldListOK) { if(openBracket==std::string::npos && fieldListOK) {
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvParent, "fieldList", pvString))); PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(request); pvStringField->put(request);
pvParent->appendPVField(pvStringField.release()); pvParent->appendPVField("fieldList", pvStringField);
return; return;
} }
if(openBracket!=std::string::npos && (comma==std::string::npos || comma>openBracket)) { if(openBracket!=std::string::npos && (comma==std::string::npos || comma>openBracket)) {
@@ -95,30 +98,32 @@ private:
createLeafFieldRequest(pvParent,request); createLeafFieldRequest(pvParent,request);
} }
static void createLeafFieldRequest(PVStructure* pvParent,String request) { static void createLeafFieldRequest(PVStructurePtr const & pvParent,String request) {
size_t openBracket = request.find('['); size_t openBracket = request.find('[');
String fullName = request; String fullName = request;
if(openBracket != std::string::npos) fullName = request.substr(0,openBracket); if(openBracket != std::string::npos) fullName = request.substr(0,openBracket);
size_t indLast = fullName.rfind('.'); size_t indLast = fullName.rfind('.');
String fieldName = fullName; String fieldName = fullName;
if(indLast>1 && indLast != std::string::npos) fieldName = fullName.substr(indLast+1); if(indLast>1 && indLast != std::string::npos) fieldName = fullName.substr(indLast+1);
std::auto_ptr<PVStructure> pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0)); PVFieldPtrArray fields;
std::auto_ptr<PVStructure> pvLeaf(getPVDataCreate()->createPVStructure(pvStructure.get(),"leaf", 0)); StringArray fieldNames;
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvLeaf.get(), "source", pvString))); PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields));
PVStructurePtr pvLeaf(getPVDataCreate()->createPVStructure(fieldNames, fields));
PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(fullName); pvStringField->put(fullName);
pvLeaf->appendPVField(pvStringField.release()); pvLeaf->appendPVField("source", pvStringField);
if(openBracket != std::string::npos) { if(openBracket != std::string::npos) {
size_t closeBracket = request.find(']'); size_t closeBracket = request.find(']');
if(closeBracket==std::string::npos) { if(closeBracket==std::string::npos) {
THROW_BASE_EXCEPTION("option does not have matching []"); THROW_BASE_EXCEPTION("option does not have matching []");
} }
createRequestOptions(pvLeaf.get(),request.substr(openBracket+1, closeBracket-openBracket-1)); createRequestOptions(pvLeaf,request.substr(openBracket+1, closeBracket-openBracket-1));
} }
pvStructure->appendPVField(pvLeaf.release()); pvStructure->appendPVField("leaf", pvLeaf);
pvParent->appendPVField(pvStructure.release()); pvParent->appendPVField("fieldName", pvStructure);
} }
static void createRequestOptions(PVStructure* pvParent,std::string request) { static void createRequestOptions(PVStructurePtr const & pvParent,std::string request) {
trim(request); trim(request);
if(request.length()<=1) return; if(request.length()<=1) return;
@@ -135,9 +140,9 @@ private:
if (equalsPos != std::string::npos) if (equalsPos != std::string::npos)
{ {
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvParent, token.substr(0, equalsPos), pvString))); PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(token.substr(equalsPos+1)); pvStringField->put(token.substr(equalsPos+1));
pvParent->appendPVField(pvStringField.release()); pvParent->appendPVField(token.substr(0, equalsPos), pvStringField);
} }
} }
} }
@@ -146,11 +151,13 @@ public:
virtual PVStructure::shared_pointer createRequest(String request) virtual PVStructure::shared_pointer createRequest(String request)
{ {
static String emptyString; static PVFieldPtrArray emptyFields;
static StringArray emptyFieldNames;
if (!request.empty()) trim(request); if (!request.empty()) trim(request);
if (request.empty()) if (request.empty())
{ {
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0)); PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
return pvStructure; return pvStructure;
} }
@@ -159,7 +166,7 @@ public:
size_t offsetPutField = request.find("putField("); size_t offsetPutField = request.find("putField(");
size_t offsetGetField = request.find("getField("); size_t offsetGetField = request.find("getField(");
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0)); PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
if (offsetRecord != std::string::npos) { if (offsetRecord != std::string::npos) {
size_t offsetBegin = request.find('[', offsetRecord); size_t offsetBegin = request.find('[', offsetRecord);
@@ -167,9 +174,9 @@ public:
if(offsetEnd == std::string::npos) { if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("record[ does not have matching ]"); THROW_BASE_EXCEPTION("record[ does not have matching ]");
} }
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "record", 0)); PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createRequestOptions(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1)); createRequestOptions(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1));
pvStructure->appendPVField(pvStruct.release()); pvStructure->appendPVField("record", pvStruct);
} }
if (offsetField != std::string::npos) { if (offsetField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetField); size_t offsetBegin = request.find('(', offsetField);
@@ -177,9 +184,9 @@ public:
if(offsetEnd == std::string::npos) { if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("field( does not have matching )"); THROW_BASE_EXCEPTION("field( does not have matching )");
} }
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "field", 0)); PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release()); pvStructure->appendPVField("field", pvStruct);
} }
if (offsetPutField != std::string::npos) { if (offsetPutField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetPutField); size_t offsetBegin = request.find('(', offsetPutField);
@@ -187,9 +194,9 @@ public:
if(offsetEnd == std::string::npos) { if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("putField( does not have matching )"); THROW_BASE_EXCEPTION("putField( does not have matching )");
} }
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "putField", 0)); PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release()); pvStructure->appendPVField("putField", pvStruct);
} }
if (offsetGetField != std::string::npos) { if (offsetGetField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetGetField); size_t offsetBegin = request.find('(', offsetGetField);
@@ -197,12 +204,12 @@ public:
if(offsetEnd == std::string::npos) { if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("getField( does not have matching )"); THROW_BASE_EXCEPTION("getField( does not have matching )");
} }
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "getField", 0)); PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release()); pvStructure->appendPVField("getField", pvStruct);
} }
if (pvStructure.get()->getStructure()->getNumberFields()==0) { if (pvStructure.get()->getStructure()->getNumberFields()==0) {
createFieldRequest(pvStructure.get(),request,true); createFieldRequest(pvStructure,request,true);
} }
return pvStructure; return pvStructure;
} }

View File

@@ -23,7 +23,7 @@ namespace epics {
void AbstractResponseHandler::handleResponse(osiSockAddr* responseFrom, void AbstractResponseHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
if(_debug) { if(_debug) {
char ipAddrStr[48]; char ipAddrStr[48];
ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr)); ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr));

View File

@@ -42,7 +42,7 @@ namespace epics {
acquire(client); acquire(client);
// use immediate for clients // use immediate for clients
setSendQueueFlushStrategy(IMMEDIATE); setSendQueueFlushStrategy(DELAYED);
// setup connection timeout timer (watchdog) // setup connection timeout timer (watchdog)
epicsTimeGetCurrent(&_aliveTimestamp); epicsTimeGetCurrent(&_aliveTimestamp);

View File

@@ -28,7 +28,8 @@ namespace pvAccess {
_lastChannelSID(0) _lastChannelSID(0)
{ {
// for performance testing // for performance testing
// setSendQueueFlushStrategy(IMMEDIATE); setSendQueueFlushStrategy(DELAYED);
_delay = 0.000;
// NOTE: priority not yet known, default priority is used to register/unregister // NOTE: priority not yet known, default priority is used to register/unregister
// TODO implement priorities in Reactor... not that user will // TODO implement priorities in Reactor... not that user will

View File

@@ -124,20 +124,20 @@ namespace epics {
bool waitUntilVerified(double timeout); bool waitUntilVerified(double timeout);
virtual void flush(bool lastMessageCompleted); virtual void flush(bool lastMessageCompleted);
virtual void startMessage(epics::pvData::int8 command, int ensureCapacity); virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity);
virtual void endMessage(); virtual void endMessage();
virtual void flushSerializeBuffer() { virtual void flushSerializeBuffer() {
flush(false); flush(false);
} }
virtual void ensureBuffer(int size); virtual void ensureBuffer(std::size_t size);
virtual void alignBuffer(int alignment); virtual void alignBuffer(std::size_t alignment);
virtual void ensureData(int size); virtual void ensureData(std::size_t size);
virtual void alignData(int alignment); virtual void alignData(std::size_t alignment);
virtual void close(bool force); virtual void close(bool force);
@@ -165,10 +165,15 @@ namespace epics {
//void enqueueMonitorSendRequest(TransportSender::shared_pointer const & sender); //void enqueueMonitorSendRequest(TransportSender::shared_pointer const & sender);
virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender);
virtual void flushSendQueue();
protected: protected:
virtual void processReadCached(bool nestedCall, virtual void processReadCached(bool nestedCall,
ReceiveStage inStage, int requiredBytes); ReceiveStage inStage, std::size_t requiredBytes);
/** /**
* Called to any resources just before closing transport * Called to any resources just before closing transport
@@ -199,11 +204,12 @@ namespace epics {
/** /**
* Default marker period. * Default marker period.
*/ */
static const int MARKER_PERIOD = 1024; static const std::size_t MARKER_PERIOD = 1024;
static const int MAX_ENSURE_DATA_BUFFER_SIZE = 1024; static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE = 1024;
static const double _delay; // TODO
double _delay;
/****** finally initialized at construction time and after start (called by the same thread) ********/ /****** finally initialized at construction time and after start (called by the same thread) ********/
@@ -230,10 +236,12 @@ namespace epics {
*/ */
std::auto_ptr<ResponseHandler> _responseHandler; std::auto_ptr<ResponseHandler> _responseHandler;
// TODO review int vs std::size_t
/** /**
* Send buffer size. * Send buffer size.
*/ */
int _maxPayloadSize; std::size_t _maxPayloadSize;
/** /**
* Send buffer size. * Send buffer size.
@@ -333,16 +341,16 @@ namespace epics {
// initialized at construction time // initialized at construction time
epics::pvData::ByteBuffer* _socketBuffer; epics::pvData::ByteBuffer* _socketBuffer;
int _startPosition; std::size_t _startPosition;
int _storedPayloadSize; std::size_t _storedPayloadSize;
int _storedPosition; std::size_t _storedPosition;
int _storedLimit; std::size_t _storedLimit;
epics::pvData::int8 _version; epics::pvData::int8 _version;
epics::pvData::int8 _packetType; epics::pvData::int8 _packetType;
epics::pvData::int8 _command; epics::pvData::int8 _command;
int _payloadSize; std::size_t _payloadSize;
ReceiveStage _stage; ReceiveStage _stage;

View File

@@ -76,11 +76,12 @@ namespace pvAccess {
PVDATA_REFCOUNT_MONITOR_DEFINE(blockingTCPTransport); PVDATA_REFCOUNT_MONITOR_DEFINE(blockingTCPTransport);
const double BlockingTCPTransport::_delay = 0.01; //const double BlockingTCPTransport::_delay = 0.000;
BlockingTCPTransport::BlockingTCPTransport(Context::shared_pointer const & context, BlockingTCPTransport::BlockingTCPTransport(Context::shared_pointer const & context,
SOCKET channel, std::auto_ptr<ResponseHandler>& responseHandler, SOCKET channel, std::auto_ptr<ResponseHandler>& responseHandler,
int receiveBufferSize, int16 priority) : int receiveBufferSize, int16 priority) :
_delay(0.0),
_channel(channel), _channel(channel),
_priority(priority), _priority(priority),
_responseHandler(responseHandler), _responseHandler(responseHandler),
@@ -221,7 +222,7 @@ namespace pvAccess {
LOG(logLevelDebug, "Starting thread: %s",threadName.c_str()); LOG(logLevelDebug, "Starting thread: %s",threadName.c_str());
_sendThreadId = epicsThreadCreate(threadName.c_str(), _sendThreadId = epicsThreadCreate(threadName.c_str(),
epicsThreadPriorityMedium, epicsThreadPriorityMedium,
epicsThreadGetStackSize(epicsThreadStackMedium), epicsThreadGetStackSize(epicsThreadStackMedium),
BlockingTCPTransport::sendThreadRunner, this); BlockingTCPTransport::sendThreadRunner, this);
} }
@@ -330,7 +331,7 @@ namespace pvAccess {
startMessage(_lastSegmentedMessageCommand, 0); startMessage(_lastSegmentedMessageCommand, 0);
} }
void BlockingTCPTransport::startMessage(int8 command, int ensureCapacity) { void BlockingTCPTransport::startMessage(int8 command, size_t ensureCapacity) {
_lastMessageStartPosition = -1; _lastMessageStartPosition = -1;
ensureBuffer(CA_MESSAGE_HEADER_SIZE+ensureCapacity); ensureBuffer(CA_MESSAGE_HEADER_SIZE+ensureCapacity);
_lastMessageStartPosition = _sendBuffer->getPosition(); _lastMessageStartPosition = _sendBuffer->getPosition();
@@ -346,8 +347,8 @@ namespace pvAccess {
endMessage(false); endMessage(false);
} }
void BlockingTCPTransport::ensureBuffer(int size) { void BlockingTCPTransport::ensureBuffer(size_t size) {
if(likely((int)(_sendBuffer->getRemaining())>=size)) return; if(likely(_sendBuffer->getRemaining()>=size)) return;
// too large for buffer... // too large for buffer...
if(unlikely(_maxPayloadSize<size)) { if(unlikely(_maxPayloadSize<size)) {
@@ -357,16 +358,16 @@ namespace pvAccess {
THROW_BASE_EXCEPTION(temp.str().c_str()); THROW_BASE_EXCEPTION(temp.str().c_str());
} }
while(((int)_sendBuffer->getRemaining())<size && !_closed.get()) while(_sendBuffer->getRemaining()<size && !_closed.get())
flush(false); flush(false);
if (unlikely(_closed.get())) THROW_BASE_EXCEPTION("transport closed"); if (unlikely(_closed.get())) THROW_BASE_EXCEPTION("transport closed");
} }
void BlockingTCPTransport::alignBuffer(int alignment) { void BlockingTCPTransport::alignBuffer(size_t alignment) {
// not space optimal (always requires 7-bytes), but fast // not space optimal (always requires 7-bytes), but fast
if(unlikely((int)(_sendBuffer->getRemaining())<(alignment-1))) if(unlikely(_sendBuffer->getRemaining()<(alignment-1)))
ensureBuffer(alignment-1); ensureBuffer(alignment-1);
_sendBuffer->align(alignment); _sendBuffer->align(alignment);
@@ -425,9 +426,9 @@ namespace pvAccess {
} }
} }
void BlockingTCPTransport::ensureData(int size) { void BlockingTCPTransport::ensureData(size_t size) {
// enough of data? // enough of data?
if(likely(((int)_socketBuffer->getRemaining())>=size)) return; if(likely(_socketBuffer->getRemaining()>=size)) return;
// too large for buffer... // too large for buffer...
if(unlikely(MAX_ENSURE_DATA_BUFFER_SIZE<size)) { if(unlikely(MAX_ENSURE_DATA_BUFFER_SIZE<size)) {
@@ -479,24 +480,24 @@ namespace pvAccess {
_storedLimit)); _storedLimit));
// add if missing... // add if missing...
if(unlikely(!_closed.get()&&((int)_socketBuffer->getRemaining())<size)) if(unlikely(!_closed.get()&&(_socketBuffer->getRemaining()<size)))
ensureData(size); ensureData(size);
} }
if(unlikely(_closed.get())) THROW_BASE_EXCEPTION("transport closed"); if(unlikely(_closed.get())) THROW_BASE_EXCEPTION("transport closed");
} }
void BlockingTCPTransport::alignData(int alignment) { void BlockingTCPTransport::alignData(size_t alignment) {
// not space optimal (always requires 7-bytes), but fast // not space optimal (always requires 7-bytes), but fast
if(unlikely((int)(_socketBuffer->getRemaining())<(alignment-1))) if(unlikely(_socketBuffer->getRemaining()<(alignment-1)))
ensureData(alignment-1); ensureData(alignment-1);
_socketBuffer->align(alignment); _socketBuffer->align(alignment);
} }
void BlockingTCPTransport::processReadCached(bool nestedCall, void BlockingTCPTransport::processReadCached(bool nestedCall,
ReceiveStage inStage, int requiredBytes) { ReceiveStage inStage, size_t requiredBytes) {
try { try {
while(likely(!_closed.get())) { while(likely(!_closed.get())) {
if(_stage==READ_FROM_SOCKET||inStage!=UNDEFINED_STAGE) { if(_stage==READ_FROM_SOCKET||inStage!=UNDEFINED_STAGE) {
@@ -521,7 +522,7 @@ namespace pvAccess {
// read at least requiredBytes bytes // read at least requiredBytes bytes
uintptr_t requiredPosition = (currentStartPosition+requiredBytes); size_t requiredPosition = (currentStartPosition+requiredBytes);
while(_socketBuffer->getPosition()<requiredPosition) { while(_socketBuffer->getPosition()<requiredPosition) {
// read // read
int pos = _socketBuffer->getPosition(); int pos = _socketBuffer->getPosition();
@@ -689,7 +690,7 @@ namespace pvAccess {
} }
_socketBuffer->setLimit(_storedLimit); _socketBuffer->setLimit(_storedLimit);
int newPosition = _storedPosition+_storedPayloadSize; size_t newPosition = _storedPosition+_storedPayloadSize;
if(unlikely(newPosition>_storedLimit)) { if(unlikely(newPosition>_storedLimit)) {
newPosition -= _storedLimit; newPosition -= _storedLimit;
_socketBuffer->setPosition(_storedLimit); _socketBuffer->setPosition(_storedLimit);
@@ -778,6 +779,7 @@ namespace pvAccess {
int bytesToSend = limit-buffer->getPosition(); int bytesToSend = limit-buffer->getPosition();
//LOG(logLevelInfo,"Total bytes to send: %d", bytesToSend); //LOG(logLevelInfo,"Total bytes to send: %d", bytesToSend);
//printf("Total bytes to send: %d\n", bytesToSend);
// limit sending // limit sending
if(bytesToSend>maxBytesToSend) { if(bytesToSend>maxBytesToSend) {
@@ -1010,6 +1012,18 @@ printf("sendThreadRunnner exception\n");
_sendQueueEvent.signal(); _sendQueueEvent.signal();
} }
void BlockingTCPTransport::enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) {
Lock lock(_sendQueueMutex);
if(unlikely(_closed.get())) return;
_sendQueue.push_back(sender);
}
void BlockingTCPTransport::flushSendQueue() {
Lock lock(_sendQueueMutex);
if(unlikely(_closed.get())) return;
_sendQueueEvent.signal();
}
/* /*
void BlockingTCPTransport::enqueueMonitorSendRequest(TransportSender::shared_pointer sender) { void BlockingTCPTransport::enqueueMonitorSendRequest(TransportSender::shared_pointer sender) {
Lock lock(_monitorMutex); Lock lock(_monitorMutex);

View File

@@ -110,15 +110,15 @@ namespace epics {
virtual void close(bool forced); virtual void close(bool forced);
virtual void ensureData(int size) { virtual void ensureData(std::size_t size) {
// noop // noop
} }
virtual void alignData(int alignment) { virtual void alignData(std::size_t alignment) {
_receiveBuffer->align(alignment); _receiveBuffer->align(alignment);
} }
virtual void startMessage(epics::pvData::int8 command, int ensureCapacity); virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity);
virtual void endMessage(); virtual void endMessage();
virtual void flush(bool lastMessageCompleted) { virtual void flush(bool lastMessageCompleted) {
@@ -134,11 +134,11 @@ namespace epics {
// noop // noop
} }
virtual void ensureBuffer(int size) { virtual void ensureBuffer(std::size_t size) {
// noop // noop
} }
virtual void alignBuffer(int alignment) { virtual void alignBuffer(std::size_t alignment) {
_sendBuffer->align(alignment); _sendBuffer->align(alignment);
} }

View File

@@ -141,7 +141,7 @@ namespace epics {
} }
} }
void BlockingUDPTransport::startMessage(int8 command, int ensureCapacity) { void BlockingUDPTransport::startMessage(int8 command, size_t ensureCapacity) {
_lastMessageStartPosition = _sendBuffer->getPosition(); _lastMessageStartPosition = _sendBuffer->getPosition();
_sendBuffer->putByte(CA_MAGIC); _sendBuffer->putByte(CA_MAGIC);
_sendBuffer->putByte(CA_VERSION); _sendBuffer->putByte(CA_VERSION);
@@ -276,11 +276,12 @@ namespace epics {
// command ID and paylaod // command ID and paylaod
int8 command = receiveBuffer->getByte(); int8 command = receiveBuffer->getByte();
int payloadSize = receiveBuffer->getInt(); // TODO check this cast (size_t must be 32-bit)
int nextRequestPosition = receiveBuffer->getPosition() + payloadSize; size_t payloadSize = receiveBuffer->getInt();
size_t nextRequestPosition = receiveBuffer->getPosition() + payloadSize;
// payload size check // payload size check
if(unlikely(nextRequestPosition>(int)receiveBuffer->getLimit())) return false; if(unlikely(nextRequestPosition>receiveBuffer->getLimit())) return false;
// handle // handle
_responseHandler->handleResponse(&fromAddress, thisTransport, _responseHandler->handleResponse(&fromAddress, thisTransport,

View File

@@ -111,7 +111,7 @@ namespace epics {
virtual ~TransportSendControl() {} virtual ~TransportSendControl() {}
virtual void startMessage(epics::pvData::int8 command, int ensureCapacity) = 0; virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity) = 0;
virtual void endMessage() = 0; virtual void endMessage() = 0;
virtual void flush(bool lastMessageCompleted) = 0; virtual void flush(bool lastMessageCompleted) = 0;
@@ -261,6 +261,10 @@ namespace epics {
*/ */
virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0; virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0;
virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) {};
virtual void flushSendQueue() {};
}; };
class Channel; class Channel;
@@ -315,7 +319,7 @@ namespace epics {
*/ */
virtual void virtual void
handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport,
epics::pvData::int8 version, epics::pvData::int8 command, int payloadSize, epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize,
epics::pvData::ByteBuffer* payloadBuffer) = 0; epics::pvData::ByteBuffer* payloadBuffer) = 0;
}; };
@@ -335,7 +339,7 @@ namespace epics {
virtual ~AbstractResponseHandler() {} virtual ~AbstractResponseHandler() {}
virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport,
epics::pvData::int8 version, epics::pvData::int8 command, int payloadSize, epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize,
epics::pvData::ByteBuffer* payloadBuffer); epics::pvData::ByteBuffer* payloadBuffer);
protected: protected:

View File

@@ -23,9 +23,9 @@ public:
void endMessage() {} void endMessage() {}
void flush(bool lastMessageCompleted) {} void flush(bool lastMessageCompleted) {}
void setRecipient(const osiSockAddr& sendTo) {} void setRecipient(const osiSockAddr& sendTo) {}
void startMessage(epics::pvData::int8 command, int ensureCapacity) {} void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity) {}
void ensureBuffer(int size) {} void ensureBuffer(std::size_t) {}
void alignBuffer(int alignment) {} void alignBuffer(std::size_t alignment) {}
void flushSerializeBuffer() {} void flushSerializeBuffer() {}
void cachedSerialize( void cachedSerialize(
const std::tr1::shared_ptr<const epics::pvData::Field>& field, epics::pvData::ByteBuffer* buffer) const std::tr1::shared_ptr<const epics::pvData::Field>& field, epics::pvData::ByteBuffer* buffer)

View File

@@ -30,6 +30,8 @@
#include <pv/logger.h> #include <pv/logger.h>
#include <pv/bitSetUtil.h> #include <pv/bitSetUtil.h>
#include <tr1/unordered_map>
using std::tr1::dynamic_pointer_cast; using std::tr1::dynamic_pointer_cast;
using std::tr1::static_pointer_cast; using std::tr1::static_pointer_cast;
@@ -45,7 +47,7 @@ namespace epics {
String emptyString; String emptyString;
// TODO consider std::unordered_map // TODO consider std::unordered_map
typedef std::map<pvAccessID, ResponseRequest::weak_pointer> IOIDResponseRequestMap; typedef std::tr1::unordered_map<pvAccessID, ResponseRequest::weak_pointer> IOIDResponseRequestMap;
#define EXCEPTION_GUARD(code) try { code; } \ #define EXCEPTION_GUARD(code) try { code; } \
@@ -88,7 +90,7 @@ namespace epics {
typedef std::tr1::shared_ptr<BaseRequestImpl> shared_pointer; typedef std::tr1::shared_ptr<BaseRequestImpl> shared_pointer;
typedef std::tr1::shared_ptr<const BaseRequestImpl> const_shared_pointer; typedef std::tr1::shared_ptr<const BaseRequestImpl> const_shared_pointer;
static PVDataCreate* pvDataCreate; static PVDataCreatePtr pvDataCreate;
static Status notInitializedStatus; static Status notInitializedStatus;
static Status destroyedStatus; static Status destroyedStatus;
@@ -290,7 +292,7 @@ namespace epics {
PVDataCreate* BaseRequestImpl::pvDataCreate = getPVDataCreate(); PVDataCreatePtr BaseRequestImpl::pvDataCreate = getPVDataCreate();
Status BaseRequestImpl::notInitializedStatus = Status(Status::STATUSTYPE_ERROR, "request not initialized"); Status BaseRequestImpl::notInitializedStatus = Status(Status::STATUSTYPE_ERROR, "request not initialized");
Status BaseRequestImpl::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed"); Status BaseRequestImpl::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed");
@@ -371,7 +373,7 @@ namespace epics {
if (pendingRequest & QOS_INIT) if (pendingRequest & QOS_INIT)
{ {
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
stopRequest(); stopRequest();
@@ -474,7 +476,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
ChannelGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelGet>(shared_from_this()); ChannelGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelGet>(shared_from_this());
PVStructure::shared_pointer nullPVStructure; PVStructure::shared_pointer nullPVStructure;
@@ -526,7 +528,7 @@ namespace epics {
if (pendingRequest & QOS_INIT) if (pendingRequest & QOS_INIT)
{ {
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
stopRequest(); stopRequest();
@@ -552,7 +554,7 @@ namespace epics {
// create data and its bitSet // create data and its bitSet
{ {
Lock lock(m_structureMutex); Lock lock(m_structureMutex);
m_structure.reset(transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); m_structure = transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
m_bitSet.reset(new BitSet(m_structure->getNumberFields())); m_bitSet.reset(new BitSet(m_structure->getNumberFields()));
} }
@@ -593,7 +595,19 @@ namespace epics {
return; return;
} }
} }
/*
// TODO bulk hack
if (lastRequest)
{
try {
m_channel->checkAndGetTransport()->flushSendQueue();
} catch (std::runtime_error &rte) {
stopRequest();
EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected));
}
return;
}
*/
if (!startRequest(lastRequest ? QOS_DESTROY | QOS_GET : QOS_DEFAULT)) { if (!startRequest(lastRequest ? QOS_DESTROY | QOS_GET : QOS_DEFAULT)) {
EXCEPTION_GUARD(m_channelGetRequester->getDone(otherRequestPendingStatus)); EXCEPTION_GUARD(m_channelGetRequester->getDone(otherRequestPendingStatus));
return; return;
@@ -602,6 +616,7 @@ namespace epics {
try { try {
TransportSender::shared_pointer thisSender = shared_from_this(); TransportSender::shared_pointer thisSender = shared_from_this();
m_channel->checkAndGetTransport()->enqueueSendRequest(thisSender); m_channel->checkAndGetTransport()->enqueueSendRequest(thisSender);
//TODO bulk hack m_channel->checkAndGetTransport()->enqueueOnlySendRequest(thisSender);
} catch (std::runtime_error &rte) { } catch (std::runtime_error &rte) {
stopRequest(); stopRequest();
EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected)); EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected));
@@ -665,7 +680,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
ChannelPut::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPut>(shared_from_this()); ChannelPut::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPut>(shared_from_this());
PVStructure::shared_pointer nullPVStructure; PVStructure::shared_pointer nullPVStructure;
@@ -717,7 +732,7 @@ namespace epics {
if (pendingRequest & QOS_INIT) if (pendingRequest & QOS_INIT)
{ {
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
else if (!(pendingRequest & QOS_GET)) else if (!(pendingRequest & QOS_GET))
{ {
@@ -752,7 +767,7 @@ namespace epics {
// create data and its bitSet // create data and its bitSet
{ {
Lock lock(m_structureMutex); Lock lock(m_structureMutex);
m_structure.reset(transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); m_structure = transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
m_bitSet.reset(new BitSet(m_structure->getNumberFields())); m_bitSet.reset(new BitSet(m_structure->getNumberFields()));
} }
@@ -897,7 +912,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
ChannelPutGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPutGet>(shared_from_this()); ChannelPutGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPutGet>(shared_from_this());
PVStructure::shared_pointer nullPVStructure; PVStructure::shared_pointer nullPVStructure;
@@ -947,7 +962,7 @@ namespace epics {
buffer->putByte((int8)QOS_INIT); buffer->putByte((int8)QOS_INIT);
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
else if (pendingRequest & (QOS_GET | QOS_GET_PUT)) { else if (pendingRequest & (QOS_GET | QOS_GET_PUT)) {
// noop // noop
@@ -983,8 +998,8 @@ namespace epics {
{ {
Lock lock(m_structureMutex); Lock lock(m_structureMutex);
m_putData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); m_putData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
m_getData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); m_getData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
} }
// notify // notify
@@ -1186,7 +1201,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
ChannelRPC::shared_pointer thisPointer = dynamic_pointer_cast<ChannelRPC>(shared_from_this()); ChannelRPC::shared_pointer thisPointer = dynamic_pointer_cast<ChannelRPC>(shared_from_this());
EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(pvRequestNull, thisPointer)); EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(pvRequestNull, thisPointer));
@@ -1235,14 +1250,14 @@ namespace epics {
buffer->putByte((int8)QOS_INIT); buffer->putByte((int8)QOS_INIT);
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
else else
{ {
{ {
// no need to lock here, since it is already locked via TransportSender IF // no need to lock here, since it is already locked via TransportSender IF
//Lock lock(m_structureMutex); //Lock lock(m_structureMutex);
m_channel->getTransport()->getIntrospectionRegistry()->serializeStructure(buffer, control, m_structure.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializeStructure(buffer, control, m_structure);
// release arguments structure // release arguments structure
m_structure.reset(); m_structure.reset();
} }
@@ -1382,7 +1397,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
ChannelArray::shared_pointer thisPointer = dynamic_pointer_cast<ChannelArray>(shared_from_this()); ChannelArray::shared_pointer thisPointer = dynamic_pointer_cast<ChannelArray>(shared_from_this());
PVArray::shared_pointer nullPVArray; PVArray::shared_pointer nullPVArray;
@@ -1430,7 +1445,7 @@ namespace epics {
if (pendingRequest & QOS_INIT) if (pendingRequest & QOS_INIT)
{ {
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
else if (pendingRequest & QOS_GET) else if (pendingRequest & QOS_GET)
{ {
@@ -1476,7 +1491,7 @@ namespace epics {
FieldConstPtr field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport.get()); FieldConstPtr field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport.get());
{ {
Lock lock(m_structureMutex); Lock lock(m_structureMutex);
m_structure.reset(dynamic_cast<PVArray*>(getPVDataCreate()->createPVField(0, field))); m_structure = dynamic_pointer_cast<PVArray>(getPVDataCreate()->createPVField(field));
} }
// notify // notify
@@ -1786,31 +1801,6 @@ namespace epics {
class MonitorElementImpl : public MonitorElement
{
public:
PVStructure::shared_pointer m_pvStructure;
BitSet::shared_pointer m_changedBitSet;
BitSet::shared_pointer m_overrunBitSet;
virtual PVStructure::shared_pointer const & getPVStructure()
{
return m_pvStructure;
}
virtual BitSet::shared_pointer const & getChangedBitSet()
{
return m_changedBitSet;
}
virtual BitSet::shared_pointer const & getOverrunBitSet()
{
return m_overrunBitSet;
}
};
class MonitorStrategy : public Monitor { class MonitorStrategy : public Monitor {
public: public:
virtual ~MonitorStrategy() {}; virtual ~MonitorStrategy() {};
@@ -1837,7 +1827,7 @@ namespace epics {
public: public:
MonitorStrategyNotify(MonitorRequester::shared_pointer const & callback) : MonitorStrategyNotify(MonitorRequester::shared_pointer const & callback) :
m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElementImpl()) m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElement())
{ {
} }
@@ -1857,7 +1847,7 @@ namespace epics {
m_callback->monitorEvent(thisMonitor); m_callback->monitorEvent(thisMonitor);
} }
virtual MonitorElement::shared_pointer const & poll() { virtual MonitorElement::shared_pointer poll() {
Lock guard(m_mutex); Lock guard(m_mutex);
if (m_gotMonitor) if (m_gotMonitor)
return m_nullMonitorElement; return m_nullMonitorElement;
@@ -1865,7 +1855,7 @@ namespace epics {
return m_monitorElement; return m_monitorElement;
} }
virtual void release(MonitorElement::shared_pointer const & monitorElement) { virtual void release(MonitorElement::shared_pointer & monitorElement) {
Lock guard(m_mutex); Lock guard(m_mutex);
m_gotMonitor = false; m_gotMonitor = false;
} }
@@ -1896,12 +1886,11 @@ namespace epics {
MonitorElement::shared_pointer m_nullMonitorElement; MonitorElement::shared_pointer m_nullMonitorElement;
MonitorElement::shared_pointer m_monitorElement; MonitorElement::shared_pointer m_monitorElement;
std::tr1::shared_ptr<MonitorElementImpl> m_monitorElementImpl;
public: public:
MonitorStrategyEntire(MonitorRequester::shared_pointer const & callback) : MonitorStrategyEntire(MonitorRequester::shared_pointer const & callback) :
m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElementImpl()), m_monitorElementImpl(static_pointer_cast<MonitorElementImpl>(m_monitorElement)) m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElement())
{ {
} }
@@ -1912,24 +1901,24 @@ namespace epics {
virtual void init(StructureConstPtr const & structure) { virtual void init(StructureConstPtr const & structure) {
Lock guard(m_mutex); Lock guard(m_mutex);
m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure)); m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure);
int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields(); int numberFields = m_monitorElement->pvStructurePtr->getNumberFields();
m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields)); m_monitorElement->changedBitSet.reset(new BitSet(numberFields));
m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields)); m_monitorElement->overrunBitSet.reset(new BitSet(numberFields));
} }
virtual void response(Transport::shared_pointer const & transport, ByteBuffer* payloadBuffer) { virtual void response(Transport::shared_pointer const & transport, ByteBuffer* payloadBuffer) {
Lock guard(m_mutex); Lock guard(m_mutex);
// simply deserialize and notify // simply deserialize and notify
m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get()); m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get());
m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get()); m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get());
m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get()); m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get());
m_gotMonitor = true; m_gotMonitor = true;
Monitor::shared_pointer thisMonitor = shared_from_this(); Monitor::shared_pointer thisMonitor = shared_from_this();
m_callback->monitorEvent(thisMonitor); m_callback->monitorEvent(thisMonitor);
} }
virtual MonitorElement::shared_pointer const & poll() { virtual MonitorElement::shared_pointer poll() {
Lock guard(m_mutex); Lock guard(m_mutex);
if (m_gotMonitor) if (m_gotMonitor)
return m_nullMonitorElement; return m_nullMonitorElement;
@@ -1937,7 +1926,7 @@ namespace epics {
return m_monitorElement; return m_monitorElement;
} }
virtual void release(MonitorElement::shared_pointer const & monitorElement) { virtual void release(MonitorElement::shared_pointer & monitorElement) {
Lock guard(m_mutex); Lock guard(m_mutex);
m_gotMonitor = false; m_gotMonitor = false;
} }
@@ -1976,13 +1965,12 @@ namespace epics {
MonitorElement::shared_pointer m_nullMonitorElement; MonitorElement::shared_pointer m_nullMonitorElement;
MonitorElement::shared_pointer m_monitorElement; MonitorElement::shared_pointer m_monitorElement;
std::tr1::shared_ptr<MonitorElementImpl> m_monitorElementImpl;
public: public:
MonitorStrategySingle(MonitorRequester::shared_pointer callback) : MonitorStrategySingle(MonitorRequester::shared_pointer callback) :
m_callback(callback), m_gotMonitor(false), m_mutex(), m_callback(callback), m_gotMonitor(false), m_mutex(),
m_needToCompress(false), m_monitorElement(new MonitorElementImpl()), m_monitorElementImpl(static_pointer_cast<MonitorElementImpl>(m_monitorElement)) m_needToCompress(false), m_monitorElement(new MonitorElement())
{ {
} }
@@ -1993,10 +1981,10 @@ namespace epics {
virtual void init(StructureConstPtr const & structure) { virtual void init(StructureConstPtr const & structure) {
Lock guard(m_mutex); Lock guard(m_mutex);
m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure)); m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure);
int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields(); int numberFields = m_monitorElement->pvStructurePtr->getNumberFields();
m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields)); m_monitorElement->changedBitSet.reset(new BitSet(numberFields));
m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields)); m_monitorElement->overrunBitSet.reset(new BitSet(numberFields));
m_structureChangeBitSet.reset(new BitSet(numberFields)); m_structureChangeBitSet.reset(new BitSet(numberFields));
m_structureOverrunBitSet.reset(new BitSet(numberFields)); m_structureOverrunBitSet.reset(new BitSet(numberFields));
@@ -2009,9 +1997,9 @@ namespace epics {
if (!m_gotMonitor) if (!m_gotMonitor)
{ {
// simply deserialize and notify // simply deserialize and notify
m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get()); m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get());
m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get()); m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get());
m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get()); m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get());
m_gotMonitor = true; m_gotMonitor = true;
Monitor::shared_pointer thisMonitor = shared_from_this(); Monitor::shared_pointer thisMonitor = shared_from_this();
m_callback->monitorEvent(thisMonitor); m_callback->monitorEvent(thisMonitor);
@@ -2020,48 +2008,48 @@ namespace epics {
{ {
// deserialize first // deserialize first
m_structureChangeBitSet->deserialize(payloadBuffer, transport.get()); m_structureChangeBitSet->deserialize(payloadBuffer, transport.get());
m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_structureChangeBitSet.get()); m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_structureChangeBitSet.get());
m_structureOverrunBitSet->deserialize(payloadBuffer, transport.get()); m_structureOverrunBitSet->deserialize(payloadBuffer, transport.get());
// OR local overrun // OR local overrun
// TODO should work only on uncompressed // TODO should work only on uncompressed
m_monitorElementImpl->m_overrunBitSet->or_and(*m_structureChangeBitSet.get(), *m_monitorElementImpl->m_changedBitSet.get()); m_monitorElement->overrunBitSet->or_and(*m_structureChangeBitSet.get(), *m_monitorElement->changedBitSet.get());
// OR new changes // OR new changes
*(m_monitorElementImpl->m_changedBitSet) |= *m_structureChangeBitSet.get(); *(m_monitorElement->changedBitSet) |= *m_structureChangeBitSet.get();
// OR remote overrun // OR remote overrun
*(m_monitorElementImpl->m_overrunBitSet) |= *m_structureOverrunBitSet.get(); *(m_monitorElement->overrunBitSet) |= *m_structureOverrunBitSet.get();
} }
} }
virtual MonitorElement::shared_pointer const & poll() { virtual MonitorElement::shared_pointer poll() {
Lock guard(m_mutex); Lock guard(m_mutex);
if (!m_gotMonitor) return m_nullMonitorElement; if (!m_gotMonitor) return m_nullMonitorElement;
// compress if needed // compress if needed
if (m_needToCompress) if (m_needToCompress)
{ {
BitSetUtil::compress(m_monitorElementImpl->m_changedBitSet.get(), m_monitorElementImpl->m_pvStructure.get()); BitSetUtil::compress(m_monitorElement->changedBitSet.get(), m_monitorElement->pvStructurePtr.get());
BitSetUtil::compress(m_monitorElementImpl->m_overrunBitSet.get(), m_monitorElementImpl->m_pvStructure.get()); BitSetUtil::compress(m_monitorElement->overrunBitSet.get(), m_monitorElement->pvStructurePtr.get());
m_needToCompress = false; m_needToCompress = false;
} }
return m_monitorElement; return m_monitorElement;
} }
virtual void release(MonitorElement::shared_pointer const & monitorElement) { virtual void release(MonitorElement::shared_pointer & monitorElement) {
Lock guard(m_mutex); Lock guard(m_mutex);
m_gotMonitor = false; m_gotMonitor = false;
} }
Status start() { Status start() {
Lock guard(m_mutex); Lock guard(m_mutex);
if (!m_monitorElementImpl->m_changedBitSet.get()) if (!m_monitorElement->changedBitSet.get())
return Status(Status::STATUSTYPE_ERROR, "Monitor not connected."); return Status(Status::STATUSTYPE_ERROR, "Monitor not connected.");
m_gotMonitor = false; m_gotMonitor = false;
m_monitorElementImpl->m_changedBitSet->clear(); m_monitorElement->changedBitSet->clear();
m_monitorElementImpl->m_overrunBitSet->clear(); m_monitorElement->overrunBitSet->clear();
return Status::Ok; return Status::Ok;
} }
@@ -2104,7 +2092,7 @@ namespace epics {
{ {
BaseRequestImpl::activate(); BaseRequestImpl::activate();
if (m_pvRequest.get() == 0) if (m_pvRequest == 0)
{ {
Monitor::shared_pointer thisPointer = dynamic_pointer_cast<Monitor>(shared_from_this()); Monitor::shared_pointer thisPointer = dynamic_pointer_cast<Monitor>(shared_from_this());
StructureConstPtr nullPVStructure; StructureConstPtr nullPVStructure;
@@ -2113,10 +2101,10 @@ namespace epics {
} }
int queueSize = 2; int queueSize = 2;
PVField* pvField = m_pvRequest->getSubField("record.queueSize"); PVFieldPtr pvField = m_pvRequest->getSubField("record.queueSize");
if (pvField) { if (pvField.get()) {
PVString* pvString = dynamic_cast<PVString*>(pvField); PVStringPtr pvString = dynamic_pointer_cast<PVString>(pvField);
if (pvString) if (pvString.get())
{ {
String value = pvString->get(); String value = pvString->get();
@@ -2184,7 +2172,7 @@ namespace epics {
if (pendingRequest & QOS_INIT) if (pendingRequest & QOS_INIT)
{ {
// pvRequest // pvRequest
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
} }
stopRequest(); stopRequest();
@@ -2336,12 +2324,12 @@ namespace epics {
BaseRequestImpl::destroy(); BaseRequestImpl::destroy();
} }
virtual MonitorElement::shared_pointer const & poll() virtual MonitorElement::shared_pointer poll()
{ {
return m_monitorStrategy->poll(); return m_monitorStrategy->poll();
} }
virtual void release(MonitorElement::shared_pointer const & monitorElement) virtual void release(MonitorElement::shared_pointer & monitorElement)
{ {
m_monitorStrategy->release(monitorElement); m_monitorStrategy->release(monitorElement);
} }
@@ -2396,7 +2384,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
char ipAddrStr[48]; char ipAddrStr[48];
ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr)); ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr));
@@ -2420,7 +2408,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer);
@@ -2449,7 +2437,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer);
@@ -2512,7 +2500,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
// reception timestamp // reception timestamp
TimeStamp timestamp; TimeStamp timestamp;
@@ -2560,17 +2548,16 @@ namespace epics {
// TODO smart pointers // TODO smart pointers
// extra data // extra data
PVFieldPtr data = 0; PVFieldPtr data;
const FieldConstPtr field = IntrospectionRegistry::deserializeFull(payloadBuffer, transport.get()); const FieldConstPtr field = IntrospectionRegistry::deserializeFull(payloadBuffer, transport.get());
if (field != 0) if (field != 0)
{ {
data = getPVDataCreate()->createPVField(0, field); data = getPVDataCreate()->createPVField(field);
data->deserialize(payloadBuffer, transport.get()); data->deserialize(payloadBuffer, transport.get());
} }
// notify beacon handler // notify beacon handler
beaconHandler->beaconNotify(responseFrom, version, &timestamp, &startupTimestamp, sequentalID, data); beaconHandler->beaconNotify(responseFrom, version, &timestamp, &startupTimestamp, sequentalID, data);
if (data) delete data;
} }
}; };
@@ -2586,7 +2573,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer);
@@ -2616,7 +2603,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer);
@@ -2653,7 +2640,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
{ {
AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer);
@@ -2734,7 +2721,7 @@ namespace epics {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
if (command < 0 || command >= (int8)m_handlerTable.size()) if (command < 0 || command >= (int8)m_handlerTable.size())
{ {
@@ -3053,7 +3040,7 @@ namespace epics {
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
int32_t& getUserValue() { return m_userValue; } int32_t& getUserValue() { return m_userValue; }

View File

@@ -23,17 +23,28 @@ DefaultBeaconServerStatusProvider::~DefaultBeaconServerStatusProvider()
void DefaultBeaconServerStatusProvider::initialize() void DefaultBeaconServerStatusProvider::initialize()
{ {
FieldCreate* fieldCreate = getFieldCreate(); FieldCreatePtr fieldCreate = getFieldCreate();
FieldConstPtrArray fields = new FieldConstPtr[6];
// TODO hierarchy can be used...
fields[0] = fieldCreate->createScalar("connections",pvInt);
fields[1] = fieldCreate->createScalar("allocatedMemory",pvLong);
fields[2] = fieldCreate->createScalar("freeMemory",pvLong);
fields[3] = fieldCreate->createScalar("threads",pvInt);
fields[4] = fieldCreate->createScalar("deadlocks",pvInt);
fields[5] = fieldCreate->createScalar("averageSystemLoad",pvDouble);
_status.reset(getPVDataCreate()->createPVStructure(0,"status",6,fields)); StringArray fieldNames;
fieldNames.resize(6);
fieldNames[0] = "connections";
fieldNames[1] = "allocatedMemory";
fieldNames[2] = "freeMemory";
fieldNames[3] = "threads";
fieldNames[4] = "deadlocks";
fieldNames[5] = "averageSystemLoad";
FieldConstPtrArray fields;
fields.resize(6);
// TODO hierarchy can be used...
fields[0] = fieldCreate->createScalar(pvInt);
fields[1] = fieldCreate->createScalar(pvLong);
fields[2] = fieldCreate->createScalar(pvLong);
fields[3] = fieldCreate->createScalar(pvInt);
fields[4] = fieldCreate->createScalar(pvInt);
fields[5] = fieldCreate->createScalar(pvDouble);
_status = getPVDataCreate()->createPVStructure(fieldCreate->createStructure(fieldNames, fields));
} }
PVField::shared_pointer DefaultBeaconServerStatusProvider::getServerStatusData() PVField::shared_pointer DefaultBeaconServerStatusProvider::getServerStatusData()

View File

@@ -28,7 +28,7 @@ namespace pvAccess {
void ServerBadResponse::handleResponse(osiSockAddr* responseFrom, void ServerBadResponse::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -74,7 +74,7 @@ ServerResponseHandler::ServerResponseHandler(ServerContextImpl::shared_pointer c
void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom, void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
if(command<0||command>=(int8)m_handlerTable.size()) if(command<0||command>=(int8)m_handlerTable.size())
{ {
@@ -98,7 +98,7 @@ void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom,
void ServerConnectionValidationHandler::handleResponse( void ServerConnectionValidationHandler::handleResponse(
osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version,
int8 command, int payloadSize, int8 command, size_t payloadSize,
ByteBuffer* payloadBuffer) ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
@@ -116,7 +116,7 @@ void ServerConnectionValidationHandler::handleResponse(
void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom, void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -128,7 +128,7 @@ void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom,
void ServerIntrospectionSearchHandler::handleResponse(osiSockAddr* responseFrom, void ServerIntrospectionSearchHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -149,7 +149,7 @@ ServerSearchHandler::~ServerSearchHandler()
void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom, void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -273,7 +273,7 @@ void ServerChannelFindRequesterImpl::send(ByteBuffer* buffer, TransportSendContr
/****************************************************************************************/ /****************************************************************************************/
void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom, void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -424,7 +424,7 @@ String ServerChannelRequesterImpl::getRequesterName()
void ServerChannelRequesterImpl::message(const String message, const MessageType messageType) void ServerChannelRequesterImpl::message(const String message, const MessageType messageType)
{ {
LOG(logLevelDebug, "[%s] %s", messageTypeName[messageType].c_str(), message.c_str()); LOG(logLevelDebug, "[%s] %s", getMessageTypeName(messageType).c_str(), message.c_str());
} }
void ServerChannelRequesterImpl::lock() void ServerChannelRequesterImpl::lock()
@@ -479,7 +479,7 @@ void ServerChannelRequesterImpl::createChannelFailedResponse(ByteBuffer* buffer,
void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom, void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -520,7 +520,7 @@ void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom,
void ServerGetHandler::handleResponse(osiSockAddr* responseFrom, void ServerGetHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) size_t payloadSize, ByteBuffer* payloadBuffer)
{ {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -710,7 +710,7 @@ void ServerChannelGetRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
/****************************************************************************************/ /****************************************************************************************/
void ServerPutHandler::handleResponse(osiSockAddr* responseFrom, void ServerPutHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -922,7 +922,7 @@ void ServerChannelPutRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
/****************************************************************************************/ /****************************************************************************************/
void ServerPutGetHandler::handleResponse(osiSockAddr* responseFrom, void ServerPutGetHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1152,7 +1152,7 @@ void ServerChannelPutGetRequesterImpl::send(ByteBuffer* buffer, TransportSendCon
/****************************************************************************************/ /****************************************************************************************/
void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom, void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1246,7 +1246,7 @@ void ServerMonitorRequesterImpl::activate(PVStructure::shared_pointer const & pv
INIT_EXCEPTION_GUARD(CMD_MONITOR, _channelMonitor = _channel->getChannel()->createMonitor(thisPointer, pvRequest)); INIT_EXCEPTION_GUARD(CMD_MONITOR, _channelMonitor = _channel->getChannel()->createMonitor(thisPointer, pvRequest));
} }
void ServerMonitorRequesterImpl::monitorConnect(const Status& status, Monitor::shared_pointer const & monitor, epics::pvData::StructureConstPtr const & structure) void ServerMonitorRequesterImpl::monitorConnect(const Status& status, Monitor::shared_pointer & monitor, epics::pvData::StructureConstPtr const & structure)
{ {
{ {
Lock guard(_mutex); Lock guard(_mutex);
@@ -1352,14 +1352,14 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
buffer->putByte((int8)request); buffer->putByte((int8)request);
// changedBitSet and data, if not notify only (i.e. queueSize == -1) // changedBitSet and data, if not notify only (i.e. queueSize == -1)
BitSet::shared_pointer changedBitSet = element->getChangedBitSet(); BitSet::shared_pointer changedBitSet = element->changedBitSet;
if (changedBitSet != NULL) if (changedBitSet != NULL)
{ {
changedBitSet->serialize(buffer, control); changedBitSet->serialize(buffer, control);
element->getPVStructure()->serialize(buffer, control, changedBitSet.get()); element->pvStructurePtr->serialize(buffer, control, changedBitSet.get());
// overrunBitset // overrunBitset
element->getOverrunBitSet()->serialize(buffer, control); element->overrunBitSet->serialize(buffer, control);
} }
monitor->release(element); monitor->release(element);
@@ -1370,7 +1370,7 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
/****************************************************************************************/ /****************************************************************************************/
void ServerArrayHandler::handleResponse(osiSockAddr* responseFrom, void ServerArrayHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1595,7 +1595,7 @@ void ServerChannelArrayRequesterImpl::send(ByteBuffer* buffer, TransportSendCont
/****************************************************************************************/ /****************************************************************************************/
void ServerCancelRequestHandler::handleResponse(osiSockAddr* responseFrom, void ServerCancelRequestHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1635,7 +1635,7 @@ void ServerCancelRequestHandler::failureResponse(Transport::shared_pointer const
/****************************************************************************************/ /****************************************************************************************/
void ServerProcessHandler::handleResponse(osiSockAddr* responseFrom, void ServerProcessHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1794,7 +1794,7 @@ void ServerChannelProcessRequesterImpl::send(ByteBuffer* buffer, TransportSendCo
/****************************************************************************************/ /****************************************************************************************/
void ServerGetFieldHandler::handleResponse(osiSockAddr* responseFrom, void ServerGetFieldHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -1873,7 +1873,7 @@ void ServerGetFieldRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
/****************************************************************************************/ /****************************************************************************************/
void ServerRPCHandler::handleResponse(osiSockAddr* responseFrom, void ServerRPCHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, Transport::shared_pointer const & transport, int8 version, int8 command,
int payloadSize, ByteBuffer* payloadBuffer) { size_t payloadSize, ByteBuffer* payloadBuffer) {
AbstractServerResponseHandler::handleResponse(responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom,
transport, version, command, payloadSize, payloadBuffer); transport, version, command, payloadSize, payloadBuffer);
@@ -2034,7 +2034,7 @@ void ServerChannelRPCRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
} }
else else
{ {
introspectionRegistry->serializeStructure(buffer, control, _pvResponse.get()); introspectionRegistry->serializeStructure(buffer, control, _pvResponse);
} }
} }
} }

View File

@@ -43,7 +43,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
/** /**
@@ -58,7 +58,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private: private:
/** /**
* Table of response handlers for each command ID. * Table of response handlers for each command ID.
@@ -78,7 +78,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
/** /**
@@ -102,7 +102,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class EchoTransportSender : public TransportSender { class EchoTransportSender : public TransportSender {
@@ -142,7 +142,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
/****************************************************************************************/ /****************************************************************************************/
@@ -161,7 +161,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private: private:
std::vector<ChannelProvider::shared_pointer> _providers; std::vector<ChannelProvider::shared_pointer> _providers;
@@ -208,7 +208,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private: private:
void disconnect(Transport::shared_pointer const & transport); void disconnect(Transport::shared_pointer const & transport);
@@ -257,7 +257,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
@@ -299,7 +299,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelGetRequesterImpl : class ServerChannelGetRequesterImpl :
@@ -352,7 +352,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelPutRequesterImpl : class ServerChannelPutRequesterImpl :
@@ -405,7 +405,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelPutGetRequesterImpl : class ServerChannelPutGetRequesterImpl :
@@ -459,7 +459,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
@@ -482,7 +482,7 @@ namespace pvAccess {
ServerChannelImpl::shared_pointer const & channel, const pvAccessID ioid, ServerChannelImpl::shared_pointer const & channel, const pvAccessID ioid,
Transport::shared_pointer const & transport,epics::pvData::PVStructure::shared_pointer const & pvRequest); Transport::shared_pointer const & transport,epics::pvData::PVStructure::shared_pointer const & pvRequest);
void monitorConnect(const epics::pvData::Status& status, epics::pvData::Monitor::shared_pointer const & monitor, epics::pvData::StructureConstPtr const & structure); void monitorConnect(const epics::pvData::Status& status, epics::pvData::Monitor::shared_pointer & monitor, epics::pvData::StructureConstPtr const & structure);
void unlisten(epics::pvData::Monitor::shared_pointer const & monitor); void unlisten(epics::pvData::Monitor::shared_pointer const & monitor);
void monitorEvent(epics::pvData::Monitor::shared_pointer const & monitor); void monitorEvent(epics::pvData::Monitor::shared_pointer const & monitor);
void lock(); void lock();
@@ -511,7 +511,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelArrayRequesterImpl : class ServerChannelArrayRequesterImpl :
@@ -565,7 +565,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private: private:
void failureResponse(Transport::shared_pointer const & transport, pvAccessID ioid, const epics::pvData::Status& errorStatus); void failureResponse(Transport::shared_pointer const & transport, pvAccessID ioid, const epics::pvData::Status& errorStatus);
@@ -585,7 +585,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelProcessRequesterImpl : class ServerChannelProcessRequesterImpl :
@@ -634,7 +634,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
private: private:
void getFieldFailureResponse(Transport::shared_pointer const & transport, const pvAccessID ioid, const epics::pvData::Status& errorStatus); void getFieldFailureResponse(Transport::shared_pointer const & transport, const pvAccessID ioid, const epics::pvData::Status& errorStatus);
}; };
@@ -706,7 +706,7 @@ namespace pvAccess {
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command,
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer);
}; };
class ServerChannelRPCRequesterImpl : class ServerChannelRPCRequesterImpl :

View File

@@ -17,15 +17,11 @@ namespace pvAccess {
const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1; const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1;
const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2; const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2;
const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3; const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3;
PVDataCreate* IntrospectionRegistry::_pvDataCreate = 0; PVDataCreatePtr IntrospectionRegistry::_pvDataCreate (getPVDataCreate());
FieldCreate* IntrospectionRegistry::_fieldCreate = 0; FieldCreatePtr IntrospectionRegistry::_fieldCreate(getFieldCreate());
IntrospectionRegistry::IntrospectionRegistry(bool serverSide) IntrospectionRegistry::IntrospectionRegistry(bool serverSide)
{ {
// TODO not optimal
_pvDataCreate = getPVDataCreate();
_fieldCreate = getFieldCreate();
_direction = serverSide ? 1 : -1; _direction = serverSide ? 1 : -1;
reset(); reset();
} }
@@ -181,7 +177,7 @@ void IntrospectionRegistry::serialize(FieldConstPtr field, StructureConstPtr par
FieldConstPtr IntrospectionRegistry::deserialize(ByteBuffer* buffer, DeserializableControl* control, IntrospectionRegistry* registry) FieldConstPtr IntrospectionRegistry::deserialize(ByteBuffer* buffer, DeserializableControl* control, IntrospectionRegistry* registry)
{ {
control->ensureData(1); control->ensureData(1);
uintptr_t pos = buffer->getPosition(); size_t pos = buffer->getPosition();
const int8 typeCode = buffer->getByte(); const int8 typeCode = buffer->getByte();
if(typeCode == IntrospectionRegistry::NULL_TYPE_CODE) if(typeCode == IntrospectionRegistry::NULL_TYPE_CODE)
{ {
@@ -225,12 +221,11 @@ void IntrospectionRegistry::serializeStructure(ByteBuffer* buffer, SerializableC
PVStructurePtr IntrospectionRegistry::deserializeStructure(ByteBuffer* buffer, DeserializableControl* control) PVStructurePtr IntrospectionRegistry::deserializeStructure(ByteBuffer* buffer, DeserializableControl* control)
{ {
PVStructurePtr pvStructure = NULL; PVStructurePtr pvStructure;
FieldConstPtr structureField = deserialize(buffer, control); FieldConstPtr structureField = deserialize(buffer, control);
if (structureField != NULL) if (structureField.get() != NULL)
{ {
pvStructure = _pvDataCreate->createPVStructure(NULL, pvStructure = _pvDataCreate->createPVStructure(static_pointer_cast<const Structure>(structureField));
static_pointer_cast<const Structure>(structureField));
pvStructure->deserialize(buffer, control); pvStructure->deserialize(buffer, control);
} }
return pvStructure; return pvStructure;
@@ -252,12 +247,9 @@ PVStructurePtr IntrospectionRegistry::deserializeStructureAndCreatePVStructure(B
{ {
FieldConstPtr field = deserialize(buffer, control); FieldConstPtr field = deserialize(buffer, control);
if (field == NULL) if (field == NULL)
{ return PVStructurePtr();
return NULL;
} return _pvDataCreate->createPVStructure(static_pointer_cast<const Structure>(field));
PVStructurePtr retVal = _pvDataCreate->createPVStructure(NULL,
static_pointer_cast<const Structure>(field));
return retVal;
} }
void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status) void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status)

View File

@@ -211,12 +211,12 @@ typedef std::map<const short,epics::pvData::FieldConstPtr> registryMap_t;
/** /**
* PVField factory. * PVField factory.
*/ */
static epics::pvData::PVDataCreate* _pvDataCreate; static epics::pvData::PVDataCreatePtr _pvDataCreate;
/** /**
* Field factory. * Field factory.
*/ */
static epics::pvData::FieldCreate* _fieldCreate; static epics::pvData::FieldCreatePtr _fieldCreate;
bool registryContainsValue(epics::pvData::FieldConstPtr field, short& key); bool registryContainsValue(epics::pvData::FieldConstPtr field, short& key);
}; };

View File

@@ -124,13 +124,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
{ {
PVFieldPtrArray fieldsData = data->getPVFields(); PVFieldPtrArray fieldsData = data->getPVFields();
if (fieldsData != 0) { int length = data->getStructure()->getNumberFields();
int length = data->getStructure()->getNumberFields(); for(int i=0; i<length; i++) {
for(int i=0; i<length; i++) { PVFieldPtr fieldField = fieldsData[i];
PVField *fieldField = fieldsData[i]; convertToString(buffer,fieldField.get(),notFirst + 1);
convertToString(buffer,fieldField,notFirst + 1); }
}
}
} }
void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
@@ -142,9 +140,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv); PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv);
BooleanArrayData data = BooleanArrayData(); BooleanArrayData data = BooleanArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
BooleanArray value = data.data; BooleanArray value = data.data;
if(value[data.offset]) { if(value[data.offset]) {
@@ -163,9 +161,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVByteArray *pvdata = static_cast<PVByteArray*>(pv); PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
ByteArrayData data = ByteArrayData(); ByteArrayData data = ByteArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -182,9 +180,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVShortArray *pvdata = static_cast<PVShortArray*>(pv); PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
ShortArrayData data = ShortArrayData(); ShortArrayData data = ShortArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -201,9 +199,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVIntArray *pvdata = static_cast<PVIntArray*>(pv); PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
IntArrayData data = IntArrayData(); IntArrayData data = IntArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -220,9 +218,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVLongArray *pvdata = static_cast<PVLongArray*>(pv); PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
LongArrayData data = LongArrayData(); LongArrayData data = LongArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int64 val = data.data[data.offset]; int64 val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -239,9 +237,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv); PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
FloatArrayData data = FloatArrayData(); FloatArrayData data = FloatArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
float val = data.data[data.offset]; float val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -258,9 +256,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv); PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
DoubleArrayData data = DoubleArrayData(); DoubleArrayData data = DoubleArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
double val = data.data[data.offset]; double val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -277,9 +275,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVStringArray *pvdata = static_cast<PVStringArray*>(pv); PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
StringArrayData data = StringArrayData(); StringArrayData data = StringArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
StringArray value = data.data; StringArray value = data.data;
if(num==1) { if(num==1) {
if(value[data.offset].length()>0) { if(value[data.offset].length()>0) {
@@ -307,13 +305,13 @@ void convertStructureArray(StringBuilder buffer,
return; return;
} }
StructureArrayData data = StructureArrayData(); StructureArrayData data = StructureArrayData();
pvdata->get(0, length, &data); pvdata->get(0, length, data);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
PVStructure *pvStructure = data.data[i]; PVStructurePtr pvStructure = data.data[i];
if (pvStructure == 0) { if (pvStructure == 0) {
*buffer += "null"; *buffer += "null";
} else { } else {
convertToString(buffer,pvStructure,notFirst+1); convertToString(buffer,pvStructure.get(),notFirst+1);
} }
} }
} }
@@ -369,8 +367,8 @@ char *url_encode(char *str) {
void formatNTTable(StringBuilder buffer, PVStructure *pvStruct) void formatNTTable(StringBuilder buffer, PVStructure *pvStruct)
{ {
PVStringArray* labels = static_cast<PVStringArray*>(pvStruct->getScalarArrayField("labels", pvString)); PVStringArrayPtr labels = static_pointer_cast<PVStringArray>(pvStruct->getScalarArrayField("labels", pvString));
if (labels == 0) if (labels.get() == 0)
return; // TODO return; // TODO
int numColumns = labels->getLength(); int numColumns = labels->getLength();
@@ -379,23 +377,24 @@ void formatNTTable(StringBuilder buffer, PVStructure *pvStruct)
// next numColumns fields are columns // next numColumns fields are columns
int maxValues = 0; int maxValues = 0;
vector<DoubleArrayData> columnData; // vector<DoubleArrayData> columnData;
vector<vector<double>*> columnData;
PVFieldPtrArray fields = pvStruct->getPVFields(); PVFieldPtrArray fields = pvStruct->getPVFields();
for (int i = 0; i < numColumns; i++) for (int i = 0; i < numColumns; i++)
{ {
DoubleArrayData values; DoubleArrayData values;
// TODO we relay on field ordering here (normativeType, labels, <columns>) // TODO we relay on field ordering here (normativeType, labels, <columns>)
PVDoubleArray* arrayField = static_cast<PVDoubleArray*>(fields[i+2]); PVDoubleArrayPtr arrayField = static_pointer_cast<PVDoubleArray>(fields[i+2]);
int count = arrayField->get(0, arrayField->getLength(), &values); int count = arrayField->get(0, arrayField->getLength(), values);
if (count > maxValues) maxValues = count; if (count > maxValues) maxValues = count;
columnData.push_back(values); columnData.push_back(&values.data);
} }
std::cout << std::left; std::cout << std::left;
// first print labels // first print labels
StringArrayData data; StringArrayData data;
labels->get(0, numColumns, &data); labels->get(0, numColumns, data);
for (int i = 0; i < numColumns; i++) for (int i = 0; i < numColumns; i++)
{ {
std::cout << std::setw(16) << data.data[i]; std::cout << std::setw(16) << data.data[i];
@@ -408,7 +407,8 @@ void formatNTTable(StringBuilder buffer, PVStructure *pvStruct)
{ {
for (int i = 0; i < numColumns; i++) for (int i = 0; i < numColumns; i++)
{ {
std::cout << std::setw(16) << columnData[i].data[r]; // std::cout << std::setw(16) << columnData[i].data[r];
std::cout << std::setw(16) << (*columnData[i])[r];
} }
std::cout << std::endl; std::cout << std::endl;
} }
@@ -422,8 +422,8 @@ void toNTString(StringBuilder buffer, PVField *pv,int notFirst)
{ {
PVStructure* pvStruct = static_cast<PVStructure*>(pv); PVStructure* pvStruct = static_cast<PVStructure*>(pv);
// TODO type check, getStringField is verbose // TODO type check, getStringField is verbose
PVString* ntType = static_cast<PVString*>(pvStruct->getSubField("normativeType")); PVStringPtr ntType = static_pointer_cast<PVString>(pvStruct->getSubField("normativeType"));
if (ntType) if (ntType.get())
{ {
String value = ntType->get(); String value = ntType->get();
@@ -508,7 +508,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet,
@@ -610,7 +610,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC) virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC)
@@ -713,7 +713,7 @@ public:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)
@@ -935,15 +935,17 @@ int main (int argc, char *argv[])
} }
int i = 0; int i = 0;
FieldConstPtrArray fields = new FieldConstPtr[parameters.size()]; StringArray fieldNames(parameters.size());
FieldConstPtrArray fields(parameters.size());
for (vector< pair<string, string> >::iterator iter = parameters.begin(); for (vector< pair<string, string> >::iterator iter = parameters.begin();
iter != parameters.end(); iter != parameters.end();
iter++, i++) iter++, i++)
{ {
fields[i] = getFieldCreate()->createScalar(iter->first, pvString); fieldNames[i] = iter->first;
fields[i] = getFieldCreate()->createScalar(pvString);
} }
PVStructure::shared_pointer args( PVStructure::shared_pointer args(
new PVStructure(NULL, getFieldCreate()->createStructure("", parameters.size(), fields))); new PVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
for (vector< pair<string, string> >::iterator iter = parameters.begin(); for (vector< pair<string, string> >::iterator iter = parameters.begin();
iter != parameters.end(); iter != parameters.end();
iter++) iter++)

View File

@@ -123,16 +123,14 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
{ {
PVFieldPtrArray fieldsData = data->getPVFields(); PVFieldPtrArray fieldsData = data->getPVFields();
if (fieldsData != 0) { int length = data->getStructure()->getNumberFields();
int length = data->getStructure()->getNumberFields(); for(int i=0; i<length; i++) {
for(int i=0; i<length; i++) { PVFieldPtr fieldField = fieldsData[i];
PVField *fieldField = fieldsData[i]; convertToString(buffer,fieldField.get(),notFirst + 1);
convertToString(buffer,fieldField,notFirst + 1); }
}
}
} }
void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) void convertArray(StringBuilder buffer,PVScalarArray *pv,int notFirst)
{ {
ScalarArrayConstPtr array = pv->getScalarArray(); ScalarArrayConstPtr array = pv->getScalarArray();
ScalarType type = array->getElementType(); ScalarType type = array->getElementType();
@@ -141,9 +139,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv); PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv);
BooleanArrayData data = BooleanArrayData(); BooleanArrayData data = BooleanArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
BooleanArray value = data.data; BooleanArray value = data.data;
if(value[data.offset]) { if(value[data.offset]) {
@@ -162,9 +160,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVByteArray *pvdata = static_cast<PVByteArray*>(pv); PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
ByteArrayData data = ByteArrayData(); ByteArrayData data = ByteArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -181,9 +179,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVShortArray *pvdata = static_cast<PVShortArray*>(pv); PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
ShortArrayData data = ShortArrayData(); ShortArrayData data = ShortArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -200,9 +198,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVIntArray *pvdata = static_cast<PVIntArray*>(pv); PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
IntArrayData data = IntArrayData(); IntArrayData data = IntArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -219,9 +217,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVLongArray *pvdata = static_cast<PVLongArray*>(pv); PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
LongArrayData data = LongArrayData(); LongArrayData data = LongArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int64 val = data.data[data.offset]; int64 val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -238,9 +236,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv); PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
FloatArrayData data = FloatArrayData(); FloatArrayData data = FloatArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
float val = data.data[data.offset]; float val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -257,9 +255,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv); PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
DoubleArrayData data = DoubleArrayData(); DoubleArrayData data = DoubleArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
double val = data.data[data.offset]; double val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -276,9 +274,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVStringArray *pvdata = static_cast<PVStringArray*>(pv); PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
StringArrayData data = StringArrayData(); StringArrayData data = StringArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
StringArray value = data.data; StringArray value = data.data;
if(num==1) { if(num==1) {
if(value[data.offset].length()>0) { if(value[data.offset].length()>0) {
@@ -306,13 +304,13 @@ void convertStructureArray(StringBuilder buffer,
return; return;
} }
StructureArrayData data = StructureArrayData(); StructureArrayData data = StructureArrayData();
pvdata->get(0, length, &data); pvdata->get(0, length, data);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
PVStructure *pvStructure = data.data[i]; PVStructurePtr pvStructure = data.data[i];
if (pvStructure == 0) { if (pvStructure == 0) {
*buffer += "null"; *buffer += "null";
} else { } else {
convertToString(buffer,pvStructure,notFirst+1); convertToString(buffer,pvStructure.get(),notFirst+1);
} }
} }
} }
@@ -379,7 +377,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet,
@@ -475,7 +473,7 @@ public:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)

View File

@@ -121,13 +121,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
{ {
PVFieldPtrArray fieldsData = data->getPVFields(); PVFieldPtrArray fieldsData = data->getPVFields();
if (fieldsData != 0) { int length = data->getStructure()->getNumberFields();
int length = data->getStructure()->getNumberFields(); for(int i=0; i<length; i++) {
for(int i=0; i<length; i++) { PVFieldPtr fieldField = fieldsData[i];
PVField *fieldField = fieldsData[i]; convertToString(buffer,fieldField.get(),notFirst + 1);
convertToString(buffer,fieldField,notFirst + 1); }
}
}
} }
void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
@@ -139,9 +137,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv); PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv);
BooleanArrayData data = BooleanArrayData(); BooleanArrayData data = BooleanArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
BooleanArray value = data.data; BooleanArray value = data.data;
if(value[data.offset]) { if(value[data.offset]) {
@@ -160,9 +158,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVByteArray *pvdata = static_cast<PVByteArray*>(pv); PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
ByteArrayData data = ByteArrayData(); ByteArrayData data = ByteArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -179,9 +177,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVShortArray *pvdata = static_cast<PVShortArray*>(pv); PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
ShortArrayData data = ShortArrayData(); ShortArrayData data = ShortArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -198,9 +196,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVIntArray *pvdata = static_cast<PVIntArray*>(pv); PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
IntArrayData data = IntArrayData(); IntArrayData data = IntArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int val = data.data[data.offset]; int val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -217,9 +215,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVLongArray *pvdata = static_cast<PVLongArray*>(pv); PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
LongArrayData data = LongArrayData(); LongArrayData data = LongArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
int64 val = data.data[data.offset]; int64 val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -236,9 +234,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv); PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
FloatArrayData data = FloatArrayData(); FloatArrayData data = FloatArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
float val = data.data[data.offset]; float val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -255,9 +253,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv); PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
DoubleArrayData data = DoubleArrayData(); DoubleArrayData data = DoubleArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ','; if(i!=0) *buffer += ',';
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
if(num==1) { if(num==1) {
double val = data.data[data.offset]; double val = data.data[data.offset];
char buf[16]; char buf[16];
@@ -274,9 +272,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
PVStringArray *pvdata = static_cast<PVStringArray*>(pv); PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
StringArrayData data = StringArrayData(); StringArrayData data = StringArrayData();
*buffer += "["; *buffer += "[";
for(int i=0; i < pvdata->getLength(); i++) { for(size_t i=0; i < pvdata->getLength(); i++) {
if(i!=0) *buffer += ","; if(i!=0) *buffer += ",";
int num = pvdata->get(i,1,&data); int num = pvdata->get(i,1,data);
StringArray value = data.data; StringArray value = data.data;
if(num==1) { if(num==1) {
if(value[data.offset].length()>0) { if(value[data.offset].length()>0) {
@@ -304,13 +302,13 @@ void convertStructureArray(StringBuilder buffer,
return; return;
} }
StructureArrayData data = StructureArrayData(); StructureArrayData data = StructureArrayData();
pvdata->get(0, length, &data); pvdata->get(0, length, data);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
PVStructure *pvStructure = data.data[i]; PVStructurePtr pvStructure = data.data[i];
if (pvStructure == 0) { if (pvStructure == 0) {
*buffer += "null"; *buffer += "null";
} else { } else {
convertToString(buffer,pvStructure,notFirst+1); convertToString(buffer,pvStructure.get(),notFirst+1);
} }
} }
} }
@@ -378,7 +376,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut,
@@ -485,7 +483,7 @@ public:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)
@@ -635,7 +633,7 @@ int main (int argc, char *argv[])
allOK &= putRequesterImpl->waitUntilDone(timeOut); allOK &= putRequesterImpl->waitUntilDone(timeOut);
if (allOK) if (allOK)
{ {
getConvert()->fromString(putRequesterImpl->getStructure().get(), values); getConvert()->fromString(putRequesterImpl->getStructure(), values);
putRequesterImpl->resetEvent(); putRequesterImpl->resetEvent();
channelPut->put(false); channelPut->put(false);

View File

@@ -68,7 +68,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
void resetEvent() void resetEvent()
@@ -96,7 +96,7 @@ public:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)
@@ -243,8 +243,10 @@ int main (int argc, char *argv[])
shared_ptr<ChannelRPCRequesterImpl> rpcRequesterImpl(new ChannelRPCRequesterImpl(channel->getChannelName())); shared_ptr<ChannelRPCRequesterImpl> rpcRequesterImpl(new ChannelRPCRequesterImpl(channel->getChannelName()));
// A PVStructure is sent at ChannelRPC connect time but we don't use it, so send an empty one // A PVStructure is sent at ChannelRPC connect time but we don't use it, so send an empty one
StringArray fieldNames;
FieldConstPtrArray fields;
PVStructure::shared_pointer nothing( PVStructure::shared_pointer nothing(
new PVStructure(NULL, getFieldCreate()->createStructure("nothing", 0, NULL))); new PVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
ChannelRPC::shared_pointer channelRPC = channel->createChannelRPC(rpcRequesterImpl, nothing); ChannelRPC::shared_pointer channelRPC = channel->createChannelRPC(rpcRequesterImpl, nothing);
allOK &= rpcRequesterImpl->waitUntilDone(timeOut); allOK &= rpcRequesterImpl->waitUntilDone(timeOut);

View File

@@ -73,7 +73,7 @@ public:
} }
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, int payloadSize, Transport::shared_pointer const & transport, int8 version, int8 command, std::size_t payloadSize,
ByteBuffer* payloadBuffer) { ByteBuffer* payloadBuffer) {
if(command==CMD_CONNECTION_VALIDATION) transport->verified(); if(command==CMD_CONNECTION_VALIDATION) transport->verified();

View File

@@ -40,7 +40,7 @@ private:
class DummyResponseHandler : public ResponseHandler { class DummyResponseHandler : public ResponseHandler {
public: public:
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const & transport, int8 version, int8 command, int payloadSize, Transport::shared_pointer const & transport, int8 version, int8 command, std::size_t payloadSize,
ByteBuffer* payloadBuffer) { ByteBuffer* payloadBuffer) {
cout << "DummyResponseHandler::handleResponse" << endl; cout << "DummyResponseHandler::handleResponse" << endl;
} }

View File

@@ -61,7 +61,7 @@ public:
virtual ~DummyResponseHandler() {} virtual ~DummyResponseHandler() {}
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize,
ByteBuffer* payloadBuffer) { ByteBuffer* payloadBuffer) {
} }
}; };

View File

@@ -60,14 +60,14 @@ public:
} }
virtual void handleResponse(osiSockAddr* responseFrom, virtual void handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize,
ByteBuffer* payloadBuffer); ByteBuffer* payloadBuffer);
private: private:
int packets; int packets;
}; };
void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom, void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom,
Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize,
ByteBuffer* payloadBuffer) { ByteBuffer* payloadBuffer) {
std::ostringstream os; std::ostringstream os;
@@ -84,7 +84,7 @@ void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom,
char payload[50]; char payload[50];
for(int i = 0; i<payloadSize;) { for(std::size_t i = 0; i<payloadSize;) {
int dataCount = payloadSize-i<50 ? payloadSize-i : 50; int dataCount = payloadSize-i<50 ? payloadSize-i : 50;
payloadBuffer->get(payload, 0, dataCount); payloadBuffer->get(payload, 0, dataCount);
os<<"Payload ("<<i<<"-"<<(dataCount-1)<<")"; os<<"Payload ("<<i<<"-"<<(dataCount-1)<<")";

View File

@@ -33,7 +33,7 @@ private:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)

View File

@@ -20,9 +20,11 @@ using namespace std::tr1;
using namespace epics::pvData; using namespace epics::pvData;
using namespace epics::pvAccess; using namespace epics::pvAccess;
#define COUNT 100000 #define COUNT 1000 // repetitions per result
#define CHANNELS 1000
#define ARRAY_SIZE 1
#define DEFAULT_TIMEOUT 60.0 #define DEFAULT_TIMEOUT 600.0
#define DEFAULT_REQUEST "field(value)" #define DEFAULT_REQUEST "field(value)"
double timeOut = DEFAULT_TIMEOUT; double timeOut = DEFAULT_TIMEOUT;
@@ -40,6 +42,25 @@ void usage (void)
, DEFAULT_REQUEST, DEFAULT_TIMEOUT); , DEFAULT_REQUEST, DEFAULT_TIMEOUT);
} }
vector<ChannelGet::shared_pointer> getCs;
int channelCount = 0;
int allCount = 0;
timeval startTime;
void get_all()
{
ChannelGet::shared_pointer last;
for (vector<ChannelGet::shared_pointer>::const_iterator i = getCs.begin();
i != getCs.end();
i++)
{
(*i)->get(false);
last = *i;
}
last->get(true);
}
class ChannelGetRequesterImpl : public ChannelGetRequester class ChannelGetRequesterImpl : public ChannelGetRequester
{ {
@@ -48,6 +69,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
PVStructure::shared_pointer m_pvStructure; PVStructure::shared_pointer m_pvStructure;
BitSet::shared_pointer m_bitSet; BitSet::shared_pointer m_bitSet;
Event m_event; Event m_event;
Event m_connectionEvent;
String m_channelName; String m_channelName;
int m_count; int m_count;
@@ -64,7 +86,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelGetConnect(const epics::pvData::Status& status, virtual void channelGetConnect(const epics::pvData::Status& status,
@@ -83,11 +105,14 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
m_channelGet = channelGet; m_channelGet = channelGet;
m_pvStructure = pvStructure; m_pvStructure = pvStructure;
m_bitSet = bitSet; m_bitSet = bitSet;
m_connectionEvent.signal();
/*
m_count = COUNT; m_count = COUNT;
gettimeofday(&m_startTime, NULL); gettimeofday(&m_startTime, NULL);
m_channelGet->get(false); */
} }
else else
{ {
@@ -105,32 +130,43 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
std::cout << "[" << m_channelName << "] channel get: " << status.toString() << std::endl; std::cout << "[" << m_channelName << "] channel get: " << status.toString() << std::endl;
} }
channelCount++;
if (channelCount == CHANNELS)
{
allCount++;
channelCount = 0;
}
//printf("channelCount %d\n", channelCount);
if (allCount == COUNT)
{
timeval endTime;
gettimeofday(&endTime, NULL);
long seconds, nseconds;
double duration;
seconds = endTime.tv_sec - startTime.tv_sec;
nseconds = endTime.tv_usec - startTime.tv_usec;
duration = seconds + nseconds/1000000.0;
printf("%5.6f seconds, %5.3f (x %d = %5.3f) gets/s\n", duration, COUNT/duration, CHANNELS, COUNT*CHANNELS/duration);
allCount = 0;
gettimeofday(&startTime, NULL);
get_all();
//String str; }
//m_pvStructure->toString(&str); else if (channelCount == 0)
//std::cout << str << std::endl; {
//m_event.signal(); get_all();
}
if (--m_count)
m_channelGet->get(false);
else
{
timeval endTime;
gettimeofday(&endTime, NULL);
long seconds, nseconds;
double duration;
seconds = endTime.tv_sec - m_startTime.tv_sec;
nseconds = endTime.tv_usec - m_startTime.tv_usec;
duration = seconds + nseconds/1000000.0;
printf("%5.6f seconds, %5.3f gets/s \n", duration, COUNT/duration);
m_event.signal();
}
} }
else else
{ {
@@ -139,10 +175,16 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
} }
bool wait(double timeOut) /*
void get()
{ {
return m_event.wait(timeOut); return m_event.wait(timeOut);
} }
*/
bool waitUntilConnected(double timeOut)
{
return m_connectionEvent.wait(timeOut);
}
}; };
class ChannelRequesterImpl : public ChannelRequester class ChannelRequesterImpl : public ChannelRequester
@@ -159,7 +201,7 @@ public:
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, virtual void channelCreated(const epics::pvData::Status& status,
@@ -194,9 +236,10 @@ public:
}; };
int main (int argc, char *argv[]) int main (int argc, char *argv[])
{ {
printf("this does not work... since this impl. requires bulk get control... tODO\n");
return -1;
int opt; // getopt() current option int opt; // getopt() current option
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); // Set stdout to line buffering setvbuf(stdout,NULL,_IOLBF,BUFSIZ); // Set stdout to line buffering
@@ -233,14 +276,17 @@ int main (int argc, char *argv[])
} }
} }
int nPvs = argc - optind; // Remaining arg list is PV name printf("%d channels of double array size of %d elements, %d repetitions per sample\n", CHANNELS, ARRAY_SIZE, COUNT);
if (nPvs < 1 || nPvs > 1)
{ vector<string> pvs;
fprintf(stderr, "No pv name specified. ('testGetPerformance -h' for help.)\n"); char buf[64];
return 1; for (int i = 0; i < CHANNELS; i++)
} {
sprintf(buf, "array%d_%d", ARRAY_SIZE, i);
pvs.push_back(buf);
//printf("%s\n", buf);
}
string pvName = argv[optind]; // Copy PV name from command line
try { try {
pvRequest = getCreateRequest()->createRequest(request); pvRequest = getCreateRequest()->createRequest(request);
@@ -257,33 +303,57 @@ int main (int argc, char *argv[])
ClientFactory::start(); ClientFactory::start();
ChannelProvider::shared_pointer provider = getChannelAccess()->getProvider("pvAccess"); ChannelProvider::shared_pointer provider = getChannelAccess()->getProvider("pvAccess");
vector<Channel::shared_pointer> chs;
for (vector<string>::iterator i = pvs.begin();
i != pvs.end();
i++)
{
shared_ptr<ChannelRequesterImpl> channelRequesterImpl(new shared_ptr<ChannelRequesterImpl> channelRequesterImpl(new
ChannelRequesterImpl()); ChannelRequesterImpl());
Channel::shared_pointer channel = provider->createChannel(pvName, channelRequesterImpl); Channel::shared_pointer channel = provider->createChannel(*i, channelRequesterImpl);
chs.push_back(channel);
}
for (vector<Channel::shared_pointer>::iterator i = chs.begin();
i != chs.end();
i++)
{
Channel::shared_pointer channel = *i;
shared_ptr<ChannelRequesterImpl> channelRequesterImpl = dynamic_pointer_cast<ChannelRequesterImpl>(channel->getChannelRequester());
if (channelRequesterImpl->waitUntilConnected(5.0)) if (channelRequesterImpl->waitUntilConnected(5.0))
{ {
shared_ptr<ChannelGetRequesterImpl> getRequesterImpl(new shared_ptr<ChannelGetRequesterImpl> getRequesterImpl(new
ChannelGetRequesterImpl(channel->getChannelName())); ChannelGetRequesterImpl(channel->getChannelName()));
ChannelGet::shared_pointer channelGet = channel->createChannelGet(getRequesterImpl, pvRequest); ChannelGet::shared_pointer channelGet = channel->createChannelGet(getRequesterImpl, pvRequest);
allOK &= getRequesterImpl->wait(timeOut); allOK = getRequesterImpl->waitUntilConnected(timeOut);
if (!allOK) if (!allOK)
{ {
std::cout << "[" << channel->getChannelName() << "] failed to get all the gets" << std::endl; std::cout << "[" << channel->getChannelName() << "] failed to get all the gets" << std::endl;
return 1;
} }
channelGet->destroy(); getCs.push_back(channelGet);
} }
else else
{ {
allOK = false;
channel->destroy();
std::cout << "[" << channel->getChannelName() << "] connection timeout" << std::endl; std::cout << "[" << channel->getChannelName() << "] connection timeout" << std::endl;
return 1;
} }
}
std::cout << "all connected" << std::endl;
ClientFactory::stop(); gettimeofday(&startTime, NULL);
get_all();
epicsThreadSleep(DEFAULT_TIMEOUT);
//ClientFactory::stop();
return allOK ? 0 : 1; return allOK ? 0 : 1;
} }

View File

@@ -32,7 +32,7 @@ class ChannelRequesterImpl : public ChannelRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel)
@@ -56,7 +56,7 @@ class GetFieldRequesterImpl : public GetFieldRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr const & field) virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr const & field)
@@ -91,7 +91,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet,
@@ -141,7 +141,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut,
@@ -197,7 +197,7 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelPutGetConnect(const epics::pvData::Status& status, ChannelPutGet::shared_pointer const & channelPutGet, virtual void channelPutGetConnect(const epics::pvData::Status& status, ChannelPutGet::shared_pointer const & channelPutGet,
@@ -275,7 +275,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC) virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC)
@@ -314,7 +314,7 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelArrayConnect(const epics::pvData::Status& status,ChannelArray::shared_pointer const & channelArray, virtual void channelArrayConnect(const epics::pvData::Status& status,ChannelArray::shared_pointer const & channelArray,
@@ -364,10 +364,10 @@ class MonitorRequesterImpl : public MonitorRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void monitorConnect(const epics::pvData::Status& status, Monitor::shared_pointer const & monitor, StructureConstPtr const & structure) virtual void monitorConnect(const epics::pvData::Status& status, Monitor::shared_pointer & monitor, StructureConstPtr const & structure)
{ {
std::cout << "monitorConnect(" << status.toString() << ")" << std::endl; std::cout << "monitorConnect(" << status.toString() << ")" << std::endl;
if (status.isSuccess() && structure) if (status.isSuccess() && structure)
@@ -385,11 +385,11 @@ class MonitorRequesterImpl : public MonitorRequester
MonitorElement::shared_pointer element = monitor->poll(); MonitorElement::shared_pointer element = monitor->poll();
String str("changed/overrun "); String str("changed/overrun ");
element->getChangedBitSet()->toString(&str); element->changedBitSet->toString(&str);
str += '/'; str += '/';
element->getOverrunBitSet()->toString(&str); element->overrunBitSet->toString(&str);
str += '\n'; str += '\n';
element->getPVStructure()->toString(&str); element->pvStructurePtr->toString(&str);
std::cout << str << std::endl; std::cout << str << std::endl;
monitor->release(element); monitor->release(element);
@@ -413,7 +413,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess) virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess)
@@ -526,10 +526,9 @@ int main(int argc,char *argv[])
{ {
ChannelArrayRequester::shared_pointer channelArrayRequesterImpl(new ChannelArrayRequesterImpl()); ChannelArrayRequester::shared_pointer channelArrayRequesterImpl(new ChannelArrayRequesterImpl());
PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(0, "", 0)); StringArray fieldNames(1); fieldNames.push_back("field");
PVString* pvFieldName = (PVString*)getPVDataCreate()->createPVScalar(pvRequest.get(), "field", pvString); FieldConstPtrArray fields(1); fields.push_back(getFieldCreate()->createScalar(pvString));
pvFieldName->put("value"); PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
pvRequest->appendPVField(pvFieldName);
ChannelArray::shared_pointer channelArray = channel->createChannelArray(channelArrayRequesterImpl, pvRequest); ChannelArray::shared_pointer channelArray = channel->createChannelArray(channelArrayRequesterImpl, pvRequest);
epicsThreadSleep ( 1.0 ); epicsThreadSleep ( 1.0 );

View File

@@ -28,7 +28,7 @@ class MockChannelProcess :
private: private:
ChannelProcessRequester::shared_pointer m_channelProcessRequester; ChannelProcessRequester::shared_pointer m_channelProcessRequester;
PVStructure::shared_pointer m_pvStructure; PVStructure::shared_pointer m_pvStructure;
PVScalar* m_valueField; PVScalarPtr m_valueField;
protected: protected:
MockChannelProcess(ChannelProcessRequester::shared_pointer const & channelProcessRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) : MockChannelProcess(ChannelProcessRequester::shared_pointer const & channelProcessRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) :
@@ -37,8 +37,8 @@ class MockChannelProcess :
PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelProcess); PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelProcess);
ChannelProcess::shared_pointer thisPtr; // we return null = static_pointer_cast<ChannelProcess>(shared_from_this()); ChannelProcess::shared_pointer thisPtr; // we return null = static_pointer_cast<ChannelProcess>(shared_from_this());
PVField* field = pvStructure->getSubField(String("value")); PVFieldPtr field = pvStructure->getSubField(String("value"));
if (field == 0) if (field.get() == 0)
{ {
Status noValueFieldStatus(Status::STATUSTYPE_ERROR, "no 'value' field"); Status noValueFieldStatus(Status::STATUSTYPE_ERROR, "no 'value' field");
m_channelProcessRequester->channelProcessConnect(noValueFieldStatus, thisPtr); m_channelProcessRequester->channelProcessConnect(noValueFieldStatus, thisPtr);
@@ -56,7 +56,7 @@ class MockChannelProcess :
return; return;
} }
m_valueField = static_cast<PVScalar*>(field); m_valueField = static_pointer_cast<PVScalar>(field);
} }
public: public:
@@ -83,56 +83,56 @@ class MockChannelProcess :
case pvBoolean: case pvBoolean:
{ {
// negate // negate
PVBoolean *pvBoolean = static_cast<PVBoolean*>(m_valueField); PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(m_valueField);
pvBoolean->put(!pvBoolean->get()); pvBoolean->put(!pvBoolean->get());
break; break;
} }
case pvByte: case pvByte:
{ {
// increment by one // increment by one
PVByte *pvByte = static_cast<PVByte*>(m_valueField); PVBytePtr pvByte = static_pointer_cast<PVByte>(m_valueField);
pvByte->put(pvByte->get() + 1); pvByte->put(pvByte->get() + 1);
break; break;
} }
case pvShort: case pvShort:
{ {
// increment by one // increment by one
PVShort *pvShort = static_cast<PVShort*>(m_valueField); PVShortPtr pvShort = static_pointer_cast<PVShort>(m_valueField);
pvShort->put(pvShort->get() + 1); pvShort->put(pvShort->get() + 1);
break; break;
} }
case pvInt: case pvInt:
{ {
// increment by one // increment by one
PVInt *pvInt = static_cast<PVInt*>(m_valueField); PVIntPtr pvInt = static_pointer_cast<PVInt>(m_valueField);
pvInt->put(pvInt->get() + 1); pvInt->put(pvInt->get() + 1);
break; break;
} }
case pvLong: case pvLong:
{ {
// increment by one // increment by one
PVLong *pvLong = static_cast<PVLong*>(m_valueField); PVLongPtr pvLong = static_pointer_cast<PVLong>(m_valueField);
pvLong->put(pvLong->get() + 1); pvLong->put(pvLong->get() + 1);
break; break;
} }
case pvFloat: case pvFloat:
{ {
// increment by one // increment by one
PVFloat *pvFloat = static_cast<PVFloat*>(m_valueField); PVFloatPtr pvFloat = static_pointer_cast<PVFloat>(m_valueField);
pvFloat->put(pvFloat->get() + 1.0f); pvFloat->put(pvFloat->get() + 1.0f);
break; break;
} }
case pvDouble: case pvDouble:
{ {
// increment by one // increment by one
PVDouble *pvDouble = static_cast<PVDouble*>(m_valueField); PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(m_valueField);
pvDouble->put(pvDouble->get() + 1.0); pvDouble->put(pvDouble->get() + 1.0);
break; break;
} }
case pvString: case pvString:
{ {
// increment by one // increment by one
PVString *pvString = static_cast<PVString*>(m_valueField); PVStringPtr pvString = static_pointer_cast<PVString>(m_valueField);
String val = pvString->get(); String val = pvString->get();
if (val.empty()) if (val.empty())
pvString->put("gen0"); pvString->put("gen0");
@@ -404,8 +404,8 @@ class MockChannelRPC : public ChannelRPC
if (m_channelName == "rpcNTTable") if (m_channelName == "rpcNTTable")
{ {
// TODO type check, getStringField is verbose // TODO type check, getStringField is verbose
PVString* columns = static_cast<PVString*>(pvArgument->getSubField("columns")); PVStringPtr columns = static_pointer_cast<PVString>(pvArgument->getSubField("columns"));
if (columns == 0) if (columns.get() == 0)
{ {
PVStructure::shared_pointer nullPtr; PVStructure::shared_pointer nullPtr;
Status errorStatus(Status::STATUSTYPE_ERROR, "no columns specified"); Status errorStatus(Status::STATUSTYPE_ERROR, "no columns specified");
@@ -415,23 +415,27 @@ class MockChannelRPC : public ChannelRPC
{ {
int i = 0; int i = 0;
int totalFields = 1 + 1 + atoi(columns->get().c_str()); // normativeType, labels, <columns> int totalFields = 1 + 1 + atoi(columns->get().c_str()); // normativeType, labels, <columns>
FieldConstPtrArray fields = new FieldConstPtr[totalFields]; StringArray fieldNames(totalFields);
fields[i++] = getFieldCreate()->createScalar("normativeType", pvString); FieldConstPtrArray fields(totalFields);
fields[i++] = getFieldCreate()->createScalarArray("labels", pvString); fieldNames[i] = "normativeType";
fields[i++] = getFieldCreate()->createScalar(pvString);
fieldNames[i] = "labels";
fields[i++] = getFieldCreate()->createScalarArray(pvString);
char sbuf[16]; char sbuf[16];
vector<String> labels; vector<String> labels;
for (; i < totalFields; i++) for (; i < totalFields; i++)
{ {
sprintf(sbuf, "column%d", i-1 ); sprintf(sbuf, "column%d", i-1 );
fields[i] = getFieldCreate()->createScalarArray(sbuf, pvDouble); fieldNames[i] = sbuf;
fields[i] = getFieldCreate()->createScalarArray(pvDouble);
labels.push_back(sbuf); labels.push_back(sbuf);
} }
PVStructure::shared_pointer result( PVStructure::shared_pointer result(
new PVStructure(NULL, getFieldCreate()->createStructure("", totalFields, fields))); new PVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
result->getStringField("normativeType")->put("NTTable"); result->getStringField("normativeType")->put("NTTable");
static_cast<PVStringArray*>(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0); static_pointer_cast<PVStringArray>(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0);
srand ( time(NULL) ); srand ( time(NULL) );
@@ -446,7 +450,7 @@ class MockChannelRPC : public ChannelRPC
iter++) iter++)
{ {
FILL_VALUES; FILL_VALUES;
static_cast<PVDoubleArray*>(result->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0); static_pointer_cast<PVDoubleArray>(result->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0);
} }
m_channelRPCRequester->requestDone(Status::Ok, result); m_channelRPCRequester->requestDone(Status::Ok, result);
} }
@@ -499,7 +503,7 @@ class MockChannelArray : public ChannelArray
protected: protected:
MockChannelArray(ChannelArrayRequester::shared_pointer const & channelArrayRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) : MockChannelArray(ChannelArrayRequester::shared_pointer const & channelArrayRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) :
m_channelArrayRequester(channelArrayRequester), m_channelArrayRequester(channelArrayRequester),
m_pvArray(getPVDataCreate()->createPVScalarArray(0, "", pvDouble)) m_pvArray(getPVDataCreate()->createPVScalarArray(pvDouble))
{ {
PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelArray); PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelArray);
} }
@@ -625,7 +629,7 @@ class MockMonitor : public Monitor, public MonitorElement, public std::tr1::enab
return Status::Ok; return Status::Ok;
} }
virtual MonitorElement::shared_pointer const & poll() virtual MonitorElement::shared_pointer poll()
{ {
Lock xx(m_lock); Lock xx(m_lock);
if (m_count) if (m_count)
@@ -640,7 +644,7 @@ class MockMonitor : public Monitor, public MonitorElement, public std::tr1::enab
} }
} }
virtual void release(MonitorElement::shared_pointer const & monitorElement) virtual void release(MonitorElement::shared_pointer & monitorElement)
{ {
Lock xx(m_lock); Lock xx(m_lock);
if (m_count) if (m_count)
@@ -716,21 +720,62 @@ class MockChannel : public Channel {
if (m_name.find("array") == 0) if (m_name.find("array") == 0)
{ {
String allProperties("alarm,timeStamp,display,control"); String allProperties("");
m_pvStructure.reset(getStandardPVField()->scalarArray(0,name,pvDouble,allProperties)); // String allProperties("alarm,timeStamp,display,control");
PVDoubleArray *pvField = static_cast<PVDoubleArray*>(m_pvStructure->getScalarArrayField(String("value"), pvDouble)); m_pvStructure = getStandardPVField()->scalarArray(pvDouble,allProperties);
double v = 0; PVDoubleArrayPtr pvField = static_pointer_cast<PVDoubleArray>(m_pvStructure->getScalarArrayField(String("value"), pvDouble));
int ix = 0;
const int COUNT = 1000;
pvField->setCapacity(1000*COUNT); int specCount = 0; char postfix[64];
for (int n = 0; n < 1000; n++) int done = sscanf(m_name.c_str(), "array%d%s", &specCount, postfix);
if (done && specCount > 0)
{ {
pvField->setCapacity(specCount);
double array[COUNT]; pvField->setLength(specCount);
}
else
{
double v = 0;
int ix = 0;
const int COUNT = 1024;
pvField->setCapacity(1024*COUNT);
for (int n = 0; n < 1024; n++)
{
double array[COUNT];
for (int i = 0; i < COUNT; i++)
{
array[i] = v; v+=1.1;
}
pvField->put(ix, COUNT, array, 0);
ix += COUNT;
}
}
/*
printf("array prepared------------------------------------!!!\n");
String str;
pvField->toString(&str);
printf("%s\n", str.c_str());
printf("=============------------------------------------!!!\n");
*/
}
else if (m_name.find("image") == 0)
{
String allProperties("alarm,timeStamp,display,control");
m_pvStructure = getStandardPVField()->scalarArray(pvByte,allProperties);
PVByteArrayPtr pvField = static_pointer_cast<PVByteArray>(m_pvStructure->getScalarArrayField(String("value"), pvByte));
int ix = 0;
const int COUNT = 1024;
pvField->setCapacity(1024*COUNT);
for (int n = 0; n < 1024; n++)
{
int8 array[COUNT];
for (int i = 0; i < COUNT; i++) for (int i = 0; i < COUNT; i++)
{ {
array[i] = v; v+=1.1; array[i] = ix;
} }
pvField->put(ix, COUNT, array, 0); pvField->put(ix, COUNT, array, 0);
ix += COUNT; ix += COUNT;
@@ -741,17 +786,24 @@ class MockChannel : public Channel {
pvField->toString(&str); pvField->toString(&str);
printf("%s\n", str.c_str()); printf("%s\n", str.c_str());
printf("=============------------------------------------!!!\n"); printf("=============------------------------------------!!!\n");
*/ */
} }
else if (m_name.find("rpc") == 0) else if (m_name.find("rpc") == 0)
{ {
m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, name, 0, static_cast<epics::pvData::FieldConstPtr*>(0))); StringArray fieldNames;
PVFieldPtrArray fields;
m_pvStructure = getPVDataCreate()->createPVStructure(fieldNames, fields);
}
else if (m_name.find("valueOnly") == 0)
{
String allProperties("");
m_pvStructure = getStandardPVField()->scalar(pvDouble,allProperties);
} }
else else
{ {
String allProperties("alarm,timeStamp,display,control,valueAlarm"); String allProperties("alarm,timeStamp,display,control,valueAlarm");
m_pvStructure.reset(getStandardPVField()->scalar(0,name,pvDouble,allProperties)); m_pvStructure = getStandardPVField()->scalar(pvDouble,allProperties);
PVDouble *pvField = m_pvStructure->getDoubleField(String("value")); PVDoublePtr pvField = m_pvStructure->getDoubleField(String("value"));
pvField->put(1.123); pvField->put(1.123);
} }
} }
@@ -788,7 +840,7 @@ class MockChannel : public Channel {
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual ChannelProvider::shared_pointer const & getProvider() virtual ChannelProvider::shared_pointer const & getProvider()
@@ -831,7 +883,7 @@ class MockChannel : public Channel {
PVFieldPtr pvField; PVFieldPtr pvField;
if(subField == "") if(subField == "")
{ {
pvField = m_pvStructure.get(); pvField = m_pvStructure;
} }
else else
{ {
@@ -1042,7 +1094,7 @@ class ChannelRequesterImpl : public ChannelRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer &channel) virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer &channel)
@@ -1066,7 +1118,7 @@ class GetFieldRequesterImpl : public GetFieldRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr field) virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr field)
@@ -1097,7 +1149,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelGetConnect(const epics::pvData::Status& status, ChannelGet::shared_pointer const & channelGet, virtual void channelGetConnect(const epics::pvData::Status& status, ChannelGet::shared_pointer const & channelGet,
@@ -1133,7 +1185,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut,
@@ -1176,7 +1228,7 @@ class MonitorRequesterImpl : public MonitorRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void monitorConnect(const Status& status, Monitor::shared_pointer const & monitor, StructureConstPtr& structure) virtual void monitorConnect(const Status& status, Monitor::shared_pointer const & monitor, StructureConstPtr& structure)
@@ -1197,11 +1249,11 @@ class MonitorRequesterImpl : public MonitorRequester
MonitorElement::shared_pointer element = monitor->poll(); MonitorElement::shared_pointer element = monitor->poll();
String str("changed/overrun "); String str("changed/overrun ");
element->getChangedBitSet()->toString(&str); element->changedBitSet->toString(&str);
str += '/'; str += '/';
element->getOverrunBitSet()->toString(&str); element->overrunBitSet->toString(&str);
str += '\n'; str += '\n';
element->getPVStructure()->toString(&str); element->pvStructurePtr->toString(&str);
std::cout << str << std::endl; std::cout << str << std::endl;
monitor->release(element); monitor->release(element);
@@ -1225,7 +1277,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester
virtual void message(String message,MessageType messageType) virtual void message(String message,MessageType messageType)
{ {
std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl;
} }
virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess) virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess)

View File

@@ -112,7 +112,7 @@ TEST(inetAddressUtils, encodeAsIPv6Address)
osiSockAddr addr = *paddr; osiSockAddr addr = *paddr;
encodeAsIPv6Address(buff.get(), &addr); encodeAsIPv6Address(buff.get(), &addr);
ASSERT_EQ(static_cast<uintptr_t>(16), buff->getPosition()); ASSERT_EQ(static_cast<size_t>(16), buff->getPosition());
EXPECT_TRUE(strncmp(buff->getArray(), src, 16)==0); EXPECT_TRUE(strncmp(buff->getArray(), src, 16)==0);
} }
@@ -134,4 +134,4 @@ TEST(inetAddressUtils, getBroadcastAddresses)
cout<<"\t"<<inetAddressToString(broadcasts->at(i))<<endl; cout<<"\t"<<inetAddressToString(broadcasts->at(i))<<endl;
} }
} }