unsigned/size_t/shared ptrs

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

174
.cproject
View File

@ -3,11 +3,11 @@
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<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 &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
<buildOutputProvider>
<openAction enabled="true" filePath=""/>
<parser enabled="true"/>
</buildOutputProvider>
<scannerInfoProvider id="specsFile">
<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
<parser enabled="true"/>
</scannerInfoProvider>
</profile>
</scannerConfigBuildInfo>
</storageModule>
<storageModule 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
View File

@ -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)

View File

@ -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;
}

View File

@ -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));

View File

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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -141,7 +141,7 @@ namespace epics {
}
}
void BlockingUDPTransport::startMessage(int8 command, int ensureCapacity) {
void BlockingUDPTransport::startMessage(int8 command, size_t ensureCapacity) {
_lastMessageStartPosition = _sendBuffer->getPosition();
_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,

View File

@ -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:

View File

@ -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)

View File

@ -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, &timestamp, &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; }

View File

@ -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()

View File

@ -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);
}
}
}

View File

@ -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 :

View File

@ -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)

View File

@ -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);
};

View File

@ -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++)

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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;
}

View File

@ -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) {
}
};

View File

@ -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)<<")";

View File

@ -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)

View File

@ -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;
}

View File

@ -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 );

View File

@ -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)

View File

@ -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;
}
}
}