346 lines
11 KiB
HTML
346 lines
11 KiB
HTML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html;" />
|
|
<meta name="keywords" content="EPICS, EPICSv4" />
|
|
<title>EPICS V4 pvData C++ Release Notes</title>
|
|
<link rel="stylesheet" type="text/css" href="../../base.css" />
|
|
<link rel="stylesheet" type="text/css" href="../../epicsv4.css" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<h1>Release 6.0.1</h1>
|
|
|
|
<p>The changes since release 6.0.0 are:</p>
|
|
|
|
<ul>
|
|
<li>Fix "Problem building pvDataCPP for win32-x86-mingw" (issue #42)</li>
|
|
<li>In src/misc/bitSet.cpp #include <algorithm> required for MSVS 2015</li>
|
|
<li>In testApp/misc/testTypeCast.cpp print (u)int8 values as integers</li>
|
|
<li>Minor documentation updates</li>
|
|
</ul>
|
|
|
|
<h1>Release 6.0.0</h1>
|
|
|
|
<p>The main changes since release 5.0.4 are:</p>
|
|
|
|
<ul>
|
|
<li>Linux shared library version added</li>
|
|
<li>Headers have been moved into pv directories</li>
|
|
<li>Bitset functions declared const where possible</li>
|
|
<li>Bitset::swap added</li>
|
|
<li>Requester::message has default implementation</li>
|
|
<li>Serialization/deserialization helpers added</li>
|
|
<li>Non-template getSubField char* overload added</li>
|
|
<li>MonitorPlugin deprecated</li>
|
|
<li>Field name validation performed</li>
|
|
<li>Now builds for Cygwin and MinGW targets</li>
|
|
<li>Fix for debug build issue.</li>
|
|
<li>New license file replaces LICENSE and COPYRIGHT</li>
|
|
</ul>
|
|
|
|
<h2>Shared library version added</h2>
|
|
|
|
<p>Linux shared library version numbers have been added by setting SHRLIB_VERSION
|
|
(to 6.0 in this case). So shared object will be libpvData.so.6.0 instead of
|
|
libpvData.so.</p>
|
|
|
|
<h2>Headers have been moved into pv directories</h2>
|
|
|
|
<p>E.g. src/property/alarm.h -> src/property/pv/alarm.h</p>
|
|
|
|
<p>This facilitates using some IDEs such as Qt Creator.</p>
|
|
|
|
<h2>Requester::message has default implementation</h2>
|
|
|
|
<p>Requester::message is no longer pure virtual. Default implementation sends
|
|
string to std::cerr.</p>
|
|
|
|
<h2>Serialization/deserialization helpers added</h2>
|
|
|
|
<p>A helper function, serializeToVector, has been added which serializes a
|
|
Serializable object into a standard vector of UInt8s.</p>
|
|
|
|
<p>Similarly a function deserializeFromVector deserializes a standard vector into
|
|
a Deserializable object.</p>
|
|
|
|
<p>A function deserializeFromBuffer deserializes a ByteBuffer into a
|
|
Deserializable object.</p>
|
|
|
|
<h2>Field name validation performed</h2>
|
|
|
|
<p>On creating a Structure or Union the field names are now validated.</p>
|
|
|
|
<p>Valid characters for a field name are upper or lowercase letters, numbers and
|
|
underscores and intial numbers are invalid, i.e. names must be of the form
|
|
[A-Za-z<em>][A-Za-z0-9</em>]*.</p>
|
|
|
|
<h2>Now builds for Cygwin and MinGW targets</h2>
|
|
|
|
<p>Includes cross-compiling MinGW on Linux.</p>
|
|
|
|
<h1>Release 5.0.4</h1>
|
|
|
|
<p>The changes since release 5.0.3 are:</p>
|
|
|
|
<ul>
|
|
<li>Fixed bitset serialization (issue #24)</li>
|
|
<li>Fixed truncation in BitSet::or_and (issue #27)</li>
|
|
</ul>
|
|
|
|
<h2>Fixed bitset serialization (issue #24)</h2>
|
|
|
|
<p>C++ bitset serialization was not consistent with the C++ deserialization and
|
|
Java code in some instances (depending on the endianness of the serializer and
|
|
deserializer) when the number of bits was 56-63 modulo 64. C++ serialization
|
|
has been fixed.</p>
|
|
|
|
<p>Fix exposed issue in deserialization on 32-bit platforms which
|
|
has also been corrected. </p>
|
|
|
|
<h2>Fixed truncation in BitSet::or_and (issue #27)</h2>
|
|
|
|
<p>If n, n1 and n2 words are used to store the values of the bitsets bitset,
|
|
bitset1 and bitset2 respectively then max(n, min(n1,n2)) words are needed
|
|
to store bitset.or_(bitset1, bitset2).</p>
|
|
|
|
<p>Previously min(n1,n2) words were used and the result would be truncated in
|
|
some instances. This has been fixed.</p>
|
|
|
|
<h1>Release 5.0.3</h1>
|
|
|
|
<p>The only change since release 5.0.2 is:</p>
|
|
|
|
<h2>Fixed buffer overflow in PVUnion::serialize() (issue #20)</h2>
|
|
|
|
<p>A PVUnion whose stored value was null was serialized without checking
|
|
whether the buffer had sufficient capacity. This has been fixed by calling
|
|
ensureBuffer().</p>
|
|
|
|
<h1>Release 5.0.2</h1>
|
|
|
|
<p>The main changes since release 4.0.3 are:</p>
|
|
|
|
<ul>
|
|
<li>Deprecated getXXXField() methods have been removed from PVStructure</li>
|
|
<li>Convert copy methods and equals operators (re)moved</li>
|
|
<li>Convert::copyUnion now always copies between subfields.</li>
|
|
<li>New method getSubFieldT, like getSubField except it throws an exception</li>
|
|
<li>findSubField method removed from PVStructure</li>
|
|
<li>New stream operators for Field and PVField are provided</li>
|
|
<li>New template versions of Structure::getField</li>
|
|
<li>Fixes for static initialisation order issues</li>
|
|
<li>CreateRequest prevents a possible SEGFAULT</li>
|
|
</ul>
|
|
|
|
<h2>Deprecated getXXXField methods have been removed from PVStructure</h2>
|
|
|
|
<p>The following methods have been removed from PVStructure</p>
|
|
|
|
<ul>
|
|
<li>getBooleanField</li>
|
|
<li>getByteField, getShortField, getIntField, getLongField</li>
|
|
<li>getUByteField, getUShortField, getUIntField, getULongField</li>
|
|
<li>getStringField</li>
|
|
<li>getStructureField, getUnionField</li>
|
|
<li>getScalarArrayField, getStructureArrayField, getUnionArrayField</li>
|
|
</ul>
|
|
|
|
<p>Use template getSubField instead, e.g. use</p>
|
|
|
|
<pre><code>getSubField< PVInt >(fieldName)
|
|
</code></pre>
|
|
|
|
<p>in place of</p>
|
|
|
|
<pre><code>getIntField(fieldName)
|
|
</code></pre>
|
|
|
|
<h2>Convert copy methods and equals operators</h2>
|
|
|
|
<p>Convert copy methods where moved and replaced with methods
|
|
on PVField classes, i.e.</p>
|
|
|
|
<pre><code>PVField::copy(const PVField& from)
|
|
</code></pre>
|
|
|
|
<p>Methods</p>
|
|
|
|
<pre><code>PVField::copyUnchecked(const PVField& from)
|
|
</code></pre>
|
|
|
|
<p>were added to allow unchecked copies, to gain performance
|
|
where checked are not needed (anymore).</p>
|
|
|
|
<p>In addition:
|
|
- isCompatibleXXX methods were removed in favour of Field::operator==.
|
|
- equals methods were remove in favour of PVField::operator==.
|
|
- operator== methods where moved to pvIntrospect.h and pvData.h</p>
|
|
|
|
<h2>Convert::copyUnion</h2>
|
|
|
|
<p>Before this method, depending on types for to and from,
|
|
sometimes did a shallow copy, i.e. just made to shared_ptr for to
|
|
share the same data as from.
|
|
Now it always copies between the subfield of to and from.</p>
|
|
|
|
<h2>New method getSubFieldT, like getSubField except it throws an exception</h2>
|
|
|
|
<p>PVStructure has a new template member</p>
|
|
|
|
<pre><code>getSubFieldT(std::string const &fieldName)
|
|
</code></pre>
|
|
|
|
<p>that is like <b>getSubField</b> except that it throws a runtime_error
|
|
instead of returning null.</p>
|
|
|
|
<h2>findSubField method removed from PVStructure</h2>
|
|
|
|
<p>This was mainly used in the implementation of getSubField. With a change to
|
|
the latter, findSubField was removed.</p>
|
|
|
|
<h2>New stream operators</h2>
|
|
|
|
<p>New steam operators are available for Field and PVField.
|
|
Before to print a Field (or any extension) or a PVField (or any extension)
|
|
it was necessary to have code like:</p>
|
|
|
|
<pre><code> void print(StructureConstPtr struc, PVStructurePtr pv)
|
|
{
|
|
if(struc) {
|
|
cout << *struc << endl;
|
|
} else {
|
|
cout << "nullptr\n"
|
|
}
|
|
if(pv) {
|
|
cout << *.struc << endl;
|
|
} else {
|
|
cout << "nullptr\n"
|
|
}
|
|
}
|
|
</code></pre>
|
|
|
|
<p>Now it can be done as follows:</p>
|
|
|
|
<pre><code> void print(StructureConstPtr struc, PVStructurePtr pv)
|
|
{
|
|
cout << struc << endl;
|
|
cout << pv << endl;
|
|
}
|
|
</code></pre>
|
|
|
|
<h2>New template version of Structure::getField</h2>
|
|
|
|
<p>A new template getField method has been added to Structure</p>
|
|
|
|
<p>template<typename FT->
|
|
std::tr1::shared_ptr< const FT-> getField(std::string const &fieldName) const </p>
|
|
|
|
<p>Can be used, for example, as follows:</p>
|
|
|
|
<pre><code>StructurePtr tsStruc = struc->getField<Structure>("timeStamp");
|
|
</code></pre>
|
|
|
|
<h2>Fixes for static initialisation order issues</h2>
|
|
|
|
<p>Certain static builds (in particular Windows builds) of applications using
|
|
pvData had issues due to PVStructure::DEFAULT_ID being used before being initialised. This has been fixed.</p>
|
|
|
|
<h2>CreateRequest change</h2>
|
|
|
|
<p>createRequest could cause a SEGFAULT if passed a bad argument.
|
|
This has been changed so the it returns a null pvStructure
|
|
and provides an error.</p>
|
|
|
|
<h1>Release 4.0.3</h1>
|
|
|
|
<p>The main changes since release 3.0.2 are:</p>
|
|
|
|
<ul>
|
|
<li>array semantics now enforce Copy On Write.</li>
|
|
<li>String no longer defined.</li>
|
|
<li>timeStamp and valueAlarm name changes</li>
|
|
<li>toString replaced by stream I/O </li>
|
|
<li>union is new type.</li>
|
|
<li>copy is new.</li>
|
|
<li>monitorPlugin is new.</li>
|
|
</ul>
|
|
|
|
<h2>New Semantics for Arrays</h2>
|
|
|
|
<p>PVScalarArray, PVStructureArray, and PVUnionArray all enforce COW (Copy On Write) Semantics.
|
|
In order to limit memory usage the storage for raw data is managed via a new shared<em>vector facility.
|
|
This allows multiple instances of array data to use the shared raw data.
|
|
COW is implemented via shared</em>vectors of const data, i. e. data that can not be modified.</p>
|
|
|
|
<h2>String no longer defined</h2>
|
|
|
|
<p>This is replaced by std::string.</p>
|
|
|
|
<h2>timeStamp and valueAlarm name changes</h2>
|
|
|
|
<p>In timeStamp nanoSeconds is changed to nanoseconds.</p>
|
|
|
|
<p>In valueAlarm hysteresis is changed to hysteresis</p>
|
|
|
|
<h2>toString replaced by stream I/O</h2>
|
|
|
|
<p>pvData.h and pvIntrospect no longer defines toString
|
|
Instead they have stream support.
|
|
pvIntrospect uses method dump and pvData uses dumpValue.
|
|
For example:</p>
|
|
|
|
<pre><code> PVDoublePtr pvValue;
|
|
String buffer;
|
|
pvValue->toString(&buffer);
|
|
cout << buffer << endl;
|
|
buffer.clear();
|
|
pvValue->getField()->toString(&buffer);
|
|
cout << buffer << evdl;
|
|
</code></pre>
|
|
|
|
<p>is replaced by</p>
|
|
|
|
<pre><code> PVDoublePtr pvValue;
|
|
cout << *pvValue << endl
|
|
cout << *pvValue->getField() << endl;
|
|
</code></pre>
|
|
|
|
<h2>union is a new basic type.</h2>
|
|
|
|
<p>There are two new basic types: union_t and unionArray.</p>
|
|
|
|
<p>A union is like a structure that has a single subfield.
|
|
There are two flavors:</p>
|
|
|
|
<ul>
|
|
<li><b>variant union</b> The field can have any type.</li>
|
|
<li><b>union</b> The field can any of specified set of types.</li>
|
|
</ul>
|
|
|
|
<p>The field type can be dynamically changed.</p>
|
|
|
|
<h2>copy </h2>
|
|
|
|
<p>This consists of createRequest and pvCopy.
|
|
createRequest was moved from pvAccess to here.
|
|
pvCopy is moved from pvDatabaseCPP and now depends
|
|
only on pvData, i.e. it no longer has any knowledge of PVRecord.</p>
|
|
|
|
<h2>monitorPlugin</h2>
|
|
|
|
<p>This is for is for use by code that implements pvAccess monitors.
|
|
This is prototype and is subject to debate.</p>
|
|
|
|
<h1>Release 3.0.2</h1>
|
|
|
|
<p>This was the starting point for RELEASE_NOTES</p>
|
|
|
|
|
|
</body>
|
|
</html>
|