unsigned/size_t/shared ptrs
This commit is contained in:
174
.cproject
174
.cproject
@ -3,11 +3,11 @@
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="cdt.managedbuild.toolchain.gnu.base.1356606915">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1356606915" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<cconfiguration id="0.1711304068">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1711304068" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
<externalSettings/>
|
||||
<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.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||
@ -16,44 +16,28 @@
|
||||
</extensions>
|
||||
</storageModule>
|
||||
<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">
|
||||
<folderInfo id="cdt.managedbuild.toolchain.gnu.base.1356606915.922814002" name="/" resourcePath="">
|
||||
<toolChain id="cdt.managedbuild.toolchain.gnu.base.1290391524" name="cdt.managedbuild.toolchain.gnu.base" superClass="cdt.managedbuild.toolchain.gnu.base">
|
||||
<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"/>
|
||||
<builder id="cdt.managedbuild.target.gnu.builder.base.1065831114" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.archiver.base.766076070" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
|
||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.1359276119" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base">
|
||||
<option id="gnu.cpp.compiler.option.include.paths.1856220007" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value="/opt/epics/base/include"/>
|
||||
<listOptionValue builtIn="false" value="/opt/epics/base/include/os/Linux"/>
|
||||
<configuration buildProperties="" description="" id="0.1711304068" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
|
||||
<folderInfo id="0.1711304068." name="/" resourcePath="">
|
||||
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1124923904" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
|
||||
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1124923904.1662419075" name=""/>
|
||||
<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="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="org.eclipse.cdt.build.core.settings.holder.1831860297" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<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"/>
|
||||
</tool>
|
||||
<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>
|
||||
<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 id="cdt.managedbuild.tool.gnu.c.compiler.base.1053490390" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
|
||||
<option id="gnu.c.compiler.option.include.paths.1102959803" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
|
||||
<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 id="org.eclipse.cdt.build.core.settings.holder.1947872318" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
|
||||
<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"/>
|
||||
</tool>
|
||||
</toolChain>
|
||||
</folderInfo>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
|
||||
<externalSettings containerId="pvDataCPP;" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier"/>
|
||||
</storageModule>
|
||||
<storageModule moduleId="scannerConfiguration">
|
||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||
<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
|
||||
@ -302,44 +286,96 @@
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
</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 "${plugin_state_location}/${specs_file}"'" 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 "${plugin_state_location}/specs.cpp"'" 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 "${plugin_state_location}/specs.c"'" command="sh" useDefault="true"/>
|
||||
<parser enabled="true"/>
|
||||
</scannerInfoProvider>
|
||||
</profile>
|
||||
</scannerConfigBuildInfo>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
||||
<buildTargets>
|
||||
<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
||||
<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>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
|
||||
<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
|
||||
</cconfiguration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||
<project id="pvAccessCPP.null.2070236580" name="pvAccessCPP"/>
|
||||
<project id="pvAccessCPP.null.1359070792" name="pvAccessCPP"/>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
|
19
README
19
README
@ -3,4 +3,21 @@ Define
|
||||
EPICS_BASE
|
||||
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)
|
||||
|
@ -43,7 +43,7 @@ private:
|
||||
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);
|
||||
if(request.length()<=0) return;
|
||||
size_t comma = request.find(',');
|
||||
@ -57,9 +57,12 @@ private:
|
||||
THROW_BASE_EXCEPTION("mismatched { }");
|
||||
}
|
||||
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);
|
||||
pvParent->appendPVField(pvStructure.release());
|
||||
|
||||
PVFieldPtrArray fields;
|
||||
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.at(closeBrace+1) != ',') {
|
||||
THROW_BASE_EXCEPTION("misssing , after }");
|
||||
@ -69,9 +72,9 @@ private:
|
||||
return;
|
||||
}
|
||||
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);
|
||||
pvParent->appendPVField(pvStringField.release());
|
||||
pvParent->appendPVField("fieldList", pvStringField);
|
||||
return;
|
||||
}
|
||||
if(openBracket!=std::string::npos && (comma==std::string::npos || comma>openBracket)) {
|
||||
@ -95,30 +98,32 @@ private:
|
||||
createLeafFieldRequest(pvParent,request);
|
||||
}
|
||||
|
||||
static void createLeafFieldRequest(PVStructure* pvParent,String request) {
|
||||
static void createLeafFieldRequest(PVStructurePtr const & pvParent,String request) {
|
||||
size_t openBracket = request.find('[');
|
||||
String fullName = request;
|
||||
if(openBracket != std::string::npos) fullName = request.substr(0,openBracket);
|
||||
size_t indLast = fullName.rfind('.');
|
||||
String fieldName = fullName;
|
||||
if(indLast>1 && indLast != std::string::npos) fieldName = fullName.substr(indLast+1);
|
||||
std::auto_ptr<PVStructure> pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0));
|
||||
std::auto_ptr<PVStructure> pvLeaf(getPVDataCreate()->createPVStructure(pvStructure.get(),"leaf", 0));
|
||||
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvLeaf.get(), "source", pvString)));
|
||||
PVFieldPtrArray fields;
|
||||
StringArray fieldNames;
|
||||
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);
|
||||
pvLeaf->appendPVField(pvStringField.release());
|
||||
pvLeaf->appendPVField("source", pvStringField);
|
||||
if(openBracket != std::string::npos) {
|
||||
size_t closeBracket = request.find(']');
|
||||
if(closeBracket==std::string::npos) {
|
||||
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());
|
||||
pvParent->appendPVField(pvStructure.release());
|
||||
pvStructure->appendPVField("leaf", pvLeaf);
|
||||
pvParent->appendPVField("fieldName", pvStructure);
|
||||
}
|
||||
|
||||
static void createRequestOptions(PVStructure* pvParent,std::string request) {
|
||||
static void createRequestOptions(PVStructurePtr const & pvParent,std::string request) {
|
||||
trim(request);
|
||||
if(request.length()<=1) return;
|
||||
|
||||
@ -135,9 +140,9 @@ private:
|
||||
|
||||
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));
|
||||
pvParent->appendPVField(pvStringField.release());
|
||||
pvParent->appendPVField(token.substr(0, equalsPos), pvStringField);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -146,11 +151,13 @@ public:
|
||||
|
||||
virtual PVStructure::shared_pointer createRequest(String request)
|
||||
{
|
||||
static String emptyString;
|
||||
static PVFieldPtrArray emptyFields;
|
||||
static StringArray emptyFieldNames;
|
||||
|
||||
if (!request.empty()) trim(request);
|
||||
if (request.empty())
|
||||
{
|
||||
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0));
|
||||
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
|
||||
return pvStructure;
|
||||
}
|
||||
|
||||
@ -159,7 +166,7 @@ public:
|
||||
size_t offsetPutField = request.find("putField(");
|
||||
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) {
|
||||
size_t offsetBegin = request.find('[', offsetRecord);
|
||||
@ -167,9 +174,9 @@ public:
|
||||
if(offsetEnd == std::string::npos) {
|
||||
THROW_BASE_EXCEPTION("record[ does not have matching ]");
|
||||
}
|
||||
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "record", 0));
|
||||
createRequestOptions(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1));
|
||||
pvStructure->appendPVField(pvStruct.release());
|
||||
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
|
||||
createRequestOptions(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1));
|
||||
pvStructure->appendPVField("record", pvStruct);
|
||||
}
|
||||
if (offsetField != std::string::npos) {
|
||||
size_t offsetBegin = request.find('(', offsetField);
|
||||
@ -177,9 +184,9 @@ public:
|
||||
if(offsetEnd == std::string::npos) {
|
||||
THROW_BASE_EXCEPTION("field( does not have matching )");
|
||||
}
|
||||
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "field", 0));
|
||||
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField(pvStruct.release());
|
||||
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
|
||||
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField("field", pvStruct);
|
||||
}
|
||||
if (offsetPutField != std::string::npos) {
|
||||
size_t offsetBegin = request.find('(', offsetPutField);
|
||||
@ -187,9 +194,9 @@ public:
|
||||
if(offsetEnd == std::string::npos) {
|
||||
THROW_BASE_EXCEPTION("putField( does not have matching )");
|
||||
}
|
||||
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "putField", 0));
|
||||
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField(pvStruct.release());
|
||||
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
|
||||
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField("putField", pvStruct);
|
||||
}
|
||||
if (offsetGetField != std::string::npos) {
|
||||
size_t offsetBegin = request.find('(', offsetGetField);
|
||||
@ -197,12 +204,12 @@ public:
|
||||
if(offsetEnd == std::string::npos) {
|
||||
THROW_BASE_EXCEPTION("getField( does not have matching )");
|
||||
}
|
||||
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "getField", 0));
|
||||
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField(pvStruct.release());
|
||||
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
|
||||
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
|
||||
pvStructure->appendPVField("getField", pvStruct);
|
||||
}
|
||||
if (pvStructure.get()->getStructure()->getNumberFields()==0) {
|
||||
createFieldRequest(pvStructure.get(),request,true);
|
||||
createFieldRequest(pvStructure,request,true);
|
||||
}
|
||||
return pvStructure;
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ namespace epics {
|
||||
|
||||
void AbstractResponseHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
if(_debug) {
|
||||
char ipAddrStr[48];
|
||||
ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr));
|
||||
|
@ -42,7 +42,7 @@ namespace epics {
|
||||
acquire(client);
|
||||
|
||||
// use immediate for clients
|
||||
setSendQueueFlushStrategy(IMMEDIATE);
|
||||
setSendQueueFlushStrategy(DELAYED);
|
||||
|
||||
// setup connection timeout timer (watchdog)
|
||||
epicsTimeGetCurrent(&_aliveTimestamp);
|
||||
|
@ -28,7 +28,8 @@ namespace pvAccess {
|
||||
_lastChannelSID(0)
|
||||
{
|
||||
// for performance testing
|
||||
// setSendQueueFlushStrategy(IMMEDIATE);
|
||||
setSendQueueFlushStrategy(DELAYED);
|
||||
_delay = 0.000;
|
||||
|
||||
// NOTE: priority not yet known, default priority is used to register/unregister
|
||||
// TODO implement priorities in Reactor... not that user will
|
||||
|
@ -124,20 +124,20 @@ namespace epics {
|
||||
bool waitUntilVerified(double timeout);
|
||||
|
||||
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 flushSerializeBuffer() {
|
||||
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);
|
||||
|
||||
@ -165,10 +165,15 @@ namespace epics {
|
||||
|
||||
//void enqueueMonitorSendRequest(TransportSender::shared_pointer const & sender);
|
||||
|
||||
virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender);
|
||||
|
||||
virtual void flushSendQueue();
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
virtual void processReadCached(bool nestedCall,
|
||||
ReceiveStage inStage, int requiredBytes);
|
||||
ReceiveStage inStage, std::size_t requiredBytes);
|
||||
|
||||
/**
|
||||
* Called to any resources just before closing transport
|
||||
@ -199,11 +204,12 @@ namespace epics {
|
||||
/**
|
||||
* 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) ********/
|
||||
|
||||
@ -230,10 +236,12 @@ namespace epics {
|
||||
*/
|
||||
std::auto_ptr<ResponseHandler> _responseHandler;
|
||||
|
||||
// TODO review int vs std::size_t
|
||||
|
||||
/**
|
||||
* Send buffer size.
|
||||
*/
|
||||
int _maxPayloadSize;
|
||||
std::size_t _maxPayloadSize;
|
||||
|
||||
/**
|
||||
* Send buffer size.
|
||||
@ -333,16 +341,16 @@ namespace epics {
|
||||
// initialized at construction time
|
||||
epics::pvData::ByteBuffer* _socketBuffer;
|
||||
|
||||
int _startPosition;
|
||||
std::size_t _startPosition;
|
||||
|
||||
int _storedPayloadSize;
|
||||
int _storedPosition;
|
||||
int _storedLimit;
|
||||
std::size_t _storedPayloadSize;
|
||||
std::size_t _storedPosition;
|
||||
std::size_t _storedLimit;
|
||||
|
||||
epics::pvData::int8 _version;
|
||||
epics::pvData::int8 _packetType;
|
||||
epics::pvData::int8 _command;
|
||||
int _payloadSize;
|
||||
std::size_t _payloadSize;
|
||||
|
||||
ReceiveStage _stage;
|
||||
|
||||
|
@ -76,11 +76,12 @@ namespace pvAccess {
|
||||
|
||||
PVDATA_REFCOUNT_MONITOR_DEFINE(blockingTCPTransport);
|
||||
|
||||
const double BlockingTCPTransport::_delay = 0.01;
|
||||
//const double BlockingTCPTransport::_delay = 0.000;
|
||||
|
||||
BlockingTCPTransport::BlockingTCPTransport(Context::shared_pointer const & context,
|
||||
SOCKET channel, std::auto_ptr<ResponseHandler>& responseHandler,
|
||||
int receiveBufferSize, int16 priority) :
|
||||
_delay(0.0),
|
||||
_channel(channel),
|
||||
_priority(priority),
|
||||
_responseHandler(responseHandler),
|
||||
@ -221,7 +222,7 @@ namespace pvAccess {
|
||||
LOG(logLevelDebug, "Starting thread: %s",threadName.c_str());
|
||||
|
||||
_sendThreadId = epicsThreadCreate(threadName.c_str(),
|
||||
epicsThreadPriorityMedium,
|
||||
epicsThreadPriorityMedium,
|
||||
epicsThreadGetStackSize(epicsThreadStackMedium),
|
||||
BlockingTCPTransport::sendThreadRunner, this);
|
||||
}
|
||||
@ -330,7 +331,7 @@ namespace pvAccess {
|
||||
startMessage(_lastSegmentedMessageCommand, 0);
|
||||
}
|
||||
|
||||
void BlockingTCPTransport::startMessage(int8 command, int ensureCapacity) {
|
||||
void BlockingTCPTransport::startMessage(int8 command, size_t ensureCapacity) {
|
||||
_lastMessageStartPosition = -1;
|
||||
ensureBuffer(CA_MESSAGE_HEADER_SIZE+ensureCapacity);
|
||||
_lastMessageStartPosition = _sendBuffer->getPosition();
|
||||
@ -346,8 +347,8 @@ namespace pvAccess {
|
||||
endMessage(false);
|
||||
}
|
||||
|
||||
void BlockingTCPTransport::ensureBuffer(int size) {
|
||||
if(likely((int)(_sendBuffer->getRemaining())>=size)) return;
|
||||
void BlockingTCPTransport::ensureBuffer(size_t size) {
|
||||
if(likely(_sendBuffer->getRemaining()>=size)) return;
|
||||
|
||||
// too large for buffer...
|
||||
if(unlikely(_maxPayloadSize<size)) {
|
||||
@ -357,16 +358,16 @@ namespace pvAccess {
|
||||
THROW_BASE_EXCEPTION(temp.str().c_str());
|
||||
}
|
||||
|
||||
while(((int)_sendBuffer->getRemaining())<size && !_closed.get())
|
||||
while(_sendBuffer->getRemaining()<size && !_closed.get())
|
||||
flush(false);
|
||||
|
||||
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
|
||||
|
||||
if(unlikely((int)(_sendBuffer->getRemaining())<(alignment-1)))
|
||||
if(unlikely(_sendBuffer->getRemaining()<(alignment-1)))
|
||||
ensureBuffer(alignment-1);
|
||||
|
||||
_sendBuffer->align(alignment);
|
||||
@ -425,9 +426,9 @@ namespace pvAccess {
|
||||
}
|
||||
}
|
||||
|
||||
void BlockingTCPTransport::ensureData(int size) {
|
||||
void BlockingTCPTransport::ensureData(size_t size) {
|
||||
// enough of data?
|
||||
if(likely(((int)_socketBuffer->getRemaining())>=size)) return;
|
||||
if(likely(_socketBuffer->getRemaining()>=size)) return;
|
||||
|
||||
// too large for buffer...
|
||||
if(unlikely(MAX_ENSURE_DATA_BUFFER_SIZE<size)) {
|
||||
@ -479,24 +480,24 @@ namespace pvAccess {
|
||||
_storedLimit));
|
||||
|
||||
// add if missing...
|
||||
if(unlikely(!_closed.get()&&((int)_socketBuffer->getRemaining())<size))
|
||||
if(unlikely(!_closed.get()&&(_socketBuffer->getRemaining()<size)))
|
||||
ensureData(size);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
if(unlikely((int)(_socketBuffer->getRemaining())<(alignment-1)))
|
||||
if(unlikely(_socketBuffer->getRemaining()<(alignment-1)))
|
||||
ensureData(alignment-1);
|
||||
|
||||
_socketBuffer->align(alignment);
|
||||
}
|
||||
|
||||
void BlockingTCPTransport::processReadCached(bool nestedCall,
|
||||
ReceiveStage inStage, int requiredBytes) {
|
||||
ReceiveStage inStage, size_t requiredBytes) {
|
||||
try {
|
||||
while(likely(!_closed.get())) {
|
||||
if(_stage==READ_FROM_SOCKET||inStage!=UNDEFINED_STAGE) {
|
||||
@ -521,7 +522,7 @@ namespace pvAccess {
|
||||
|
||||
// read at least requiredBytes bytes
|
||||
|
||||
uintptr_t requiredPosition = (currentStartPosition+requiredBytes);
|
||||
size_t requiredPosition = (currentStartPosition+requiredBytes);
|
||||
while(_socketBuffer->getPosition()<requiredPosition) {
|
||||
// read
|
||||
int pos = _socketBuffer->getPosition();
|
||||
@ -689,7 +690,7 @@ namespace pvAccess {
|
||||
}
|
||||
|
||||
_socketBuffer->setLimit(_storedLimit);
|
||||
int newPosition = _storedPosition+_storedPayloadSize;
|
||||
size_t newPosition = _storedPosition+_storedPayloadSize;
|
||||
if(unlikely(newPosition>_storedLimit)) {
|
||||
newPosition -= _storedLimit;
|
||||
_socketBuffer->setPosition(_storedLimit);
|
||||
@ -778,6 +779,7 @@ namespace pvAccess {
|
||||
int bytesToSend = limit-buffer->getPosition();
|
||||
|
||||
//LOG(logLevelInfo,"Total bytes to send: %d", bytesToSend);
|
||||
//printf("Total bytes to send: %d\n", bytesToSend);
|
||||
|
||||
// limit sending
|
||||
if(bytesToSend>maxBytesToSend) {
|
||||
@ -1010,6 +1012,18 @@ printf("sendThreadRunnner exception\n");
|
||||
_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) {
|
||||
Lock lock(_monitorMutex);
|
||||
|
@ -110,15 +110,15 @@ namespace epics {
|
||||
|
||||
virtual void close(bool forced);
|
||||
|
||||
virtual void ensureData(int size) {
|
||||
virtual void ensureData(std::size_t size) {
|
||||
// noop
|
||||
}
|
||||
|
||||
virtual void alignData(int alignment) {
|
||||
virtual void alignData(std::size_t 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 flush(bool lastMessageCompleted) {
|
||||
@ -134,11 +134,11 @@ namespace epics {
|
||||
// noop
|
||||
}
|
||||
|
||||
virtual void ensureBuffer(int size) {
|
||||
virtual void ensureBuffer(std::size_t size) {
|
||||
// noop
|
||||
}
|
||||
|
||||
virtual void alignBuffer(int alignment) {
|
||||
virtual void alignBuffer(std::size_t alignment) {
|
||||
_sendBuffer->align(alignment);
|
||||
}
|
||||
|
||||
|
@ -141,7 +141,7 @@ namespace epics {
|
||||
}
|
||||
}
|
||||
|
||||
void BlockingUDPTransport::startMessage(int8 command, int ensureCapacity) {
|
||||
void BlockingUDPTransport::startMessage(int8 command, size_t ensureCapacity) {
|
||||
_lastMessageStartPosition = _sendBuffer->getPosition();
|
||||
_sendBuffer->putByte(CA_MAGIC);
|
||||
_sendBuffer->putByte(CA_VERSION);
|
||||
@ -276,11 +276,12 @@ namespace epics {
|
||||
|
||||
// command ID and paylaod
|
||||
int8 command = receiveBuffer->getByte();
|
||||
int payloadSize = receiveBuffer->getInt();
|
||||
int nextRequestPosition = receiveBuffer->getPosition() + payloadSize;
|
||||
// TODO check this cast (size_t must be 32-bit)
|
||||
size_t payloadSize = receiveBuffer->getInt();
|
||||
size_t nextRequestPosition = receiveBuffer->getPosition() + payloadSize;
|
||||
|
||||
// payload size check
|
||||
if(unlikely(nextRequestPosition>(int)receiveBuffer->getLimit())) return false;
|
||||
if(unlikely(nextRequestPosition>receiveBuffer->getLimit())) return false;
|
||||
|
||||
// handle
|
||||
_responseHandler->handleResponse(&fromAddress, thisTransport,
|
||||
|
@ -111,7 +111,7 @@ namespace epics {
|
||||
|
||||
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 flush(bool lastMessageCompleted) = 0;
|
||||
@ -261,6 +261,10 @@ namespace epics {
|
||||
*/
|
||||
virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0;
|
||||
|
||||
virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) {};
|
||||
|
||||
virtual void flushSendQueue() {};
|
||||
|
||||
};
|
||||
|
||||
class Channel;
|
||||
@ -315,7 +319,7 @@ namespace epics {
|
||||
*/
|
||||
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) = 0;
|
||||
};
|
||||
|
||||
@ -335,7 +339,7 @@ namespace epics {
|
||||
virtual ~AbstractResponseHandler() {}
|
||||
|
||||
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);
|
||||
|
||||
protected:
|
||||
|
@ -23,9 +23,9 @@ public:
|
||||
void endMessage() {}
|
||||
void flush(bool lastMessageCompleted) {}
|
||||
void setRecipient(const osiSockAddr& sendTo) {}
|
||||
void startMessage(epics::pvData::int8 command, int ensureCapacity) {}
|
||||
void ensureBuffer(int size) {}
|
||||
void alignBuffer(int alignment) {}
|
||||
void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity) {}
|
||||
void ensureBuffer(std::size_t) {}
|
||||
void alignBuffer(std::size_t alignment) {}
|
||||
void flushSerializeBuffer() {}
|
||||
void cachedSerialize(
|
||||
const std::tr1::shared_ptr<const epics::pvData::Field>& field, epics::pvData::ByteBuffer* buffer)
|
||||
|
@ -30,6 +30,8 @@
|
||||
#include <pv/logger.h>
|
||||
#include <pv/bitSetUtil.h>
|
||||
|
||||
#include <tr1/unordered_map>
|
||||
|
||||
using std::tr1::dynamic_pointer_cast;
|
||||
using std::tr1::static_pointer_cast;
|
||||
|
||||
@ -45,7 +47,7 @@ namespace epics {
|
||||
String emptyString;
|
||||
|
||||
// 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; } \
|
||||
@ -88,7 +90,7 @@ namespace epics {
|
||||
typedef std::tr1::shared_ptr<BaseRequestImpl> shared_pointer;
|
||||
typedef std::tr1::shared_ptr<const BaseRequestImpl> const_shared_pointer;
|
||||
|
||||
static PVDataCreate* pvDataCreate;
|
||||
static PVDataCreatePtr pvDataCreate;
|
||||
|
||||
static Status notInitializedStatus;
|
||||
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::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed");
|
||||
@ -371,7 +373,7 @@ namespace epics {
|
||||
if (pendingRequest & QOS_INIT)
|
||||
{
|
||||
// pvRequest
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get());
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
|
||||
}
|
||||
|
||||
stopRequest();
|
||||
@ -474,7 +476,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
ChannelGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelGet>(shared_from_this());
|
||||
PVStructure::shared_pointer nullPVStructure;
|
||||
@ -526,7 +528,7 @@ namespace epics {
|
||||
if (pendingRequest & QOS_INIT)
|
||||
{
|
||||
// pvRequest
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get());
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
|
||||
}
|
||||
|
||||
stopRequest();
|
||||
@ -552,7 +554,7 @@ namespace epics {
|
||||
// create data and its bitSet
|
||||
{
|
||||
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()));
|
||||
}
|
||||
|
||||
@ -593,7 +595,19 @@ namespace epics {
|
||||
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)) {
|
||||
EXCEPTION_GUARD(m_channelGetRequester->getDone(otherRequestPendingStatus));
|
||||
return;
|
||||
@ -602,6 +616,7 @@ namespace epics {
|
||||
try {
|
||||
TransportSender::shared_pointer thisSender = shared_from_this();
|
||||
m_channel->checkAndGetTransport()->enqueueSendRequest(thisSender);
|
||||
//TODO bulk hack m_channel->checkAndGetTransport()->enqueueOnlySendRequest(thisSender);
|
||||
} catch (std::runtime_error &rte) {
|
||||
stopRequest();
|
||||
EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected));
|
||||
@ -665,7 +680,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
ChannelPut::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPut>(shared_from_this());
|
||||
PVStructure::shared_pointer nullPVStructure;
|
||||
@ -717,7 +732,7 @@ namespace epics {
|
||||
if (pendingRequest & QOS_INIT)
|
||||
{
|
||||
// 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))
|
||||
{
|
||||
@ -752,7 +767,7 @@ namespace epics {
|
||||
// create data and its bitSet
|
||||
{
|
||||
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()));
|
||||
}
|
||||
|
||||
@ -897,7 +912,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
ChannelPutGet::shared_pointer thisPointer = dynamic_pointer_cast<ChannelPutGet>(shared_from_this());
|
||||
PVStructure::shared_pointer nullPVStructure;
|
||||
@ -947,7 +962,7 @@ namespace epics {
|
||||
buffer->putByte((int8)QOS_INIT);
|
||||
|
||||
// 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)) {
|
||||
// noop
|
||||
@ -983,8 +998,8 @@ namespace epics {
|
||||
|
||||
{
|
||||
Lock lock(m_structureMutex);
|
||||
m_putData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()));
|
||||
m_getData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()));
|
||||
m_putData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
|
||||
m_getData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get());
|
||||
}
|
||||
|
||||
// notify
|
||||
@ -1186,7 +1201,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
ChannelRPC::shared_pointer thisPointer = dynamic_pointer_cast<ChannelRPC>(shared_from_this());
|
||||
EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(pvRequestNull, thisPointer));
|
||||
@ -1235,14 +1250,14 @@ namespace epics {
|
||||
buffer->putByte((int8)QOS_INIT);
|
||||
|
||||
// pvRequest
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get());
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
// no need to lock here, since it is already locked via TransportSender IF
|
||||
//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
|
||||
m_structure.reset();
|
||||
}
|
||||
@ -1382,7 +1397,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
ChannelArray::shared_pointer thisPointer = dynamic_pointer_cast<ChannelArray>(shared_from_this());
|
||||
PVArray::shared_pointer nullPVArray;
|
||||
@ -1430,7 +1445,7 @@ namespace epics {
|
||||
if (pendingRequest & QOS_INIT)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
@ -1476,7 +1491,7 @@ namespace epics {
|
||||
FieldConstPtr field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport.get());
|
||||
{
|
||||
Lock lock(m_structureMutex);
|
||||
m_structure.reset(dynamic_cast<PVArray*>(getPVDataCreate()->createPVField(0, field)));
|
||||
m_structure = dynamic_pointer_cast<PVArray>(getPVDataCreate()->createPVField(field));
|
||||
}
|
||||
|
||||
// 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 {
|
||||
public:
|
||||
virtual ~MonitorStrategy() {};
|
||||
@ -1837,7 +1827,7 @@ namespace epics {
|
||||
public:
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
virtual MonitorElement::shared_pointer const & poll() {
|
||||
virtual MonitorElement::shared_pointer poll() {
|
||||
Lock guard(m_mutex);
|
||||
if (m_gotMonitor)
|
||||
return m_nullMonitorElement;
|
||||
@ -1865,7 +1855,7 @@ namespace epics {
|
||||
return m_monitorElement;
|
||||
}
|
||||
|
||||
virtual void release(MonitorElement::shared_pointer const & monitorElement) {
|
||||
virtual void release(MonitorElement::shared_pointer & monitorElement) {
|
||||
Lock guard(m_mutex);
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
@ -1896,12 +1886,11 @@ namespace epics {
|
||||
|
||||
MonitorElement::shared_pointer m_nullMonitorElement;
|
||||
MonitorElement::shared_pointer m_monitorElement;
|
||||
std::tr1::shared_ptr<MonitorElementImpl> m_monitorElementImpl;
|
||||
|
||||
public:
|
||||
|
||||
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) {
|
||||
Lock guard(m_mutex);
|
||||
|
||||
m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure));
|
||||
int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields();
|
||||
m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure);
|
||||
int numberFields = m_monitorElement->pvStructurePtr->getNumberFields();
|
||||
m_monitorElement->changedBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElement->overrunBitSet.reset(new BitSet(numberFields));
|
||||
}
|
||||
|
||||
virtual void response(Transport::shared_pointer const & transport, ByteBuffer* payloadBuffer) {
|
||||
Lock guard(m_mutex);
|
||||
// simply deserialize and notify
|
||||
m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get());
|
||||
m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get());
|
||||
m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_gotMonitor = true;
|
||||
Monitor::shared_pointer thisMonitor = shared_from_this();
|
||||
m_callback->monitorEvent(thisMonitor);
|
||||
}
|
||||
|
||||
virtual MonitorElement::shared_pointer const & poll() {
|
||||
virtual MonitorElement::shared_pointer poll() {
|
||||
Lock guard(m_mutex);
|
||||
if (m_gotMonitor)
|
||||
return m_nullMonitorElement;
|
||||
@ -1937,7 +1926,7 @@ namespace epics {
|
||||
return m_monitorElement;
|
||||
}
|
||||
|
||||
virtual void release(MonitorElement::shared_pointer const & monitorElement) {
|
||||
virtual void release(MonitorElement::shared_pointer & monitorElement) {
|
||||
Lock guard(m_mutex);
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
@ -1976,13 +1965,12 @@ namespace epics {
|
||||
|
||||
MonitorElement::shared_pointer m_nullMonitorElement;
|
||||
MonitorElement::shared_pointer m_monitorElement;
|
||||
std::tr1::shared_ptr<MonitorElementImpl> m_monitorElementImpl;
|
||||
|
||||
public:
|
||||
|
||||
MonitorStrategySingle(MonitorRequester::shared_pointer callback) :
|
||||
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) {
|
||||
Lock guard(m_mutex);
|
||||
|
||||
m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure));
|
||||
int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields();
|
||||
m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure);
|
||||
int numberFields = m_monitorElement->pvStructurePtr->getNumberFields();
|
||||
m_monitorElement->changedBitSet.reset(new BitSet(numberFields));
|
||||
m_monitorElement->overrunBitSet.reset(new BitSet(numberFields));
|
||||
|
||||
m_structureChangeBitSet.reset(new BitSet(numberFields));
|
||||
m_structureOverrunBitSet.reset(new BitSet(numberFields));
|
||||
@ -2009,9 +1997,9 @@ namespace epics {
|
||||
if (!m_gotMonitor)
|
||||
{
|
||||
// simply deserialize and notify
|
||||
m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get());
|
||||
m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get());
|
||||
m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get());
|
||||
m_gotMonitor = true;
|
||||
Monitor::shared_pointer thisMonitor = shared_from_this();
|
||||
m_callback->monitorEvent(thisMonitor);
|
||||
@ -2020,48 +2008,48 @@ namespace epics {
|
||||
{
|
||||
// deserialize first
|
||||
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());
|
||||
|
||||
// OR local overrun
|
||||
// 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
|
||||
*(m_monitorElementImpl->m_changedBitSet) |= *m_structureChangeBitSet.get();
|
||||
*(m_monitorElement->changedBitSet) |= *m_structureChangeBitSet.get();
|
||||
|
||||
// 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);
|
||||
if (!m_gotMonitor) return m_nullMonitorElement;
|
||||
|
||||
// compress if needed
|
||||
if (m_needToCompress)
|
||||
{
|
||||
BitSetUtil::compress(m_monitorElementImpl->m_changedBitSet.get(), m_monitorElementImpl->m_pvStructure.get());
|
||||
BitSetUtil::compress(m_monitorElementImpl->m_overrunBitSet.get(), m_monitorElementImpl->m_pvStructure.get());
|
||||
BitSetUtil::compress(m_monitorElement->changedBitSet.get(), m_monitorElement->pvStructurePtr.get());
|
||||
BitSetUtil::compress(m_monitorElement->overrunBitSet.get(), m_monitorElement->pvStructurePtr.get());
|
||||
m_needToCompress = false;
|
||||
}
|
||||
|
||||
return m_monitorElement;
|
||||
}
|
||||
|
||||
virtual void release(MonitorElement::shared_pointer const & monitorElement) {
|
||||
virtual void release(MonitorElement::shared_pointer & monitorElement) {
|
||||
Lock guard(m_mutex);
|
||||
m_gotMonitor = false;
|
||||
}
|
||||
|
||||
Status start() {
|
||||
Lock guard(m_mutex);
|
||||
if (!m_monitorElementImpl->m_changedBitSet.get())
|
||||
if (!m_monitorElement->changedBitSet.get())
|
||||
return Status(Status::STATUSTYPE_ERROR, "Monitor not connected.");
|
||||
m_gotMonitor = false;
|
||||
m_monitorElementImpl->m_changedBitSet->clear();
|
||||
m_monitorElementImpl->m_overrunBitSet->clear();
|
||||
m_monitorElement->changedBitSet->clear();
|
||||
m_monitorElement->overrunBitSet->clear();
|
||||
return Status::Ok;
|
||||
}
|
||||
|
||||
@ -2104,7 +2092,7 @@ namespace epics {
|
||||
{
|
||||
BaseRequestImpl::activate();
|
||||
|
||||
if (m_pvRequest.get() == 0)
|
||||
if (m_pvRequest == 0)
|
||||
{
|
||||
Monitor::shared_pointer thisPointer = dynamic_pointer_cast<Monitor>(shared_from_this());
|
||||
StructureConstPtr nullPVStructure;
|
||||
@ -2113,10 +2101,10 @@ namespace epics {
|
||||
}
|
||||
|
||||
int queueSize = 2;
|
||||
PVField* pvField = m_pvRequest->getSubField("record.queueSize");
|
||||
if (pvField) {
|
||||
PVString* pvString = dynamic_cast<PVString*>(pvField);
|
||||
if (pvString)
|
||||
PVFieldPtr pvField = m_pvRequest->getSubField("record.queueSize");
|
||||
if (pvField.get()) {
|
||||
PVStringPtr pvString = dynamic_pointer_cast<PVString>(pvField);
|
||||
if (pvString.get())
|
||||
{
|
||||
String value = pvString->get();
|
||||
|
||||
@ -2184,7 +2172,7 @@ namespace epics {
|
||||
if (pendingRequest & QOS_INIT)
|
||||
{
|
||||
// pvRequest
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get());
|
||||
m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest);
|
||||
}
|
||||
|
||||
stopRequest();
|
||||
@ -2336,12 +2324,12 @@ namespace epics {
|
||||
BaseRequestImpl::destroy();
|
||||
}
|
||||
|
||||
virtual MonitorElement::shared_pointer const & poll()
|
||||
virtual MonitorElement::shared_pointer poll()
|
||||
{
|
||||
return m_monitorStrategy->poll();
|
||||
}
|
||||
|
||||
virtual void release(MonitorElement::shared_pointer const & monitorElement)
|
||||
virtual void release(MonitorElement::shared_pointer & monitorElement)
|
||||
{
|
||||
m_monitorStrategy->release(monitorElement);
|
||||
}
|
||||
@ -2396,7 +2384,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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];
|
||||
ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr));
|
||||
@ -2420,7 +2408,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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);
|
||||
|
||||
@ -2449,7 +2437,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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);
|
||||
|
||||
@ -2512,7 +2500,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer)
|
||||
{
|
||||
// reception timestamp
|
||||
TimeStamp timestamp;
|
||||
@ -2560,17 +2548,16 @@ namespace epics {
|
||||
|
||||
// TODO smart pointers
|
||||
// extra data
|
||||
PVFieldPtr data = 0;
|
||||
PVFieldPtr data;
|
||||
const FieldConstPtr field = IntrospectionRegistry::deserializeFull(payloadBuffer, transport.get());
|
||||
if (field != 0)
|
||||
{
|
||||
data = getPVDataCreate()->createPVField(0, field);
|
||||
data = getPVDataCreate()->createPVField(field);
|
||||
data->deserialize(payloadBuffer, transport.get());
|
||||
}
|
||||
|
||||
// notify beacon handler
|
||||
beaconHandler->beaconNotify(responseFrom, version, ×tamp, &startupTimestamp, sequentalID, data);
|
||||
if (data) delete data;
|
||||
}
|
||||
};
|
||||
|
||||
@ -2586,7 +2573,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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);
|
||||
|
||||
@ -2616,7 +2603,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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);
|
||||
|
||||
@ -2653,7 +2640,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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);
|
||||
|
||||
@ -2734,7 +2721,7 @@ namespace epics {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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())
|
||||
{
|
||||
@ -3053,7 +3040,7 @@ namespace epics {
|
||||
|
||||
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; }
|
||||
|
@ -23,17 +23,28 @@ DefaultBeaconServerStatusProvider::~DefaultBeaconServerStatusProvider()
|
||||
|
||||
void DefaultBeaconServerStatusProvider::initialize()
|
||||
{
|
||||
FieldCreate* 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);
|
||||
FieldCreatePtr fieldCreate = getFieldCreate();
|
||||
|
||||
_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()
|
||||
|
@ -28,7 +28,7 @@ namespace pvAccess {
|
||||
|
||||
void ServerBadResponse::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -74,7 +74,7 @@ ServerResponseHandler::ServerResponseHandler(ServerContextImpl::shared_pointer c
|
||||
|
||||
void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
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())
|
||||
{
|
||||
@ -98,7 +98,7 @@ void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
|
||||
void ServerConnectionValidationHandler::handleResponse(
|
||||
osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version,
|
||||
int8 command, int payloadSize,
|
||||
int8 command, size_t payloadSize,
|
||||
ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
@ -116,7 +116,7 @@ void ServerConnectionValidationHandler::handleResponse(
|
||||
|
||||
void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -128,7 +128,7 @@ void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
|
||||
void ServerIntrospectionSearchHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -149,7 +149,7 @@ ServerSearchHandler::~ServerSearchHandler()
|
||||
|
||||
void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -273,7 +273,7 @@ void ServerChannelFindRequesterImpl::send(ByteBuffer* buffer, TransportSendContr
|
||||
/****************************************************************************************/
|
||||
void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -424,7 +424,7 @@ String ServerChannelRequesterImpl::getRequesterName()
|
||||
|
||||
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()
|
||||
@ -479,7 +479,7 @@ void ServerChannelRequesterImpl::createChannelFailedResponse(ByteBuffer* buffer,
|
||||
|
||||
void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -520,7 +520,7 @@ void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
|
||||
void ServerGetHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer)
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer)
|
||||
{
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
@ -710,7 +710,7 @@ void ServerChannelGetRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
|
||||
/****************************************************************************************/
|
||||
void ServerPutHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -922,7 +922,7 @@ void ServerChannelPutRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
|
||||
/****************************************************************************************/
|
||||
void ServerPutGetHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -1152,7 +1152,7 @@ void ServerChannelPutGetRequesterImpl::send(ByteBuffer* buffer, TransportSendCon
|
||||
/****************************************************************************************/
|
||||
void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
@ -1352,14 +1352,14 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
|
||||
buffer->putByte((int8)request);
|
||||
|
||||
// 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)
|
||||
{
|
||||
changedBitSet->serialize(buffer, control);
|
||||
element->getPVStructure()->serialize(buffer, control, changedBitSet.get());
|
||||
element->pvStructurePtr->serialize(buffer, control, changedBitSet.get());
|
||||
|
||||
// overrunBitset
|
||||
element->getOverrunBitSet()->serialize(buffer, control);
|
||||
element->overrunBitSet->serialize(buffer, control);
|
||||
}
|
||||
|
||||
monitor->release(element);
|
||||
@ -1370,7 +1370,7 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
|
||||
/****************************************************************************************/
|
||||
void ServerArrayHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -1595,7 +1595,7 @@ void ServerChannelArrayRequesterImpl::send(ByteBuffer* buffer, TransportSendCont
|
||||
/****************************************************************************************/
|
||||
void ServerCancelRequestHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -1635,7 +1635,7 @@ void ServerCancelRequestHandler::failureResponse(Transport::shared_pointer const
|
||||
/****************************************************************************************/
|
||||
void ServerProcessHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -1794,7 +1794,7 @@ void ServerChannelProcessRequesterImpl::send(ByteBuffer* buffer, TransportSendCo
|
||||
/****************************************************************************************/
|
||||
void ServerGetFieldHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -1873,7 +1873,7 @@ void ServerGetFieldRequesterImpl::send(ByteBuffer* buffer, TransportSendControl*
|
||||
/****************************************************************************************/
|
||||
void ServerRPCHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
Transport::shared_pointer const & transport, int8 version, int8 command,
|
||||
int payloadSize, ByteBuffer* payloadBuffer) {
|
||||
size_t payloadSize, ByteBuffer* payloadBuffer) {
|
||||
AbstractServerResponseHandler::handleResponse(responseFrom,
|
||||
transport, version, command, payloadSize, payloadBuffer);
|
||||
|
||||
@ -2034,7 +2034,7 @@ void ServerChannelRPCRequesterImpl::send(ByteBuffer* buffer, TransportSendContro
|
||||
}
|
||||
else
|
||||
{
|
||||
introspectionRegistry->serializeStructure(buffer, control, _pvResponse.get());
|
||||
introspectionRegistry->serializeStructure(buffer, control, _pvResponse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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,
|
||||
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:
|
||||
/**
|
||||
* Table of response handlers for each command ID.
|
||||
@ -78,7 +78,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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,
|
||||
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 {
|
||||
@ -142,7 +142,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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,
|
||||
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:
|
||||
std::vector<ChannelProvider::shared_pointer> _providers;
|
||||
@ -208,7 +208,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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:
|
||||
void disconnect(Transport::shared_pointer const & transport);
|
||||
@ -257,7 +257,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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,
|
||||
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 :
|
||||
@ -352,7 +352,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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 :
|
||||
@ -405,7 +405,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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 :
|
||||
@ -459,7 +459,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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,
|
||||
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 monitorEvent(epics::pvData::Monitor::shared_pointer const & monitor);
|
||||
void lock();
|
||||
@ -511,7 +511,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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 :
|
||||
@ -565,7 +565,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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:
|
||||
|
||||
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,
|
||||
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 :
|
||||
@ -634,7 +634,7 @@ namespace pvAccess {
|
||||
|
||||
virtual void handleResponse(osiSockAddr* responseFrom,
|
||||
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:
|
||||
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,
|
||||
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 :
|
||||
|
@ -17,15 +17,11 @@ namespace pvAccess {
|
||||
const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1;
|
||||
const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2;
|
||||
const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3;
|
||||
PVDataCreate* IntrospectionRegistry::_pvDataCreate = 0;
|
||||
FieldCreate* IntrospectionRegistry::_fieldCreate = 0;
|
||||
PVDataCreatePtr IntrospectionRegistry::_pvDataCreate (getPVDataCreate());
|
||||
FieldCreatePtr IntrospectionRegistry::_fieldCreate(getFieldCreate());
|
||||
|
||||
IntrospectionRegistry::IntrospectionRegistry(bool serverSide)
|
||||
{
|
||||
// TODO not optimal
|
||||
_pvDataCreate = getPVDataCreate();
|
||||
_fieldCreate = getFieldCreate();
|
||||
|
||||
_direction = serverSide ? 1 : -1;
|
||||
reset();
|
||||
}
|
||||
@ -181,7 +177,7 @@ void IntrospectionRegistry::serialize(FieldConstPtr field, StructureConstPtr par
|
||||
FieldConstPtr IntrospectionRegistry::deserialize(ByteBuffer* buffer, DeserializableControl* control, IntrospectionRegistry* registry)
|
||||
{
|
||||
control->ensureData(1);
|
||||
uintptr_t pos = buffer->getPosition();
|
||||
size_t pos = buffer->getPosition();
|
||||
const int8 typeCode = buffer->getByte();
|
||||
if(typeCode == IntrospectionRegistry::NULL_TYPE_CODE)
|
||||
{
|
||||
@ -225,12 +221,11 @@ void IntrospectionRegistry::serializeStructure(ByteBuffer* buffer, SerializableC
|
||||
|
||||
PVStructurePtr IntrospectionRegistry::deserializeStructure(ByteBuffer* buffer, DeserializableControl* control)
|
||||
{
|
||||
PVStructurePtr pvStructure = NULL;
|
||||
PVStructurePtr pvStructure;
|
||||
FieldConstPtr structureField = deserialize(buffer, control);
|
||||
if (structureField != NULL)
|
||||
if (structureField.get() != NULL)
|
||||
{
|
||||
pvStructure = _pvDataCreate->createPVStructure(NULL,
|
||||
static_pointer_cast<const Structure>(structureField));
|
||||
pvStructure = _pvDataCreate->createPVStructure(static_pointer_cast<const Structure>(structureField));
|
||||
pvStructure->deserialize(buffer, control);
|
||||
}
|
||||
return pvStructure;
|
||||
@ -252,12 +247,9 @@ PVStructurePtr IntrospectionRegistry::deserializeStructureAndCreatePVStructure(B
|
||||
{
|
||||
FieldConstPtr field = deserialize(buffer, control);
|
||||
if (field == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
PVStructurePtr retVal = _pvDataCreate->createPVStructure(NULL,
|
||||
static_pointer_cast<const Structure>(field));
|
||||
return retVal;
|
||||
return PVStructurePtr();
|
||||
|
||||
return _pvDataCreate->createPVStructure(static_pointer_cast<const Structure>(field));
|
||||
}
|
||||
|
||||
void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status)
|
||||
|
@ -211,12 +211,12 @@ typedef std::map<const short,epics::pvData::FieldConstPtr> registryMap_t;
|
||||
/**
|
||||
* PVField factory.
|
||||
*/
|
||||
static epics::pvData::PVDataCreate* _pvDataCreate;
|
||||
static epics::pvData::PVDataCreatePtr _pvDataCreate;
|
||||
|
||||
/**
|
||||
* Field factory.
|
||||
*/
|
||||
static epics::pvData::FieldCreate* _fieldCreate;
|
||||
static epics::pvData::FieldCreatePtr _fieldCreate;
|
||||
|
||||
bool registryContainsValue(epics::pvData::FieldConstPtr field, short& key);
|
||||
};
|
||||
|
@ -124,13 +124,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
|
||||
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
|
||||
{
|
||||
PVFieldPtrArray fieldsData = data->getPVFields();
|
||||
if (fieldsData != 0) {
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVField *fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField,notFirst + 1);
|
||||
}
|
||||
}
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVFieldPtr fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField.get(),notFirst + 1);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
BooleanArrayData data = BooleanArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
BooleanArray value = data.data;
|
||||
if(value[data.offset]) {
|
||||
@ -163,9 +161,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
|
||||
ByteArrayData data = ByteArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -182,9 +180,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
|
||||
ShortArrayData data = ShortArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -201,9 +199,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
|
||||
IntArrayData data = IntArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -220,9 +218,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
|
||||
LongArrayData data = LongArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int64 val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -239,9 +237,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
|
||||
FloatArrayData data = FloatArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
float val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -258,9 +256,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
|
||||
DoubleArrayData data = DoubleArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
double val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -277,9 +275,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
|
||||
StringArrayData data = StringArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
StringArray value = data.data;
|
||||
if(num==1) {
|
||||
if(value[data.offset].length()>0) {
|
||||
@ -307,13 +305,13 @@ void convertStructureArray(StringBuilder buffer,
|
||||
return;
|
||||
}
|
||||
StructureArrayData data = StructureArrayData();
|
||||
pvdata->get(0, length, &data);
|
||||
pvdata->get(0, length, data);
|
||||
for (int i = 0; i < length; i++) {
|
||||
PVStructure *pvStructure = data.data[i];
|
||||
PVStructurePtr pvStructure = data.data[i];
|
||||
if (pvStructure == 0) {
|
||||
*buffer += "null";
|
||||
} 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)
|
||||
{
|
||||
PVStringArray* labels = static_cast<PVStringArray*>(pvStruct->getScalarArrayField("labels", pvString));
|
||||
if (labels == 0)
|
||||
PVStringArrayPtr labels = static_pointer_cast<PVStringArray>(pvStruct->getScalarArrayField("labels", pvString));
|
||||
if (labels.get() == 0)
|
||||
return; // TODO
|
||||
|
||||
int numColumns = labels->getLength();
|
||||
@ -379,23 +377,24 @@ void formatNTTable(StringBuilder buffer, PVStructure *pvStruct)
|
||||
|
||||
// next numColumns fields are columns
|
||||
int maxValues = 0;
|
||||
vector<DoubleArrayData> columnData;
|
||||
// vector<DoubleArrayData> columnData;
|
||||
vector<vector<double>*> columnData;
|
||||
PVFieldPtrArray fields = pvStruct->getPVFields();
|
||||
for (int i = 0; i < numColumns; i++)
|
||||
{
|
||||
DoubleArrayData values;
|
||||
// TODO we relay on field ordering here (normativeType, labels, <columns>)
|
||||
PVDoubleArray* arrayField = static_cast<PVDoubleArray*>(fields[i+2]);
|
||||
int count = arrayField->get(0, arrayField->getLength(), &values);
|
||||
PVDoubleArrayPtr arrayField = static_pointer_cast<PVDoubleArray>(fields[i+2]);
|
||||
int count = arrayField->get(0, arrayField->getLength(), values);
|
||||
if (count > maxValues) maxValues = count;
|
||||
columnData.push_back(values);
|
||||
columnData.push_back(&values.data);
|
||||
}
|
||||
|
||||
std::cout << std::left;
|
||||
|
||||
// first print labels
|
||||
StringArrayData data;
|
||||
labels->get(0, numColumns, &data);
|
||||
labels->get(0, numColumns, data);
|
||||
for (int i = 0; i < numColumns; 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++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
@ -422,8 +422,8 @@ void toNTString(StringBuilder buffer, PVField *pv,int notFirst)
|
||||
{
|
||||
PVStructure* pvStruct = static_cast<PVStructure*>(pv);
|
||||
// TODO type check, getStringField is verbose
|
||||
PVString* ntType = static_cast<PVString*>(pvStruct->getSubField("normativeType"));
|
||||
if (ntType)
|
||||
PVStringPtr ntType = static_pointer_cast<PVString>(pvStruct->getSubField("normativeType"));
|
||||
if (ntType.get())
|
||||
{
|
||||
String value = ntType->get();
|
||||
|
||||
@ -508,7 +508,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
|
||||
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,
|
||||
@ -610,7 +610,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
|
||||
|
||||
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)
|
||||
@ -713,7 +713,7 @@ public:
|
||||
|
||||
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)
|
||||
@ -935,15 +935,17 @@ int main (int argc, char *argv[])
|
||||
}
|
||||
|
||||
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();
|
||||
iter != parameters.end();
|
||||
iter++, i++)
|
||||
{
|
||||
fields[i] = getFieldCreate()->createScalar(iter->first, pvString);
|
||||
fieldNames[i] = iter->first;
|
||||
fields[i] = getFieldCreate()->createScalar(pvString);
|
||||
}
|
||||
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();
|
||||
iter != parameters.end();
|
||||
iter++)
|
||||
|
@ -123,16 +123,14 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
|
||||
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
|
||||
{
|
||||
PVFieldPtrArray fieldsData = data->getPVFields();
|
||||
if (fieldsData != 0) {
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVField *fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField,notFirst + 1);
|
||||
}
|
||||
}
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVFieldPtr fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField.get(),notFirst + 1);
|
||||
}
|
||||
}
|
||||
|
||||
void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
void convertArray(StringBuilder buffer,PVScalarArray *pv,int notFirst)
|
||||
{
|
||||
ScalarArrayConstPtr array = pv->getScalarArray();
|
||||
ScalarType type = array->getElementType();
|
||||
@ -141,9 +139,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVBooleanArray *pvdata = static_cast<PVBooleanArray*>(pv);
|
||||
BooleanArrayData data = BooleanArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
BooleanArray value = data.data;
|
||||
if(value[data.offset]) {
|
||||
@ -162,9 +160,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
|
||||
ByteArrayData data = ByteArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -181,9 +179,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
|
||||
ShortArrayData data = ShortArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -200,9 +198,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
|
||||
IntArrayData data = IntArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -219,9 +217,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
|
||||
LongArrayData data = LongArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int64 val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -238,9 +236,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
|
||||
FloatArrayData data = FloatArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
float val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -257,9 +255,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
|
||||
DoubleArrayData data = DoubleArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
double val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -276,9 +274,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
|
||||
StringArrayData data = StringArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
StringArray value = data.data;
|
||||
if(num==1) {
|
||||
if(value[data.offset].length()>0) {
|
||||
@ -306,13 +304,13 @@ void convertStructureArray(StringBuilder buffer,
|
||||
return;
|
||||
}
|
||||
StructureArrayData data = StructureArrayData();
|
||||
pvdata->get(0, length, &data);
|
||||
pvdata->get(0, length, data);
|
||||
for (int i = 0; i < length; i++) {
|
||||
PVStructure *pvStructure = data.data[i];
|
||||
PVStructurePtr pvStructure = data.data[i];
|
||||
if (pvStructure == 0) {
|
||||
*buffer += "null";
|
||||
} 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)
|
||||
{
|
||||
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,
|
||||
@ -475,7 +473,7 @@ public:
|
||||
|
||||
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)
|
||||
|
@ -121,13 +121,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst)
|
||||
void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst)
|
||||
{
|
||||
PVFieldPtrArray fieldsData = data->getPVFields();
|
||||
if (fieldsData != 0) {
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVField *fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField,notFirst + 1);
|
||||
}
|
||||
}
|
||||
int length = data->getStructure()->getNumberFields();
|
||||
for(int i=0; i<length; i++) {
|
||||
PVFieldPtr fieldField = fieldsData[i];
|
||||
convertToString(buffer,fieldField.get(),notFirst + 1);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
BooleanArrayData data = BooleanArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
BooleanArray value = data.data;
|
||||
if(value[data.offset]) {
|
||||
@ -160,9 +158,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVByteArray *pvdata = static_cast<PVByteArray*>(pv);
|
||||
ByteArrayData data = ByteArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -179,9 +177,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVShortArray *pvdata = static_cast<PVShortArray*>(pv);
|
||||
ShortArrayData data = ShortArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -198,9 +196,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVIntArray *pvdata = static_cast<PVIntArray*>(pv);
|
||||
IntArrayData data = IntArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -217,9 +215,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVLongArray *pvdata = static_cast<PVLongArray*>(pv);
|
||||
LongArrayData data = LongArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
int64 val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -236,9 +234,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVFloatArray *pvdata = static_cast<PVFloatArray*>(pv);
|
||||
FloatArrayData data = FloatArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
float val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -255,9 +253,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVDoubleArray *pvdata = static_cast<PVDoubleArray*>(pv);
|
||||
DoubleArrayData data = DoubleArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ',';
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
if(num==1) {
|
||||
double val = data.data[data.offset];
|
||||
char buf[16];
|
||||
@ -274,9 +272,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst)
|
||||
PVStringArray *pvdata = static_cast<PVStringArray*>(pv);
|
||||
StringArrayData data = StringArrayData();
|
||||
*buffer += "[";
|
||||
for(int i=0; i < pvdata->getLength(); i++) {
|
||||
for(size_t i=0; i < pvdata->getLength(); i++) {
|
||||
if(i!=0) *buffer += ",";
|
||||
int num = pvdata->get(i,1,&data);
|
||||
int num = pvdata->get(i,1,data);
|
||||
StringArray value = data.data;
|
||||
if(num==1) {
|
||||
if(value[data.offset].length()>0) {
|
||||
@ -304,13 +302,13 @@ void convertStructureArray(StringBuilder buffer,
|
||||
return;
|
||||
}
|
||||
StructureArrayData data = StructureArrayData();
|
||||
pvdata->get(0, length, &data);
|
||||
pvdata->get(0, length, data);
|
||||
for (int i = 0; i < length; i++) {
|
||||
PVStructure *pvStructure = data.data[i];
|
||||
PVStructurePtr pvStructure = data.data[i];
|
||||
if (pvStructure == 0) {
|
||||
*buffer += "null";
|
||||
} 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)
|
||||
{
|
||||
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,
|
||||
@ -485,7 +483,7 @@ public:
|
||||
|
||||
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)
|
||||
@ -635,7 +633,7 @@ int main (int argc, char *argv[])
|
||||
allOK &= putRequesterImpl->waitUntilDone(timeOut);
|
||||
if (allOK)
|
||||
{
|
||||
getConvert()->fromString(putRequesterImpl->getStructure().get(), values);
|
||||
getConvert()->fromString(putRequesterImpl->getStructure(), values);
|
||||
|
||||
putRequesterImpl->resetEvent();
|
||||
channelPut->put(false);
|
||||
|
@ -68,7 +68,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
|
||||
|
||||
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()
|
||||
@ -96,7 +96,7 @@ public:
|
||||
|
||||
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)
|
||||
@ -243,8 +243,10 @@ int main (int argc, char *argv[])
|
||||
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
|
||||
StringArray fieldNames;
|
||||
FieldConstPtrArray fields;
|
||||
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);
|
||||
allOK &= rpcRequesterImpl->waitUntilDone(timeOut);
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
if(command==CMD_CONNECTION_VALIDATION) transport->verified();
|
||||
|
@ -40,7 +40,7 @@ private:
|
||||
class DummyResponseHandler : public ResponseHandler {
|
||||
public:
|
||||
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) {
|
||||
cout << "DummyResponseHandler::handleResponse" << endl;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ public:
|
||||
virtual ~DummyResponseHandler() {}
|
||||
|
||||
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) {
|
||||
}
|
||||
};
|
||||
|
@ -60,14 +60,14 @@ public:
|
||||
}
|
||||
|
||||
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);
|
||||
private:
|
||||
int packets;
|
||||
};
|
||||
|
||||
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) {
|
||||
std::ostringstream os;
|
||||
|
||||
@ -84,7 +84,7 @@ void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom,
|
||||
|
||||
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;
|
||||
payloadBuffer->get(payload, 0, dataCount);
|
||||
os<<"Payload ("<<i<<"-"<<(dataCount-1)<<")";
|
||||
|
@ -33,7 +33,7 @@ private:
|
||||
|
||||
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)
|
||||
|
@ -20,9 +20,11 @@ using namespace std::tr1;
|
||||
using namespace epics::pvData;
|
||||
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)"
|
||||
|
||||
double timeOut = DEFAULT_TIMEOUT;
|
||||
@ -40,6 +42,25 @@ void usage (void)
|
||||
, 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
|
||||
{
|
||||
@ -48,6 +69,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
PVStructure::shared_pointer m_pvStructure;
|
||||
BitSet::shared_pointer m_bitSet;
|
||||
Event m_event;
|
||||
Event m_connectionEvent;
|
||||
String m_channelName;
|
||||
int m_count;
|
||||
|
||||
@ -64,7 +86,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
|
||||
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,
|
||||
@ -83,11 +105,14 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
m_channelGet = channelGet;
|
||||
m_pvStructure = pvStructure;
|
||||
m_bitSet = bitSet;
|
||||
|
||||
m_connectionEvent.signal();
|
||||
|
||||
/*
|
||||
m_count = COUNT;
|
||||
|
||||
gettimeofday(&m_startTime, NULL);
|
||||
m_channelGet->get(false);
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -105,32 +130,43 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
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);
|
||||
//std::cout << str << std::endl;
|
||||
|
||||
//m_event.signal();
|
||||
|
||||
if (--m_count)
|
||||
m_channelGet->get(false);
|
||||
else
|
||||
{
|
||||
timeval endTime;
|
||||
gettimeofday(&endTime, NULL);
|
||||
}
|
||||
else if (channelCount == 0)
|
||||
{
|
||||
|
||||
get_all();
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
{
|
||||
@ -139,10 +175,16 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
|
||||
}
|
||||
|
||||
bool wait(double timeOut)
|
||||
/*
|
||||
void get()
|
||||
{
|
||||
return m_event.wait(timeOut);
|
||||
}
|
||||
*/
|
||||
bool waitUntilConnected(double timeOut)
|
||||
{
|
||||
return m_connectionEvent.wait(timeOut);
|
||||
}
|
||||
};
|
||||
|
||||
class ChannelRequesterImpl : public ChannelRequester
|
||||
@ -159,7 +201,7 @@ public:
|
||||
|
||||
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,
|
||||
@ -194,9 +236,10 @@ public:
|
||||
};
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
if (nPvs < 1 || nPvs > 1)
|
||||
{
|
||||
fprintf(stderr, "No pv name specified. ('testGetPerformance -h' for help.)\n");
|
||||
return 1;
|
||||
}
|
||||
printf("%d channels of double array size of %d elements, %d repetitions per sample\n", CHANNELS, ARRAY_SIZE, COUNT);
|
||||
|
||||
vector<string> pvs;
|
||||
char buf[64];
|
||||
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 {
|
||||
pvRequest = getCreateRequest()->createRequest(request);
|
||||
@ -257,33 +303,57 @@ int main (int argc, char *argv[])
|
||||
ClientFactory::start();
|
||||
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
|
||||
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))
|
||||
{
|
||||
shared_ptr<ChannelGetRequesterImpl> getRequesterImpl(new
|
||||
ChannelGetRequesterImpl(channel->getChannelName()));
|
||||
ChannelGet::shared_pointer channelGet = channel->createChannelGet(getRequesterImpl, pvRequest);
|
||||
|
||||
allOK &= getRequesterImpl->wait(timeOut);
|
||||
allOK = getRequesterImpl->waitUntilConnected(timeOut);
|
||||
|
||||
if (!allOK)
|
||||
{
|
||||
std::cout << "[" << channel->getChannelName() << "] failed to get all the gets" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
channelGet->destroy();
|
||||
getCs.push_back(channelGet);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
allOK = false;
|
||||
channel->destroy();
|
||||
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;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class ChannelRequesterImpl : public ChannelRequester
|
||||
|
||||
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)
|
||||
@ -56,7 +56,7 @@ class GetFieldRequesterImpl : public GetFieldRequester
|
||||
|
||||
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)
|
||||
@ -91,7 +91,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
|
||||
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,
|
||||
@ -141,7 +141,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
|
||||
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,
|
||||
@ -197,7 +197,7 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester
|
||||
|
||||
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,
|
||||
@ -275,7 +275,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester
|
||||
|
||||
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)
|
||||
@ -314,7 +314,7 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester
|
||||
|
||||
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,
|
||||
@ -364,10 +364,10 @@ class MonitorRequesterImpl : public MonitorRequester
|
||||
|
||||
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;
|
||||
if (status.isSuccess() && structure)
|
||||
@ -385,11 +385,11 @@ class MonitorRequesterImpl : public MonitorRequester
|
||||
MonitorElement::shared_pointer element = monitor->poll();
|
||||
|
||||
String str("changed/overrun ");
|
||||
element->getChangedBitSet()->toString(&str);
|
||||
element->changedBitSet->toString(&str);
|
||||
str += '/';
|
||||
element->getOverrunBitSet()->toString(&str);
|
||||
element->overrunBitSet->toString(&str);
|
||||
str += '\n';
|
||||
element->getPVStructure()->toString(&str);
|
||||
element->pvStructurePtr->toString(&str);
|
||||
std::cout << str << std::endl;
|
||||
|
||||
monitor->release(element);
|
||||
@ -413,7 +413,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester
|
||||
|
||||
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)
|
||||
@ -526,10 +526,9 @@ int main(int argc,char *argv[])
|
||||
|
||||
{
|
||||
ChannelArrayRequester::shared_pointer channelArrayRequesterImpl(new ChannelArrayRequesterImpl());
|
||||
PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(0, "", 0));
|
||||
PVString* pvFieldName = (PVString*)getPVDataCreate()->createPVScalar(pvRequest.get(), "field", pvString);
|
||||
pvFieldName->put("value");
|
||||
pvRequest->appendPVField(pvFieldName);
|
||||
StringArray fieldNames(1); fieldNames.push_back("field");
|
||||
FieldConstPtrArray fields(1); fields.push_back(getFieldCreate()->createScalar(pvString));
|
||||
PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
|
||||
|
||||
ChannelArray::shared_pointer channelArray = channel->createChannelArray(channelArrayRequesterImpl, pvRequest);
|
||||
epicsThreadSleep ( 1.0 );
|
||||
|
@ -28,7 +28,7 @@ class MockChannelProcess :
|
||||
private:
|
||||
ChannelProcessRequester::shared_pointer m_channelProcessRequester;
|
||||
PVStructure::shared_pointer m_pvStructure;
|
||||
PVScalar* m_valueField;
|
||||
PVScalarPtr m_valueField;
|
||||
|
||||
protected:
|
||||
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);
|
||||
|
||||
ChannelProcess::shared_pointer thisPtr; // we return null = static_pointer_cast<ChannelProcess>(shared_from_this());
|
||||
PVField* field = pvStructure->getSubField(String("value"));
|
||||
if (field == 0)
|
||||
PVFieldPtr field = pvStructure->getSubField(String("value"));
|
||||
if (field.get() == 0)
|
||||
{
|
||||
Status noValueFieldStatus(Status::STATUSTYPE_ERROR, "no 'value' field");
|
||||
m_channelProcessRequester->channelProcessConnect(noValueFieldStatus, thisPtr);
|
||||
@ -56,7 +56,7 @@ class MockChannelProcess :
|
||||
return;
|
||||
}
|
||||
|
||||
m_valueField = static_cast<PVScalar*>(field);
|
||||
m_valueField = static_pointer_cast<PVScalar>(field);
|
||||
}
|
||||
|
||||
public:
|
||||
@ -83,56 +83,56 @@ class MockChannelProcess :
|
||||
case pvBoolean:
|
||||
{
|
||||
// negate
|
||||
PVBoolean *pvBoolean = static_cast<PVBoolean*>(m_valueField);
|
||||
PVBooleanPtr pvBoolean = static_pointer_cast<PVBoolean>(m_valueField);
|
||||
pvBoolean->put(!pvBoolean->get());
|
||||
break;
|
||||
}
|
||||
case pvByte:
|
||||
{
|
||||
// increment by one
|
||||
PVByte *pvByte = static_cast<PVByte*>(m_valueField);
|
||||
PVBytePtr pvByte = static_pointer_cast<PVByte>(m_valueField);
|
||||
pvByte->put(pvByte->get() + 1);
|
||||
break;
|
||||
}
|
||||
case pvShort:
|
||||
{
|
||||
// increment by one
|
||||
PVShort *pvShort = static_cast<PVShort*>(m_valueField);
|
||||
PVShortPtr pvShort = static_pointer_cast<PVShort>(m_valueField);
|
||||
pvShort->put(pvShort->get() + 1);
|
||||
break;
|
||||
}
|
||||
case pvInt:
|
||||
{
|
||||
// increment by one
|
||||
PVInt *pvInt = static_cast<PVInt*>(m_valueField);
|
||||
PVIntPtr pvInt = static_pointer_cast<PVInt>(m_valueField);
|
||||
pvInt->put(pvInt->get() + 1);
|
||||
break;
|
||||
}
|
||||
case pvLong:
|
||||
{
|
||||
// increment by one
|
||||
PVLong *pvLong = static_cast<PVLong*>(m_valueField);
|
||||
PVLongPtr pvLong = static_pointer_cast<PVLong>(m_valueField);
|
||||
pvLong->put(pvLong->get() + 1);
|
||||
break;
|
||||
}
|
||||
case pvFloat:
|
||||
{
|
||||
// increment by one
|
||||
PVFloat *pvFloat = static_cast<PVFloat*>(m_valueField);
|
||||
PVFloatPtr pvFloat = static_pointer_cast<PVFloat>(m_valueField);
|
||||
pvFloat->put(pvFloat->get() + 1.0f);
|
||||
break;
|
||||
}
|
||||
case pvDouble:
|
||||
{
|
||||
// increment by one
|
||||
PVDouble *pvDouble = static_cast<PVDouble*>(m_valueField);
|
||||
PVDoublePtr pvDouble = static_pointer_cast<PVDouble>(m_valueField);
|
||||
pvDouble->put(pvDouble->get() + 1.0);
|
||||
break;
|
||||
}
|
||||
case pvString:
|
||||
{
|
||||
// increment by one
|
||||
PVString *pvString = static_cast<PVString*>(m_valueField);
|
||||
PVStringPtr pvString = static_pointer_cast<PVString>(m_valueField);
|
||||
String val = pvString->get();
|
||||
if (val.empty())
|
||||
pvString->put("gen0");
|
||||
@ -404,8 +404,8 @@ class MockChannelRPC : public ChannelRPC
|
||||
if (m_channelName == "rpcNTTable")
|
||||
{
|
||||
// TODO type check, getStringField is verbose
|
||||
PVString* columns = static_cast<PVString*>(pvArgument->getSubField("columns"));
|
||||
if (columns == 0)
|
||||
PVStringPtr columns = static_pointer_cast<PVString>(pvArgument->getSubField("columns"));
|
||||
if (columns.get() == 0)
|
||||
{
|
||||
PVStructure::shared_pointer nullPtr;
|
||||
Status errorStatus(Status::STATUSTYPE_ERROR, "no columns specified");
|
||||
@ -415,23 +415,27 @@ class MockChannelRPC : public ChannelRPC
|
||||
{
|
||||
int i = 0;
|
||||
int totalFields = 1 + 1 + atoi(columns->get().c_str()); // normativeType, labels, <columns>
|
||||
FieldConstPtrArray fields = new FieldConstPtr[totalFields];
|
||||
fields[i++] = getFieldCreate()->createScalar("normativeType", pvString);
|
||||
fields[i++] = getFieldCreate()->createScalarArray("labels", pvString);
|
||||
StringArray fieldNames(totalFields);
|
||||
FieldConstPtrArray fields(totalFields);
|
||||
fieldNames[i] = "normativeType";
|
||||
fields[i++] = getFieldCreate()->createScalar(pvString);
|
||||
fieldNames[i] = "labels";
|
||||
fields[i++] = getFieldCreate()->createScalarArray(pvString);
|
||||
char sbuf[16];
|
||||
vector<String> labels;
|
||||
for (; i < totalFields; i++)
|
||||
{
|
||||
sprintf(sbuf, "column%d", i-1 );
|
||||
fields[i] = getFieldCreate()->createScalarArray(sbuf, pvDouble);
|
||||
fieldNames[i] = sbuf;
|
||||
fields[i] = getFieldCreate()->createScalarArray(pvDouble);
|
||||
labels.push_back(sbuf);
|
||||
}
|
||||
|
||||
PVStructure::shared_pointer result(
|
||||
new PVStructure(NULL, getFieldCreate()->createStructure("", totalFields, fields)));
|
||||
new PVStructure(getFieldCreate()->createStructure(fieldNames, fields)));
|
||||
|
||||
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) );
|
||||
|
||||
@ -446,7 +450,7 @@ class MockChannelRPC : public ChannelRPC
|
||||
iter++)
|
||||
{
|
||||
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);
|
||||
}
|
||||
@ -499,7 +503,7 @@ class MockChannelArray : public ChannelArray
|
||||
protected:
|
||||
MockChannelArray(ChannelArrayRequester::shared_pointer const & channelArrayRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) :
|
||||
m_channelArrayRequester(channelArrayRequester),
|
||||
m_pvArray(getPVDataCreate()->createPVScalarArray(0, "", pvDouble))
|
||||
m_pvArray(getPVDataCreate()->createPVScalarArray(pvDouble))
|
||||
{
|
||||
PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelArray);
|
||||
}
|
||||
@ -625,7 +629,7 @@ class MockMonitor : public Monitor, public MonitorElement, public std::tr1::enab
|
||||
return Status::Ok;
|
||||
}
|
||||
|
||||
virtual MonitorElement::shared_pointer const & poll()
|
||||
virtual MonitorElement::shared_pointer poll()
|
||||
{
|
||||
Lock xx(m_lock);
|
||||
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);
|
||||
if (m_count)
|
||||
@ -716,21 +720,62 @@ class MockChannel : public Channel {
|
||||
|
||||
if (m_name.find("array") == 0)
|
||||
{
|
||||
String allProperties("alarm,timeStamp,display,control");
|
||||
m_pvStructure.reset(getStandardPVField()->scalarArray(0,name,pvDouble,allProperties));
|
||||
PVDoubleArray *pvField = static_cast<PVDoubleArray*>(m_pvStructure->getScalarArrayField(String("value"), pvDouble));
|
||||
double v = 0;
|
||||
int ix = 0;
|
||||
const int COUNT = 1000;
|
||||
String allProperties("");
|
||||
// String allProperties("alarm,timeStamp,display,control");
|
||||
m_pvStructure = getStandardPVField()->scalarArray(pvDouble,allProperties);
|
||||
PVDoubleArrayPtr pvField = static_pointer_cast<PVDoubleArray>(m_pvStructure->getScalarArrayField(String("value"), pvDouble));
|
||||
|
||||
pvField->setCapacity(1000*COUNT);
|
||||
for (int n = 0; n < 1000; n++)
|
||||
int specCount = 0; char postfix[64];
|
||||
int done = sscanf(m_name.c_str(), "array%d%s", &specCount, postfix);
|
||||
|
||||
if (done && specCount > 0)
|
||||
{
|
||||
|
||||
double array[COUNT];
|
||||
pvField->setCapacity(specCount);
|
||||
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++)
|
||||
{
|
||||
array[i] = v; v+=1.1;
|
||||
array[i] = ix;
|
||||
}
|
||||
pvField->put(ix, COUNT, array, 0);
|
||||
ix += COUNT;
|
||||
@ -741,17 +786,24 @@ class MockChannel : public Channel {
|
||||
pvField->toString(&str);
|
||||
printf("%s\n", str.c_str());
|
||||
printf("=============------------------------------------!!!\n");
|
||||
*/
|
||||
*/
|
||||
}
|
||||
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
|
||||
{
|
||||
String allProperties("alarm,timeStamp,display,control,valueAlarm");
|
||||
m_pvStructure.reset(getStandardPVField()->scalar(0,name,pvDouble,allProperties));
|
||||
PVDouble *pvField = m_pvStructure->getDoubleField(String("value"));
|
||||
m_pvStructure = getStandardPVField()->scalar(pvDouble,allProperties);
|
||||
PVDoublePtr pvField = m_pvStructure->getDoubleField(String("value"));
|
||||
pvField->put(1.123);
|
||||
}
|
||||
}
|
||||
@ -788,7 +840,7 @@ class MockChannel : public Channel {
|
||||
|
||||
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()
|
||||
@ -831,7 +883,7 @@ class MockChannel : public Channel {
|
||||
PVFieldPtr pvField;
|
||||
if(subField == "")
|
||||
{
|
||||
pvField = m_pvStructure.get();
|
||||
pvField = m_pvStructure;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1042,7 +1094,7 @@ class ChannelRequesterImpl : public ChannelRequester
|
||||
|
||||
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)
|
||||
@ -1066,7 +1118,7 @@ class GetFieldRequesterImpl : public GetFieldRequester
|
||||
|
||||
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)
|
||||
@ -1097,7 +1149,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester
|
||||
|
||||
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,
|
||||
@ -1133,7 +1185,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester
|
||||
|
||||
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,
|
||||
@ -1176,7 +1228,7 @@ class MonitorRequesterImpl : public MonitorRequester
|
||||
|
||||
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)
|
||||
@ -1197,11 +1249,11 @@ class MonitorRequesterImpl : public MonitorRequester
|
||||
MonitorElement::shared_pointer element = monitor->poll();
|
||||
|
||||
String str("changed/overrun ");
|
||||
element->getChangedBitSet()->toString(&str);
|
||||
element->changedBitSet->toString(&str);
|
||||
str += '/';
|
||||
element->getOverrunBitSet()->toString(&str);
|
||||
element->overrunBitSet->toString(&str);
|
||||
str += '\n';
|
||||
element->getPVStructure()->toString(&str);
|
||||
element->pvStructurePtr->toString(&str);
|
||||
std::cout << str << std::endl;
|
||||
|
||||
monitor->release(element);
|
||||
@ -1225,7 +1277,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester
|
||||
|
||||
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)
|
||||
|
@ -112,7 +112,7 @@ TEST(inetAddressUtils, encodeAsIPv6Address)
|
||||
osiSockAddr addr = *paddr;
|
||||
|
||||
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);
|
||||
}
|
||||
@ -134,4 +134,4 @@ TEST(inetAddressUtils, getBroadcastAddresses)
|
||||
cout<<"\t"<<inetAddressToString(broadcasts->at(i))<<endl;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user