merge with 3.14.12.4-pre1
This commit is contained in:
@@ -19,7 +19,7 @@ builds with release R3.14. It describes procedures such that:</p>
|
||||
<li>The application uses the configure rules which are new to R3.14.</li>
|
||||
<li>The OSI (Operating System Independent) features of R3.14 are available,
|
||||
i.e. iocCore products can be build for vxWorks as well as other
|
||||
platforms, e.g. solaris and linux.</li>
|
||||
platforms, e.g. Solaris and Linux.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Gnumake clean uninstall</h3>
|
||||
@@ -47,10 +47,14 @@ find *App iocBoot -print | cpio -pvmd <i>/path/to/new/top</i></pre>
|
||||
|
||||
<h3>Modify <i>top</i>/configure/RELEASE</h3>
|
||||
|
||||
<p>Copy definitions of external modules excluding EPICS_BASE and
|
||||
TEMPLATES_TOP from old application RELEASE file. <br>
|
||||
If sequence programs (*.st or *.stt files) exist in your application, add the
|
||||
SNCSEQ location definition for the R3.14 sncseq external module</p>
|
||||
<p>Copy definitions of external modules excluding <tt>EPICS_BASE</tt> and
|
||||
<tt>TEMPLATE_TOP</tt> from your old application config/RELEASE file. In many
|
||||
cases the modules you actually use under R3.14 will be different to the R3.13
|
||||
modules, but the old module names here give you a starting-point for what there
|
||||
replacements will be.</p>
|
||||
|
||||
<p>If any sequence programs (*.st or *.stt files) exist in your application, add
|
||||
the SNCSEQ location definition for the R3.14 sncseq external module.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>SNCSEQ = <i>/path/to/sncseq</i></pre>
|
||||
@@ -107,7 +111,7 @@ still to convert):</p>
|
||||
</blockquote>
|
||||
|
||||
<p>This new Makefile has comments explaining how to build the various host
|
||||
and ioc products. Lets consider some examples</p>
|
||||
and IOC products. Lets consider some examples</p>
|
||||
<ul>
|
||||
<li>Host programs
|
||||
<p>Makefile.Host contains definitions like:</p>
|
||||
@@ -149,7 +153,7 @@ DBDNAME = exampleApp.dbd</pre>
|
||||
<p>NOTES: Change exampleApp.dbd to example.dbd in all st.cmd files. Also
|
||||
this definition assumes that file exampleInclude.dbd exists.</p>
|
||||
</li>
|
||||
<li>Create the ioc application:
|
||||
<li>Create the IOC application:
|
||||
<p>Makefile.Vx contains statements like:</p>
|
||||
<blockquote>
|
||||
<pre>SRCS.c += ../xxxRecord.c
|
||||
@@ -198,21 +202,22 @@ baseLIBOBJS, Makefile.Host, and Makefile.Vx</p>
|
||||
</blockquote>
|
||||
|
||||
<p>to your <i>appname</i>Include.dbd file and remove the file
|
||||
<i>name</i>App/src/base.dbd from your src directory. The base.dbd from base/dbd
|
||||
will be used instead. If you only want to load a subset of the record
|
||||
definitions from base you can keep your own copy of base.dbd, but you should
|
||||
copy the one from your R3.14 base and edit that rather than trying to re-use the
|
||||
R3.13 version from your old application.</p>
|
||||
<i>name</i>App/src/base.dbd from your src directory. The base.dbd file from
|
||||
$(EPICS_BASE)/dbd will be used instead. If you only want to load a subset of the
|
||||
record definitions from base you can keep a local edited copy of the base.dbd
|
||||
file but you should copy it from $(EPICS_BASE)/dbd and edit that rather than
|
||||
trying to re-use the R3.13 version from your old application area.</p>
|
||||
|
||||
<h3>Record support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The structure rset is now a typedef so change</p>
|
||||
<p>The <tt>struct rset</tt> is now available as a typedef so change</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>struct rset <i>recordname</i>RSET = { ... };</pre>
|
||||
@@ -224,65 +229,68 @@ R3.13 version from your old application.</p>
|
||||
<pre>rset <i>recordname</i>RSET = { ... };</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the <q>rset <i>recordname</i>RSET = { ...
|
||||
};</q> definition.</p>
|
||||
<p>and add the following line immediately after that definition:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(rset,<i>recordname</i>RSET);</pre>
|
||||
<pre>epicsExportAddress(rset, <i>recordname</i>RSET);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Device support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the dset definition <q>struct { ... }
|
||||
dev<i>name</i> = { ... };</q></p>
|
||||
<p>and add the following line after every dset definition <tt>struct { ... }
|
||||
dev<i>name</i> = { ... };</tt> in the file.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(dset,dev<i>name</i>);</pre>
|
||||
<pre>epicsExportAddress(dset, dev<i>name</i>);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Driver support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the drvet drv<i>name</i> definition</p>
|
||||
<p>and add the following line after the <tt>drvet drv<i>name</i></tt>
|
||||
definition:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(drvet,drv<i>name</i>);</pre>
|
||||
<pre>epicsExportAddress(drvet, drv<i>name</i>);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Registration code changed</h3>
|
||||
|
||||
<p>Registration code for application specific functions, e.g. subroutine record
|
||||
init and process functions, must be changed as follows</p>
|
||||
init and process functions, must be changed as follows</p>
|
||||
|
||||
<ol>
|
||||
<li>Include the following header files after all existing #includes:
|
||||
<li>Add the following header file inclusions after all other <tt>#include</tt>
|
||||
statements:
|
||||
<blockquote>
|
||||
<pre>#include "registryFunction.h"
|
||||
#include "epicsExport.h"</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Make the application specific functions static functions, e.g.
|
||||
<li>Mark the application specific functions as <tt>static</tt>, e.g.
|
||||
<blockquote>
|
||||
<pre>static long mySubInit(subRecord *precord)
|
||||
static long mySubProcess(subRecord *precord)</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Add an epicsExportFunction statement for each of the functions to be
|
||||
registered, e.g.
|
||||
<li>Add an <tt>epicsRegisterFunction</tt> statement for each of the functions
|
||||
to be registered, e.g.
|
||||
<blockquote>
|
||||
<pre>epicsExportFunction(mySubInit);
|
||||
epicsExportFunction(mySubProcess);</pre>
|
||||
<pre>epicsRegisterFunction(mySubInit);
|
||||
epicsRegisterFunction(mySubProcess);</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Add a function statement for each of the functions to be registered in a
|
||||
@@ -293,6 +301,21 @@ function("mySubProcess")</pre>
|
||||
</blockquote></li>
|
||||
</ol>
|
||||
|
||||
<h3>Additional Headers</h3>
|
||||
|
||||
<p>It may be necessary to add one or more of the following header file
|
||||
inclusions to any C source file if you get warnings or errors from the
|
||||
compilation process. The most likely file missing is errlog.h.</p>
|
||||
|
||||
<ul>
|
||||
<li><tt>#include <stdarg.h></tt></li>
|
||||
<li><tt>#include "errlog.h"</tt></li>
|
||||
<li><tt>#include "errMdef.h"</tt></li>
|
||||
<li><tt>#include "ellLib.h"</tt></li>
|
||||
<li><tt>#include "epicsTypes.h"</tt></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Modify the Makefiles in <i>top</i>/iocBoot directory.</h3>
|
||||
|
||||
<p>Change <q><tt>include $(TOP)/config/CONFIG_APP</tt></q> to <q><tt>include
|
||||
@@ -351,14 +374,13 @@ $(TOP)/configure/RULES.ioc</tt></q></p>
|
||||
ld < iocCore</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Change <q><tt>ld < <i>name</i>Lib</tt></q> to
|
||||
<p>The <tt>ld</tt> command in vxWorks 5.5.2 doesn't clean up its standard input
|
||||
stream properly, so we now recommend passing the filename to it as an argument
|
||||
instead. Change <q><tt>ld < <i>name</i>Lib</tt></q> to
|
||||
|
||||
<blockquote>
|
||||
<pre>ld 0,0, "<i>name</i>.munch"</pre>
|
||||
|
||||
<p>(The <tt>ld</tt> command in vxWorks 5.5.2 doesn't clean up its standard
|
||||
input properly, so we now recommend passing the filename to it directly
|
||||
instead.)</p> </blockquote>
|
||||
</blockquote>
|
||||
|
||||
<p>Change <q><tt>cd appbin</tt></q> to <q><tt>cd topbin</tt></q></p>
|
||||
|
||||
@@ -381,58 +403,42 @@ to
|
||||
|
||||
<p>If any source file makes calls to recGbl routines make sure it includes
|
||||
<tt>recGbl.h</tt>. If it doesn't the compiler will issue warning messages and
|
||||
the ioc may issue the message: <q>undefined symbol: _recGblSetSevr</q>.</p>
|
||||
the IOC may not compile properly, or on vxWorks you could see the load-time
|
||||
error: <q>undefined symbol: _recGblSetSevr</q>.</p>
|
||||
|
||||
<h3>Record support changes</h3>
|
||||
|
||||
<p>The steppermotor, scan, and pid records are no longer in base. If these
|
||||
records are not used in your application, comment out references to them in
|
||||
base.dbd. If these record types are used at your site, they should be
|
||||
downloaded and built with base R3.14 by your EPICS administrator. To update
|
||||
the R3.14 location of these record types in your application you must add
|
||||
appropriate module definitions to your application's config/RELEASE file and
|
||||
add <tt>LIBOBJS</tt> definitions to the src Makefile.</p>
|
||||
<p>The steppermotor, scan, and pid records are no longer in base. If these
|
||||
record types are used at your site, their unbundled modules should be downloaded
|
||||
from the EPICS website and built with base R3.14 by your EPICS administrator. To
|
||||
use these record types in your application you must add them to the application
|
||||
just like any other external support module. Most modules provide instructions
|
||||
on how to use them in an IOC application.</p>
|
||||
|
||||
<p>For example add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>PID = <i>/path/to/modules</i>/pid</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to config/RELEASE and add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>LIBOBJS += $(PID_BIN)/pidRecord.o</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to your application src/Makefile.</p>
|
||||
|
||||
<p>You should consider changing any existing old steppermotor records to the
|
||||
new EPICS motor record module supported by Beamline Controls and Data
|
||||
Acquisition at APS.</p>
|
||||
<p>Consider changing any existing old steppermotor records to the EPICS motor
|
||||
record module supported by the Beamline Controls and Data Acquisition group at
|
||||
APS.</p>
|
||||
|
||||
<h3>RecDynLink.o and devPtSoft changes</h3>
|
||||
|
||||
<p>recDynLink.o and devPtSoft.o are no longer in EPICS base and now exist as
|
||||
separate EPICS modules.You must now add the appropriate module full path
|
||||
definitions to your application config/RELEASE file, and change
|
||||
<tt>LIBOBJS</tt> location definition <tt>$(EPICS_BASE_BIN)</tt> to the module
|
||||
definition bin directory in your application src directory files. See
|
||||
<q>Hardware support changes</q> below for instructions.</p>
|
||||
separate unbundled EPICS modules. As with the three record types described
|
||||
above these must now be built separately and added as support modules to any
|
||||
applications that need them.</p>
|
||||
|
||||
<h3>Hardware support changes</h3>
|
||||
|
||||
<p>All hardware support (dev, drv and dbd files) except soft support has been
|
||||
unbundled from base R3.14. This support includes the files symb.dbd,
|
||||
drvHp1404a.o, drvEpvxiMsg.o, and drvEpvxi.o. If these are not used by your
|
||||
application, comment out references to them in base.dbd.</p>
|
||||
application, remove any references to them from your dbd files.</p>
|
||||
|
||||
<p>Hardware support now exists as separate EPICS modules. The hardware
|
||||
support for your site should be downloaded and built with base R3.14 by your
|
||||
EPICS administrator. You must now add the appropriate module full path
|
||||
definitions to your application config/RELEASE file, and change
|
||||
<tt>LIBOBJS</tt> location from <tt>$(EPICS_BASE_BIN) </tt>to the module bin
|
||||
directory in your application src directory files.</p>
|
||||
<p>Hardware support now exists as separate EPICS modules. The hardware support
|
||||
modules used at your site should be downloaded and built with base R3.14 by your
|
||||
EPICS administrator. To use them, add the appropriate module full path
|
||||
definitions to your application configure/RELEASE file, and make the documented
|
||||
changes to your Makefile to link their binaries into the your IOC
|
||||
executable.</p>
|
||||
|
||||
<p>For example, remove</p>
|
||||
|
||||
@@ -440,7 +446,7 @@ directory in your application src directory files.</p>
|
||||
<pre>LIBOBJS += $(EPICS_BASE_BIN)/symb</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>from baseLIBOBJS and add</p>
|
||||
<p>from <tt>baseLIBOBJS</tt> and add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>LIBOBJS += $(SYMB_BIN)/symb</pre>
|
||||
@@ -452,25 +458,25 @@ directory in your application src directory files.</p>
|
||||
<pre>SYMB = <full path definition for the built module SYMB></pre>
|
||||
</blockquote>
|
||||
|
||||
<p>into your application config/RELEASE file.</p>
|
||||
<p>into your application configure/RELEASE file.</p>
|
||||
|
||||
<h3>dbLoadtemplate tool changes</h3>
|
||||
|
||||
<p>The host tool dbLoadTemplate has been replace by a new EPICS extension,
|
||||
<p>The host tool dbLoadTemplate has been replace by a new EPICS extension called
|
||||
msi, which should be downloaded and built with base R3.14 by your EPICS
|
||||
administrator. dbLoadTemplate is still supported on iocs. If, in your
|
||||
application, db files are created from template and substitution files you
|
||||
should add the definition</p>
|
||||
administrator. dbLoadTemplate is still supported on IOCs. If the msi executable
|
||||
is not in your default search path and in your application db files are created
|
||||
from template and substitution files, you should add the definition</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>MSI = <full path name to msi executable></pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to your application config/RELEASE file.</p>
|
||||
</body>
|
||||
<p>to your application's configure/RELEASE file.</p>
|
||||
|
||||
<h3>Optional <i>top</i>/configure/CONFIG_SITE changes.</h3>
|
||||
<h3>Optional <i>top</i>/configure/CONFIG_SITE changes</h3>
|
||||
|
||||
<p>Review and optionally modify site build settings.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,19 +3,296 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<title>EPICS Base R3.14.12.2 Release Notes</title>
|
||||
<title>EPICS Base R3.14.12.4-pre1 Release Notes</title>
|
||||
</head>
|
||||
|
||||
<body lang="en">
|
||||
<h1 align="center">EPICS Base Release 3.14.12.2</h1>
|
||||
<h1 align="center">EPICS Base Release 3.14.12.4-pre1</h1>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2</h2>
|
||||
<h2 align="center">Changes between 3.14.12.3 and 3.14.12.4</h2>
|
||||
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h4>Named Soft Events</h4>
|
||||
<h3>Added support for 64-bit Cygwin and MinGW targets</h3>
|
||||
|
||||
<p>Soft events can now be meaningful strings instead of numbers 1-255.
|
||||
<p>Both windows-x64-mingw and cygwin-x86_64 build targets are now provided.</p>
|
||||
|
||||
<h3>CAS: GDD Reference Count Underflow</h3>
|
||||
|
||||
<p>Thanks to Bruce Hill a source of an underflow in a GDD reference count in the
|
||||
CAS code has been fixed.</p>
|
||||
|
||||
<h3>Support for Apple Xcode 5.0</h3>
|
||||
|
||||
<p>This adds the ability to build for iOS 7.0 and the ARMv8 64-bit CPU on the
|
||||
newest iPhone 5S device.</p>
|
||||
|
||||
<h3>Reading TSEL field</h3>
|
||||
|
||||
<p>The TSEL link field has two complementary uses; it is read to fetch a
|
||||
time-stamp event number for the TSE field, or if pointed to the .TIME field of
|
||||
another record the record's timestamp is copied directly from the target record.
|
||||
However with the latter usage if the TSEL link is itself read back instead of
|
||||
pointing to the .TIME field the link appears to have changed to point to the VAL
|
||||
field. This is due to an internal detail, and makes it impossible to save the
|
||||
TSEL field's value using autosave. This has been fixed, and now the TSEL field
|
||||
should always read back the same PV that it was pointed to.</p>
|
||||
|
||||
<h3>dbLoadTemplate variable limits adjustable</h3>
|
||||
|
||||
<p>The <tt>dbLoadTemplate</tt> command used to allocate a fixed amount of memory
|
||||
for the template macro values that it used to 5000 bytes, and also limited the
|
||||
number of variables that could defined to 100. These limits can now be changed
|
||||
at runtime using the variable <tt>dbTemplateMaxVars</tt> which sets the maximum
|
||||
number of macro variables that can be used; the amount of memory allocated for
|
||||
value storage is 50 times this number. This variable is registered as an iocsh
|
||||
variable in the base.dbd file, and can be adjusted as necessary before each
|
||||
individual call to <tt>dbLoadTemplate</tt>.</p>
|
||||
|
||||
<p>The code now checks for and prevents any attempt to define more than the set
|
||||
number of variables, but it does not check for overruns of the storage buffer.
|
||||
This means that template files which define many long macro value strings could
|
||||
still cause a buffer overflow and crash the IOC at startup, but increasing the
|
||||
variable is all that is needed to allow that template file to be loaded.</p>
|
||||
|
||||
<h3>Improvements to dbpf</h3>
|
||||
|
||||
<p>It is now possible to use the <tt>dbpf</tt> command to put a long string
|
||||
value into a UCHAR array field, previously only CHAR arrays were supported by
|
||||
this command even though through Channel Access could put a long string to
|
||||
either type. The error message printed by <tt>dbpf</tt> when a value conversion
|
||||
fails has also been significantly improved.</p>
|
||||
|
||||
<h3>Support for VxWorks 6.9</h3>
|
||||
|
||||
<p>Various changes have been made that were needed to allow Base to build and
|
||||
run properly on VxWorks 6.9.</p>
|
||||
|
||||
<h3>Improvements to aToIPAddr()</h3>
|
||||
|
||||
<p>The libCom routine aToIPAddr() and the vxWorks implementation of the
|
||||
associated hostToIPAddr() function have been modified to be able to look up
|
||||
hostnames that begin with one or more digits. The epicsSockResolveTest program
|
||||
was added to check this functionality.</p>
|
||||
|
||||
<h4>Added osdFindSymbol for Windows</h4>
|
||||
|
||||
<p>Dirk Zimoch implemented the epicsLoadLibrary(), epicsLoadError() and
|
||||
epicsFindSymbol() routines for Windows OS targets.</p>
|
||||
|
||||
<h4>More dbStatic commands accept "" or "*" to mean 'all'</h4>
|
||||
|
||||
<p>The IOC commands dbDumpRecordType, dbDumpMenu and dbDumpRecord will now
|
||||
accept either an empty string or any string beginning with an asterisk '*' to
|
||||
mean all record types or menus. Previously the 'all' option for these commands
|
||||
required passing in a NULL value, which could be done from the vxWorks shell but
|
||||
was not possible from iocsh.</p>
|
||||
|
||||
<h4>VxWorks sysAtReboot Registration</h4>
|
||||
|
||||
<p>The increasing intelligence of the GNU compiler and linker broke the method
|
||||
that was being used by the VxWorks code to register a reboot hook that can close
|
||||
down TCP connections nicely before the network stack gets disabled. This has
|
||||
been fixed and no longer uses a C++ static contructor to execute that code.</p>
|
||||
|
||||
<h4>IOCS_APPL_TOP and INSTALL_LOCATION</h4>
|
||||
|
||||
<p>An IOC application that sets INSTALL_LOCATION in its configure/CONFIG_SITE
|
||||
file no longer has to set IOCS_APPL_TOP there as well, unless the IOC uses a
|
||||
different path than the build host to reach the application's top directory in
|
||||
its filesystem. The IOCS_APPL_TOP variable now defaults to the value of
|
||||
INSTALL_LOCATION, so setting the latter automatically sets the former. This
|
||||
change fixes <a href="https://bugs.launchpad.net/bugs/1165257">Launchpad bug
|
||||
1165257</a>.</p>
|
||||
|
||||
<h4>devLibVME.h</h4>
|
||||
|
||||
<p>Moved the declaration of bcopyLongs() from this header into RTEMS/osdVME.h.
|
||||
Its original location broke the build for vxWorks 6.9 (the int nlongs argument
|
||||
becomes size_t in 6.9, thus conflicting with this declaration). The only local
|
||||
implementation of this routine is found in RTEMS/devLibVMEOSD.c, but it is not
|
||||
used anywhere in Base.</p>
|
||||
|
||||
<h4>Allow empty database files</h4>
|
||||
|
||||
<p>The IOC used to report an error if dbLoadRecords or dbLoadDatabase was asked
|
||||
to load an empty file or one containing just whitespace and/or comments. Such
|
||||
files are now permitted, simplifying the task of automated database generation
|
||||
programs which might discover they have nothing to output.</p>
|
||||
|
||||
<h4>High-Resolution Time Provider on MacOS</h4>
|
||||
|
||||
<p>MacOS does not provide the clock_gettime() API with CLOCK_REALTIME that other
|
||||
Posix systems implement, so we previously used gettimeofday() to fetch the
|
||||
current date & time from the OS. That older routine only provides the time with
|
||||
a resolution of 1 microsecond though, whereas clock_gettime() gives results with
|
||||
a nanosecond resolution. This release uses a new MachTime time provider on
|
||||
MacOS which uses the Mach Kernel's CALENDAR_CLOCK service to fetch the time, and
|
||||
provides nanosecond resolution.</p>
|
||||
|
||||
<h4>Time drift in periodic scans</h4>
|
||||
|
||||
<p>The implementation of the periodic scan code has been modified to remove
|
||||
long-term drift associated with OS thread sheduling. The new code keeps scan
|
||||
times much more closely tied to the system clock tick, only allowing the scan
|
||||
period to drift if the record processing time takes longer to execute than the
|
||||
interval between scans. If this happens the scan thread is made to wait for an
|
||||
additional half-period but at most 1 second before the records are scanned
|
||||
again, to allow lower priority threads some time to process on a preemptive
|
||||
priority scheduled OS. After 10 repeated over-runs a warning will be logged,
|
||||
with an increasing delay between messages up to hourly.</p>
|
||||
|
||||
<p>This fixes <a href="https://bugs.launchpad.net/bugs/597054">launchpad bug
|
||||
597054</a>.</p>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.2 and 3.14.12.3</h2>
|
||||
|
||||
<h4>Hex literals in CALC expressions</h4>
|
||||
|
||||
<p>In previous releases, CALC expressions could contain hexadecimal literal
|
||||
integers on a target if the OS implementation of strtod() allows them (the
|
||||
vxWorks implementation does not). Now hex literal integers can be used in CALC
|
||||
expressions on all architectures. Hexadecimal floating point literals may have
|
||||
worked on some architectures in the past, but will no longer be accepted.</p>
|
||||
|
||||
<h4>CAS: Added propertyEventMask support</h4>
|
||||
|
||||
<p>Server tools should now be able to detect subscriptions to and send updates
|
||||
for DBE_PROPERTY events, using a casEventMask value returned by the new
|
||||
caServer::propertyEventMask() method.</p>
|
||||
|
||||
<h4>caRepeater now built by default</h4>
|
||||
|
||||
<p>Previously caRepeater was only built for host architectures, so builds for
|
||||
cross-compiled but workstation-type targets like linux-arm did not build it.
|
||||
Explicit exceptions prevent it being built on architectures like vxWorks, RTEMS
|
||||
and iOS which do not support normal executable programs.</p>
|
||||
|
||||
<h4>Array Subroutine (aSub) record type fixes</h4>
|
||||
|
||||
<ul>
|
||||
<li>Changing the number of valid elements in a VALx field now triggers
|
||||
monitors</li>
|
||||
<li>The NEVx fields now post monitors, following the EFLG setting</li>
|
||||
<li>The artificial limit of 10,000,000 array elements has been removed</li>
|
||||
</ul>
|
||||
|
||||
<h4>Problem with NAN values in MLST/ALST fields</h4>
|
||||
|
||||
<p>The ai, ao, calc, calcout, dfanout, sel and sub record types could stop
|
||||
posting monitors if they got NAN values in their MLST or ALST fields. A change
|
||||
has been included so this should no longer be the case.</p>
|
||||
|
||||
<h4>MacOS build defaults changed</h4>
|
||||
|
||||
<p>The default build settings for darwin-x86 targets have been changed to match
|
||||
the latest version of XCode; see configure/os/CONFIG_SITE.Common.darwin-x86
|
||||
if you need to revert back to building with GCC or to include the i386 CPU
|
||||
architecture.</p>
|
||||
|
||||
<h4>Build problem with db dependencies</h4>
|
||||
|
||||
<p>The dependency output for .db and .acf files created by makeDbDepends.pl did
|
||||
not show the directories of the depended files. The makeDbDepends.pl script has
|
||||
been replaced by mkmf.pl for this purpose after modifying it to accept multiple
|
||||
-I include directory options and more than one source file on the command line.
|
||||
The makeDbDepends.pl script has been removed from Base.</p>
|
||||
|
||||
<h4>Native linux-arm builds added</h4>
|
||||
|
||||
<p>The configuration files needed for a linux-arm system to build Base for
|
||||
itself have now been added. Both the Shell and Perl versions of the startup
|
||||
EpicsHostArch scripts now recognize both arm6l and arm7l CPUs and return the
|
||||
generic linux-arm host architecture name for them.</p>
|
||||
|
||||
<h4>New Microblaze Target Architecture</h4>
|
||||
|
||||
<p>A new cross-compiled target architecture is included for the Xilinx
|
||||
Microblaze FPGA soft-core CPU architecture running Linux.</p>
|
||||
|
||||
<h4>Win32 Numeric string to enum/menu/device conversions</h4>
|
||||
|
||||
<p>Microsoft's C run-time library has a bug in the sscanf() function such that
|
||||
the "%n" format specifier does not always work. The string to enum, menu and
|
||||
device conversion functions have been modified to avoid this problem, but a
|
||||
numeric string will no longer be converted properly on any architecture if it
|
||||
has trailing whitespace characters.</p>
|
||||
|
||||
<h4>Launchpad Bugs Resolved</h4>
|
||||
|
||||
<p>The following are links to bugs in the Launchpad bug tracker that have been
|
||||
fixed in this release:</p>
|
||||
|
||||
<ul>
|
||||
<li>1090009
|
||||
<a href="https://bugs.launchpad.net/bugs/1090009">
|
||||
osdSufficentSpaceInPoolQuery fails on vxWorks 2 GB system</a></li>
|
||||
<li>999167
|
||||
<a href="https://launchpad.net/bugs/999167">
|
||||
Missing epicsShareFunc for casStatsFetch</a></li>
|
||||
<li>950555
|
||||
<a href="https://launchpad.net/bugs/950555">
|
||||
String substitution removes part of path when linking versioned shared
|
||||
libraries</a></li>
|
||||
<li>907761
|
||||
<a href="https://launchpad.net/bugs/907761">
|
||||
reading only 1st char of link in "long string" ($) syntax fails in read
|
||||
error</a></li>
|
||||
<li>903448
|
||||
<a href="https://launchpad.net/bugs/903448">
|
||||
RHEL5 nss ldap update cause stack size related failure</a>
|
||||
<p>
|
||||
This bug fix changed the stack sizes for both Posix and Windows targets as
|
||||
follows:</p>
|
||||
<table>
|
||||
<tr><th>epicsThreadStackSizeClass</th><th>New Stack Size</th></tr>
|
||||
<tr><td>epicsThreadStackSmall</td>
|
||||
<td>0x10000 × sizeof (void *)</td></tr>
|
||||
<tr><td>epicsThreadStackMedium</td>
|
||||
<td>0x20000 × sizeof (void *)</td></tr>
|
||||
<tr><td>epicsThreadStackBig</td>
|
||||
<td>0x40000 × sizeof (void *)</td></tr>
|
||||
</table></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h4>Calcout and Seq record timestamps</h4>
|
||||
|
||||
<p>Both the calcout and seq record types were not updating the record's
|
||||
timestamp before calling db_post_events() for some field updates. The calcout
|
||||
record type will now update the record's timestamp before it posts a channel
|
||||
access monitor on the DLYA field; this happens twice during record processing if
|
||||
the ODLY field is larger than 0.</p>
|
||||
|
||||
<p>Timestamps from all seq record monitor events have been wrong since 1995 or
|
||||
earlier, the time being provided was from the last time the record processed.
|
||||
Now the record timestamp will be updated between reading each DOL1..DOLA link
|
||||
and posting the monitor on the associated DO1..DOA field. The VAL field is
|
||||
never given a value by the record processing code, but is used for posting
|
||||
monitors when the alarm status or severity gets updated at the end of record
|
||||
processing. Alarm monitors are now timestamped properly at that time.</p>
|
||||
|
||||
<h4>Comments in iocsh scripts</h4>
|
||||
|
||||
<p>The IOC shell was very particular about comments in previous versions of
|
||||
Base. If the <tt>#</tt> character was indented using white-space characters it
|
||||
had to be followed immediately by a white-space, comma or parenthesis character,
|
||||
and macLib would report errors if the rest of the comment contained any
|
||||
undefined macros. These restrictions have now been removed. The comment
|
||||
character can come from expanding a macro without it having to be followed by
|
||||
white-space, although in this case macLib will still report errors due to
|
||||
undefined or circular macro definitions.</p>
|
||||
|
||||
<h4>MacOS-X: Don't use Ports/Fink unless configured</h4>
|
||||
|
||||
<p>Previous releases would automatically use headers and link to libraries found
|
||||
in the DarwinPorts and Fink installation directories. This is now controlled by
|
||||
entries in the <tt>CONFIG_SITE.darwinCommon.darwinCommon</tt> file in the
|
||||
<tt>configure/os</tt> directory, which are commented out by default. Recent
|
||||
versions of MacOS-X come with an implementation of readline, so those additional
|
||||
code repositories are no longer required.</p>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2</h2>
|
||||
|
||||
<h4>Path for Cap5 loadable library changed</h4>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Revision-Id: anj@aps.anl.gov-20101005192737-disfz3vs0f3fiixd
|
||||
# Revision-Id: anj@aps.anl.gov-20130913163652-q2i5e541twq3t3sc
|
||||
#
|
||||
# This file defines the standard record types and device support
|
||||
# provided by Base and (usually) loaded into all IOCs.
|
||||
@@ -48,3 +48,5 @@ variable(asCaDebug,int)
|
||||
variable(dbRecordsOnceOnly,int)
|
||||
variable(dbBptNotMonotonic,int)
|
||||
|
||||
# dbLoadTemplate settings
|
||||
variable(dbTemplateMaxVars,int)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
if $running_under_some_shell; # registerRecordDeviceDriver
|
||||
#!/usr/bin/env perl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2009 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
* Date: 2004-03-19
|
||||
*/
|
||||
|
||||
#include "dbBase.h"
|
||||
#include "shareLib.h"
|
||||
#include "errlog.h"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
@@ -24,16 +22,16 @@
|
||||
|
||||
|
||||
void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
const char* const* recordTypeNames, const recordTypeLocation *rtl)
|
||||
const char * const *recordTypeNames, const recordTypeLocation *rtl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nRecordTypes; i++) {
|
||||
for (i = 0; i < nRecordTypes; i++) {
|
||||
recordTypeLocation *precordTypeLocation;
|
||||
computeSizeOffset sizeOffset;
|
||||
DBENTRY dbEntry;
|
||||
|
||||
if(registryRecordTypeFind(recordTypeNames[i])) continue;
|
||||
if(!registryRecordTypeAdd(recordTypeNames[i],&rtl[i])) {
|
||||
if (registryRecordTypeFind(recordTypeNames[i])) continue;
|
||||
if (!registryRecordTypeAdd(recordTypeNames[i], &rtl[i])) {
|
||||
errlogPrintf("registryRecordTypeAdd failed %s\n",
|
||||
recordTypeNames[i]);
|
||||
continue;
|
||||
@@ -41,7 +39,7 @@ void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
dbInitEntry(pbase,&dbEntry);
|
||||
precordTypeLocation = registryRecordTypeFind(recordTypeNames[i]);
|
||||
sizeOffset = precordTypeLocation->sizeOffset;
|
||||
if(dbFindRecordType(&dbEntry,recordTypeNames[i])) {
|
||||
if (dbFindRecordType(&dbEntry, recordTypeNames[i])) {
|
||||
errlogPrintf("registerRecordDeviceDriver failed %s\n",
|
||||
recordTypeNames[i]);
|
||||
} else {
|
||||
@@ -51,12 +49,12 @@ void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
}
|
||||
|
||||
void epicsShareAPI registerDevices(DBBASE *pbase, int nDevices,
|
||||
const char* const* deviceSupportNames, const dset* const* devsl)
|
||||
const char * const *deviceSupportNames, const dset * const *devsl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nDevices; i++) {
|
||||
if(registryDeviceSupportFind(deviceSupportNames[i])) continue;
|
||||
if(!registryDeviceSupportAdd(deviceSupportNames[i],devsl[i])) {
|
||||
for (i = 0; i < nDevices; i++) {
|
||||
if (registryDeviceSupportFind(deviceSupportNames[i])) continue;
|
||||
if (!registryDeviceSupportAdd(deviceSupportNames[i], devsl[i])) {
|
||||
errlogPrintf("registryDeviceSupportAdd failed %s\n",
|
||||
deviceSupportNames[i]);
|
||||
continue;
|
||||
@@ -65,12 +63,12 @@ void epicsShareAPI registerDevices(DBBASE *pbase, int nDevices,
|
||||
}
|
||||
|
||||
void epicsShareAPI registerDrivers(DBBASE *pbase, int nDrivers,
|
||||
const char* const* driverSupportNames, struct drvet* const* drvsl)
|
||||
const char * const * driverSupportNames, struct drvet * const *drvsl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nDrivers; i++) {
|
||||
if(registryDriverSupportFind(driverSupportNames[i])) continue;
|
||||
if(!registryDriverSupportAdd(driverSupportNames[i], drvsl[i])) {
|
||||
for (i = 0; i < nDrivers; i++) {
|
||||
if (registryDriverSupportFind(driverSupportNames[i])) continue;
|
||||
if (!registryDriverSupportAdd(driverSupportNames[i], drvsl[i])) {
|
||||
errlogPrintf("registryDriverSupportAdd failed %s\n",
|
||||
driverSupportNames[i]);
|
||||
continue;
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/* registryCommon.h */
|
||||
#ifndef INC_registryCommon_H
|
||||
#define INC_registryCommon_H
|
||||
|
||||
#include "dbStaticLib.h"
|
||||
#include "registryRecordType.h"
|
||||
@@ -19,14 +20,16 @@ extern "C" {
|
||||
|
||||
epicsShareFunc void epicsShareAPI registerRecordTypes(
|
||||
DBBASE *pbase, int nRecordTypes,
|
||||
const char* const* recordTypeNames, const recordTypeLocation *rtl);
|
||||
const char * const *recordTypeNames, const recordTypeLocation *rtl);
|
||||
epicsShareFunc void epicsShareAPI registerDevices(
|
||||
DBBASE *pbase, int nDevices,
|
||||
const char* const* deviceSupportNames, const dset* const* devsl);
|
||||
const char * const *deviceSupportNames, const dset * const *devsl);
|
||||
epicsShareFunc void epicsShareAPI registerDrivers(
|
||||
DBBASE *pbase, int nDrivers,
|
||||
const char* const* driverSupportNames, struct drvet* const* drvsl);
|
||||
const char * const *driverSupportNames, struct drvet * const *drvsl);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* INC_registryCommon_H */
|
||||
|
||||
@@ -1,38 +1,30 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* registryDeviceSupport.c */
|
||||
|
||||
/* Author: Marty Kraimer Date: 08JUN99 */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "dbBase.h"
|
||||
#include "devSup.h"
|
||||
#define epicsExportSharedSymbols
|
||||
#include "registry.h"
|
||||
#include "registryDeviceSupport.h"
|
||||
|
||||
const char *deviceSupport = "device support";
|
||||
static void *registryID = (void *)&deviceSupport;
|
||||
static void *registryID = "device support";
|
||||
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryDeviceSupportAdd(
|
||||
const char *name,const struct dset *pdset)
|
||||
const char *name, const struct dset *pdset)
|
||||
{
|
||||
return(registryAdd(registryID,name,(void *)pdset));
|
||||
return registryAdd(registryID, name, (void *)pdset);
|
||||
}
|
||||
|
||||
epicsShareFunc struct dset * epicsShareAPI registryDeviceSupportFind(
|
||||
const char *name)
|
||||
{
|
||||
return((struct dset *)registryFind(registryID,name));
|
||||
return registryFind(registryID, name);
|
||||
}
|
||||
|
||||
@@ -7,18 +7,18 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
#ifndef INCregistryDeviceSupporth
|
||||
#define INCregistryDeviceSupporth
|
||||
#ifndef INC_registryDeviceSupport_H
|
||||
#define INC_registryDeviceSupport_H
|
||||
|
||||
#include "shareLib.h"
|
||||
#include "devSup.h"
|
||||
#include "shareLib.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryDeviceSupportAdd(
|
||||
const char *name,const struct dset *pdset);
|
||||
const char *name, const struct dset *pdset);
|
||||
epicsShareFunc struct dset * epicsShareAPI registryDeviceSupportFind(
|
||||
const char *name);
|
||||
|
||||
@@ -27,4 +27,4 @@ epicsShareFunc struct dset * epicsShareAPI registryDeviceSupportFind(
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* INCregistryDeviceSupporth */
|
||||
#endif /* INC_registryDeviceSupport_H */
|
||||
|
||||
@@ -1,38 +1,30 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* registryDriverSupport.c */
|
||||
|
||||
/* Author: Marty Kraimer Date: 08JUN99 */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "dbBase.h"
|
||||
#include "drvSup.h"
|
||||
#define epicsExportSharedSymbols
|
||||
#include "registry.h"
|
||||
#include "registryDriverSupport.h"
|
||||
|
||||
const char *driverSupport = "driver support";
|
||||
static void *registryID = (void *)&driverSupport;
|
||||
static void *registryID = "driver support";
|
||||
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryDriverSupportAdd(
|
||||
const char *name,struct drvet *pdrvet)
|
||||
const char *name, struct drvet *pdrvet)
|
||||
{
|
||||
return(registryAdd(registryID,name,(void *)pdrvet));
|
||||
return registryAdd(registryID, name, pdrvet);
|
||||
}
|
||||
|
||||
epicsShareFunc struct drvet * epicsShareAPI registryDriverSupportFind(
|
||||
const char *name)
|
||||
{
|
||||
return((struct drvet *)registryFind(registryID,name));
|
||||
return registryFind(registryID, name);
|
||||
}
|
||||
|
||||
@@ -7,19 +7,18 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
#ifndef INCregistryDriverSupporth
|
||||
#define INCregistryDriverSupporth
|
||||
#ifndef INC_registryDriverSupport_H
|
||||
#define INC_registryDriverSupport_H
|
||||
|
||||
#include "shareLib.h"
|
||||
#include "drvSup.h"
|
||||
#include "shareLib.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* c interface definitions */
|
||||
epicsShareFunc int epicsShareAPI registryDriverSupportAdd(
|
||||
const char *name,struct drvet *pdrvet);
|
||||
const char *name, struct drvet *pdrvet);
|
||||
epicsShareFunc struct drvet * epicsShareAPI registryDriverSupportFind(
|
||||
const char *name);
|
||||
|
||||
@@ -28,4 +27,4 @@ epicsShareFunc struct drvet * epicsShareAPI registryDriverSupportFind(
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* INCregistryDriverSupporth */
|
||||
#endif /* INC_registryDriverSupport_H */
|
||||
|
||||
@@ -1,58 +1,53 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* registryFunction.c */
|
||||
|
||||
/* Author: Marty Kraimer Date: 01MAY2000 */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "registry.h"
|
||||
#include "registryFunction.h"
|
||||
|
||||
const char *function = "function";
|
||||
static void *registryID = (void *)&function;
|
||||
static void * const registryID = "function";
|
||||
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryFunctionAdd(
|
||||
const char *name,REGISTRYFUNCTION func)
|
||||
const char *name, REGISTRYFUNCTION func)
|
||||
{
|
||||
return(registryAdd(registryID,name,(void *)func));
|
||||
return registryAdd(registryID, name, func);
|
||||
}
|
||||
|
||||
epicsShareFunc REGISTRYFUNCTION epicsShareAPI registryFunctionFind(
|
||||
const char *name)
|
||||
{
|
||||
REGISTRYFUNCTION func;
|
||||
func = (REGISTRYFUNCTION)registryFind(registryID,name);
|
||||
if(!func) {
|
||||
func = (REGISTRYFUNCTION)registryFind(0,name);
|
||||
if(func)registryFunctionAdd(name,func);
|
||||
REGISTRYFUNCTION func = registryFind(registryID, name);
|
||||
|
||||
if (!func) {
|
||||
func = registryFind(0, name);
|
||||
if (func) registryFunctionAdd(name, func);
|
||||
}
|
||||
return(func);
|
||||
return func;
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryFunctionRefAdd(
|
||||
registryFunctionRef ref[],int nfunctions)
|
||||
registryFunctionRef ref[], int nfunctions)
|
||||
{
|
||||
int ind;
|
||||
int i;
|
||||
|
||||
for(ind=0; ind<nfunctions; ind++) {
|
||||
if(!registryFunctionAdd(ref[ind].name,ref[ind].addr)) {
|
||||
for (i = 0; i < nfunctions; i++) {
|
||||
if (!registryFunctionAdd(ref[i].name, ref[i].addr)) {
|
||||
printf("registryFunctionRefAdd: could not register %s\n",
|
||||
ref[ind].name);
|
||||
return(0);
|
||||
ref[i].name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2007 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
#ifndef INCregistryFunctionh
|
||||
#define INCregistryFunctionh
|
||||
|
||||
#ifndef INC_registryFunction_H
|
||||
#define INC_registryFunction_H
|
||||
|
||||
#include "shareLib.h"
|
||||
|
||||
@@ -19,21 +19,21 @@ extern "C" {
|
||||
typedef void (*REGISTRYFUNCTION)(void);
|
||||
|
||||
typedef struct registryFunctionRef {
|
||||
const char *name;
|
||||
const char * name;
|
||||
REGISTRYFUNCTION addr;
|
||||
}registryFunctionRef;
|
||||
} registryFunctionRef;
|
||||
|
||||
|
||||
/* c interface definitions */
|
||||
epicsShareFunc int epicsShareAPI registryFunctionAdd(
|
||||
const char *name,REGISTRYFUNCTION func);
|
||||
const char *name, REGISTRYFUNCTION func);
|
||||
epicsShareFunc REGISTRYFUNCTION epicsShareAPI registryFunctionFind(
|
||||
const char *name);
|
||||
epicsShareFunc int epicsShareAPI registryFunctionRefAdd(
|
||||
registryFunctionRef ref[],int nfunctions);
|
||||
registryFunctionRef ref[], int nfunctions);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* INCregistryFunctionh */
|
||||
#endif /* INC_registryFunction_H */
|
||||
|
||||
@@ -1,37 +1,30 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* registryRecordType.c */
|
||||
|
||||
/* Author: Marty Kraimer Date: 08JUN99 */
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "dbBase.h"
|
||||
#define epicsExportSharedSymbols
|
||||
#include "registry.h"
|
||||
#include "registryRecordType.h"
|
||||
|
||||
const char *recordType = "record type";
|
||||
static void *registryID = (void *)&recordType;
|
||||
static void * const registryID = "record type";
|
||||
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryRecordTypeAdd(
|
||||
const char *name,const recordTypeLocation *prtl)
|
||||
const char *name, const recordTypeLocation *prtl)
|
||||
{
|
||||
return(registryAdd(registryID,name,(void *)prtl));
|
||||
return registryAdd(registryID, name, (void *)prtl);
|
||||
}
|
||||
|
||||
epicsShareFunc recordTypeLocation * epicsShareAPI registryRecordTypeFind(
|
||||
const char *name)
|
||||
{
|
||||
return((recordTypeLocation *)registryFind(registryID,name));
|
||||
return registryFind(registryID, name);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2007 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
#ifndef INCregistryRecordTypeh
|
||||
#define INCregistryRecordTypeh
|
||||
|
||||
#ifndef INC_registryRecordType_H
|
||||
#define INC_registryRecordType_H
|
||||
|
||||
#include "recSup.h"
|
||||
#include "shareLib.h"
|
||||
@@ -27,10 +27,9 @@ typedef struct recordTypeLocation {
|
||||
struct rset *prset;
|
||||
computeSizeOffset sizeOffset;
|
||||
}recordTypeLocation;
|
||||
|
||||
|
||||
epicsShareFunc int epicsShareAPI registryRecordTypeAdd(
|
||||
const char *name,const recordTypeLocation *prtl);
|
||||
const char *name, const recordTypeLocation *prtl);
|
||||
epicsShareFunc recordTypeLocation * epicsShareAPI registryRecordTypeFind(
|
||||
const char *name);
|
||||
|
||||
@@ -41,4 +40,4 @@ int registerRecordDeviceDriver(struct dbBase *pdbbase);
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* INCregistryRecordTypeh */
|
||||
#endif /* INC_registryRecordType_H */
|
||||
|
||||
@@ -9,7 +9,8 @@ TOP=../..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
PROD_IOC = softIoc
|
||||
PROD_IOC_DEFAULT = softIoc
|
||||
PROD_IOC_iOS = -nil-
|
||||
|
||||
DBD += softIoc.dbd
|
||||
softIoc_DBD += base.dbd
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* iocLogServer.c */
|
||||
/* Revision-Id: anj@aps.anl.gov-20110601205510-1lmsijq2jslrhe9m */
|
||||
/* Revision-Id: anj@aps.anl.gov-20121031185612-7y0fxq8gqcza98sl */
|
||||
|
||||
/*
|
||||
* archive logMsg() from several IOC's to a common rotating file
|
||||
|
||||
@@ -24,21 +24,24 @@ case $sysname in
|
||||
Linux )
|
||||
os=linux
|
||||
cpu=`uname -m`
|
||||
case $cpu in i386 | i486 | i586 | i686 )
|
||||
cpu=x86
|
||||
;;
|
||||
case $cpu in
|
||||
i386 | i486 | i586 | i686 )
|
||||
cpu=x86 ;;
|
||||
x86_64 )
|
||||
;; # $cpu is correct
|
||||
armv6l | armv7l )
|
||||
cpu=arm ;;
|
||||
esac
|
||||
if [ ${cpu} = "x86_64" ]; then
|
||||
cpu=x86_64
|
||||
fi
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
Darwin )
|
||||
os=darwin
|
||||
cpu=`uname -m`
|
||||
case $cpu in
|
||||
"Power Macintosh") cpu=ppc ;;
|
||||
i386 | x86_64 ) cpu=x86 ;;
|
||||
"Power Macintosh")
|
||||
cpu=ppc ;;
|
||||
i386 | x86_64 )
|
||||
cpu=x86 ;;
|
||||
esac
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
|
||||
@@ -9,7 +9,7 @@ eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
# Revision-Id: anj@aps.anl.gov-20110627200954-dl56anmi4ikl332u
|
||||
# Revision-Id: anj@aps.anl.gov-20121101195736-flllxznm328ryicz
|
||||
# Returns the Epics host architecture suitable
|
||||
# for assigning to the EPICS_HOST_ARCH variable
|
||||
|
||||
@@ -24,11 +24,13 @@ print "$EpicsHostArch$suffix";
|
||||
|
||||
sub GetEpicsHostArch { # no args
|
||||
$arch=$Config{'archname'};
|
||||
if ($arch =~ /sun4-solaris/) { return "solaris-sparc";
|
||||
if ($arch =~ /sun4-solaris/) { return "solaris-sparc";
|
||||
} elsif ($arch =~ m/i86pc-solaris/) { return "solaris-x86";
|
||||
} elsif ($arch =~ m/i[3-6]86-linux/) { return "linux-x86";
|
||||
} elsif ($arch =~ m/x86_64-linux/) { return "linux-x86_64";
|
||||
} elsif ($arch =~ m/i[3-6]86-linux/){ return "linux-x86";
|
||||
} elsif ($arch =~ m/x86_64-linux/) { return "linux-x86_64";
|
||||
} elsif ($arch =~ m/arm-linux/) { return "linux-arm";
|
||||
} elsif ($arch =~ m/MSWin32-x86/) { return "win32-x86";
|
||||
} elsif ($arch =~ m/MSWin32-x64/) { return "windows-x64";
|
||||
} elsif ($arch =~ m/cygwin/) { return "cygwin-x86";
|
||||
} elsif ($arch =~ m/darwin/) {
|
||||
my($kernel, $hostname, $release, $version, $cpu) = POSIX::uname();
|
||||
|
||||
Reference in New Issue
Block a user