Compare commits

...

124 Commits

Author SHA1 Message Date
157b0867fa removed unused vxWorks version defaults 2019-08-14 14:06:05 +02:00
56529964f3 always use -g for non-vxWorks gnu compiler 2019-08-14 13:55:07 +02:00
c28e240fce clear whitespace 2019-08-14 11:39:30 +02:00
b04b2dab22 fix astac crash 2019-08-13 15:13:54 +02:00
8edcd7b07f use READLINE as default for all Linux systems 2019-08-09 16:21:08 +02:00
ca78451122 move PSI specifics out to CONFIG_SITE. files 2019-08-09 13:33:41 +02:00
4cc44e3dce cleanup spaces 2019-08-09 13:32:49 +02:00
e81d3a1d7d remove strict-aliasing warnings in RHEL7 2019-08-09 11:34:50 +02:00
53dd61b80a merged with R7.0.3 2019-08-09 11:31:43 +02:00
Andrew Johnson
841ef37820 Update version numbers for Base and internal modules
Clear EPICS_DEV_SNAPSHOT flag for tagging.
2019-07-31 12:11:22 -05:00
Andrew Johnson
f550f278ad Update version numbers in documentation to 7.0.2 2019-07-30 18:09:33 -05:00
Andrew Johnson
1706da98cc Update submodules to tagged versions 2019-07-30 14:36:46 -05:00
Andrew Johnson
e8be04bc43 Update pvDatabase submodule 2019-07-25 18:14:12 -05:00
Andrew Johnson
dee526f2f6 Merge msi fix from 3.15 branch into 7.0 2019-07-25 18:11:26 -05:00
Andrew Johnson
59cffd51ae Merge 3.15 branch into 7.0 2019-07-25 18:10:40 -05:00
Andrew Johnson
9b5034f307 Restore errlogFlush() call to msi.cpp 2019-07-25 14:35:41 -05:00
Michael Davidsaver
e2881fb37e More release notes
Forgot to stage...
2019-07-24 18:42:02 -07:00
Michael Davidsaver
afd9697290 update PVA modules 2019-07-24 17:45:08 -07:00
Michael Davidsaver
9988be0906 update release notes 2019-07-24 16:44:31 -07:00
5b754d320f fix posix epicsThreadSleepQuantum() implementation not to return 0.01 on Linux 2019-07-24 14:17:25 +02:00
2be2658cfc added modules/pcas 2019-07-22 17:12:22 +02:00
2b157096e6 merge branch '7.0' into 'PSI-7.0' 2019-07-22 15:44:08 +02:00
71eaddfd84 Merge branch 'refs/heads/PSI-7.0.1' into PSI-7.0 2019-07-22 15:36:33 +02:00
5589deb3ad make sure softIoc for vxWorks contains all functions 2019-07-22 15:17:18 +02:00
Andrew Johnson
a6812c5869 Revert "More msi.plt retries for Jenkins builds on Windows"
This reverts commit a69bd833fc.
2019-07-17 16:19:37 -05:00
Michael Davidsaver
b89494a840 Revert "Testing msi: Add retries if necessary"
This reverts commit 29c069db3d.

# Conflicts:
#	src/ioc/dbtemplate/test/msi.plt
2019-07-17 11:20:03 -07:00
Freddie Akeroyd
771ad6a442 msi: Flush stdout on program exit
On WIN32 if the reopen()ed stdout is not closed it can occasionally
result in missing lines in the output file
2019-07-17 10:45:09 -07:00
Michael Davidsaver
d214d81794 CROSS_COMPILER_RUNTEST_ARCHS for non-RTEMS 2019-07-07 16:50:02 -07:00
Michael Davidsaver
c70b1a9a29 libcom: detect uclibc support for backtrace() 2019-07-06 13:43:58 -07:00
Andrew Johnson
c9c4eea0f8 Now fix the non-windows systems 2019-06-27 15:21:41 -05:00
Andrew Johnson
78ce2dac05 Don't use / in Windows program paths
Fixing Windows msi.t script failures...
2019-06-27 13:28:56 -05:00
Andrew Johnson
b2285bb8aa Redirect msi's STDERR to /dev/null (NUL on Windows) during tests
Also moves the environment variable handling code out to the only
test that needs it and simplifies it; some Perl versions were giving
warnings from splitting an undef value.
2019-06-27 12:01:42 -05:00
Michael Davidsaver
59cb5ba6a0 Merge remote-tracking branch 'konrad/clean-up-msi' into 3.15
* konrad/clean-up-msi:
  Add test for macro expansion in file names
  Reduce scope of some variables
  Convert substitutionName to std::string
  Use bool for more clarity
  Remove unneeded errlogFlush()
  Manage psubFile with new/delete
  Convert copy to std::string
  Use std::list for patternList
  Convert patternNode.var to std::string
  Convert fullname to std::string
  Convert inputFile.filename to std::string
  Simplify inputConstruct()
  Use std::list for pathList
  Use std::list for inputFileList
  Constructor for struct inputData
  Simplify catMacroReplacements()
  Constructor for struct subInfo
  Add some const keywords
  Convert MSI to C++
  Test expansion of empty patterns with MSI
2019-06-26 14:55:40 -07:00
Michael Davidsaver
c8e5deca76 dbEvent tweak Queue size 2019-06-26 09:40:41 -07:00
Michael Davidsaver
5b09bb6e71 Set file+line for epicsMutex
Makes the output of epicsMutexShowAll more useful wrt. libca.
2019-06-26 09:40:41 -07:00
Michael Davidsaver
ede52d96b8 posix show mapping of epicsMutexId and uaddr passed to futex()
On Linux w/ GLIBC+NTPL useful to establish mapping between
args to futux syscall and epicsMutexId (and file+line of creation).
2019-06-26 09:40:41 -07:00
Michael Davidsaver
ceccafe823 mbbo/mbbiDirect number of bits as precision
Not really useful w/ RSRV/CA, but can be used by QSRV/PVA
to provide number of bits as meta-data.
2019-06-26 09:39:58 -07:00
Michael Davidsaver
f955199805 epicsTimerTest loosen test threshold 2019-06-26 09:38:48 -07:00
Michael Davidsaver
2af0c10470 debug epicsTimerTest 2019-06-26 09:38:48 -07:00
Michael Davidsaver
89f0f1338a ioc/db: consolidate callback state tracking
combine cbCtl and callbackIsInit.
use atomic ops to avoid false positive data races.
2019-06-26 09:38:48 -07:00
Michael Davidsaver
6ce8dfec01 libCom: timerQueueActive atomic exitFlag
quiet false positive data race
2019-06-26 09:38:48 -07:00
Michael Davidsaver
c1ab30142a sysconf /0 paranoia
Seems unlikely, but avoid any possibility to divide by zero.
2019-06-26 08:59:35 -07:00
Michael Davidsaver
2db2f1a53f Merge remote-tracking branch 'konrad/fix-compiler-warnings' into 3.15
* konrad/fix-compiler-warnings:
  epicsTime: rely on implicit copy constructor
  iocLogServer: check return values
  Fix potential buffer overflow in iocLogServer
  Fix weird use of strncpy
2019-06-24 18:21:32 -07:00
Michael Davidsaver
b811d3402f Merge remote-tracking branch 'konrad/dont-nuke-global-cac-thread-id-in-exit-handler' into 3.15
* konrad/dont-nuke-global-cac-thread-id-in-exit-handler:
  Remove cacExitHandler
2019-06-24 18:12:58 -07:00
Michael Davidsaver
a64cb4a877 update PVA modules 2019-06-17 17:48:41 -07:00
Andrew Johnson
e75a72ef76 VxWorks: Mark undetected underflow parse test as ToDo 2019-06-07 17:22:40 -05:00
Andrew Johnson
33e099a51b Fix VxWorks osiSockOptMcastLoop_t => char
Repairs osiSockTest
2019-06-07 17:21:18 -05:00
Andrew Johnson
345cfcffa8 Fix sync filter example in dbd.pod 2019-06-04 12:53:41 -05:00
Michael Davidsaver
655c5bed92 osiClockTime Darwin doesn't use.
Darwin/osdTime.cpp unconditionally provides osdTimeGetCurrent()
and never calls ClockTime_Init().
2019-05-20 15:32:57 -07:00
Michael Davidsaver
2c99c36ef9 Merge remote-tracking branch 'lp-Com/timeopt' into 7.0
* lp-Com/timeopt:
  !gtMoreThanDefault -> useOsdGetCurrent
  generalTime short circuit current time
2019-05-20 13:49:10 -07:00
0bb80e373b add simple calculations to macros 2019-05-10 14:44:17 +02:00
4acdd83984 also build pcas 2019-05-10 11:13:23 +02:00
d12d38f970 re-enable -fno-strict-aliasing for vxWorks 2019-05-10 11:08:48 +02:00
74d9749255 fix install location 2019-05-10 11:07:50 +02:00
Andrew Johnson
71d4d3ecbd epicsErrlogTest.c improvements
Instrument testEqInt() macro with caller's source line-number.
Added another epicsEvent to wait for the listeners to run.
Not guaranteed to fix all issues, but should be more reliable.
2019-05-09 15:03:56 -05:00
Andrew Johnson
86138fdd23 Fix make-tar.sh to work on MacOS too
The BSD version of tar doesn't support -a, and
requires -T instead of --files-from.
2019-05-09 11:51:26 -05:00
Ralph Lange
8c993405b4 doc/ca: clarify variable size array subscription
(cherry-picked from branch 3.15)
2019-05-09 17:32:05 +02:00
Ralph Lange
96259b7bdc doc/ca: clarify variable size array subscription 2019-05-09 17:28:36 +02:00
Michael Davidsaver
bf8ff4e5f1 !gtMoreThanDefault -> useOsdGetCurrent 2019-05-08 19:05:58 -07:00
3276ada78a build for DeltaTau with ELDK-5.3 for newer C++ compiler 2019-05-08 17:32:50 +02:00
Martin Konrad
25576c316a Remove cacExitHandler
We need to ensure the allocated resources stick around until
the last instance using them doesn't need them anymore. Sharing
a raw pointer by exporting it as a global variable is not
compatible with cleaning up at all. For now we remove the
clean-up code.

Note: This fixes a segfault during IOC shutdown when using both
pyDevSup and pyepics. See the discussion on
https://epics.anl.gov/tech-talk/2019/msg00778.php for details.
2019-05-06 19:50:01 -04:00
Andrew Johnson
2d3de1916b Don't clear caClientCallbackThreadId in CA's exit handler 2019-05-06 12:22:34 -05:00
Ralph Lange
fe34c6f35e appveyor-ci: ANL Make install 4.1 -> 4.2.1 2019-05-03 15:34:37 +02:00
Ralph Lange
52cdfe0a44 appveyor-ci: use pre-installed AppVeyor MinGW 2019-05-03 15:34:01 +02:00
Ralph Lange
16ddcaeaed appveyor-ci: ANL Make install 4.1 -> 4.2.1 2019-05-03 15:30:59 +02:00
Ralph Lange
297206e247 appveyor-ci: use pre-installed AppVeyor MinGW 2019-05-03 15:29:07 +02:00
Ralph Lange
3110322f8c appveyor-ci: use choco MinGW 5.3.0 to work around build problem
(fixes lp:1827225)
2019-05-02 12:09:09 +02:00
Ralph Lange
63bf8a8219 appveyor-ci: use choco MinGW 5.3.0 to work around build problem
(fixes lp:1827225)
2019-05-02 11:39:04 +02:00
Ralph Lange
ec7193d0be appveyor-ci: exclude some cygwin builds (broken compiler)
appveyor-ci: remove slack, add email and GitHub notifications
(cherry-picked from branch 7.0)
2019-04-30 15:53:50 +02:00
Ralph Lange
17dea964a6 appveyor-ci: remove slack, add email and GitHub notifications 2019-04-30 15:51:28 +02:00
Ralph Lange
12283ce25a appveyor-ci: exclude some cygwin builds (broken compiler) 2019-04-30 15:26:35 +02:00
Andrew Johnson
f486dba478 Add some epics-controls publishing instructions, incomplete 2019-04-26 13:53:24 -05:00
Martin Konrad
1f95d0db12 epicsTime: rely on implicit copy constructor
When a custom copy constructor is defined the assignment operator
also needs to be defined explicitly. For this simple class the
implicit copy ctor/assignment operator are sufficient, though. This
fixes a warning emitted by GCC9.
2019-04-25 11:00:39 -04:00
Martin Konrad
e02c5c3026 iocLogServer: check return values
No serious issues here just fixing some warnings.
2019-04-24 22:25:31 -04:00
Martin Konrad
8e9d75ad71 Fix potential buffer overflow in iocLogServer 2019-04-24 22:25:31 -04:00
Martin Konrad
630663caa8 Fix weird use of strncpy
Note: The old code was correct. This change just gets rid of
a bunch of warnings.
2019-04-24 22:25:31 -04:00
Andrew Johnson
7a84a1abba Update Base version numbers for next patch release 2019-04-23 16:23:20 -05:00
de378eec34 also build pcas 2019-04-03 15:14:34 +02:00
dbb2d875fb undo commit 2206934 which introduces a MKDIR rule that conflicts with driver/makefile 2019-04-03 15:13:00 +02:00
c7f966a1f5 fix install location 2019-04-03 15:10:28 +02:00
Michael Davidsaver
95cb81c286 generalTime short circuit current time
epicsTimeGetCurrent() is called frequently.
Unless more than the default provider is registered,
locking and going through the timeProvider list each
time is a waste.

Instead, short circuit to directly call the default
time current time provider unless a another has
been registered.
2019-03-10 16:36:54 -07:00
7889dda6f8 merged with upstream 2019-02-20 10:51:02 +01:00
Martin Konrad
a9606dbf6e Add test for macro expansion in file names 2019-01-08 09:34:55 -05:00
Martin Konrad
409ee26fae Reduce scope of some variables 2019-01-08 09:34:55 -05:00
Martin Konrad
9a4787155c Convert substitutionName to std::string 2019-01-08 09:34:55 -05:00
Martin Konrad
84dba0d2b7 Use bool for more clarity 2019-01-08 09:34:55 -05:00
Martin Konrad
87f6c3dec9 Remove unneeded errlogFlush() 2019-01-08 09:34:55 -05:00
Martin Konrad
940814becf Manage psubFile with new/delete 2019-01-08 09:34:55 -05:00
Martin Konrad
68a1a529b2 Convert copy to std::string 2019-01-08 09:34:55 -05:00
Martin Konrad
ce38caf41b Use std::list for patternList
This improves type safety and readability.
2019-01-08 09:34:55 -05:00
Martin Konrad
f03f10e664 Convert patternNode.var to std::string 2019-01-08 09:34:55 -05:00
Martin Konrad
b4f4fb853d Convert fullname to std::string 2019-01-08 09:34:55 -05:00
Martin Konrad
b518ebe85b Convert inputFile.filename to std::string 2019-01-08 09:34:55 -05:00
Martin Konrad
e461d782f4 Simplify inputConstruct() 2019-01-08 09:34:55 -05:00
Martin Konrad
ef2a381e92 Use std::list for pathList
This improves type safety and readability.
2019-01-08 09:34:55 -05:00
Martin Konrad
265d4962a4 Use std::list for inputFileList
This improves type safety and readability.
2019-01-08 09:34:55 -05:00
Martin Konrad
db9267bbd5 Constructor for struct inputData 2019-01-08 09:34:55 -05:00
Martin Konrad
1cf3fa9ba9 Simplify catMacroReplacements()
This fixes lp:1810946 and lp:1810949.
2019-01-08 09:34:40 -05:00
Martin Konrad
3e8b0028dc Constructor for struct subInfo 2019-01-08 09:22:52 -05:00
Martin Konrad
d8f18c27f4 Add some const keywords 2019-01-08 09:22:52 -05:00
Martin Konrad
801c01b9b6 Convert MSI to C++ 2019-01-08 09:22:52 -05:00
Martin Konrad
0c1874bbfe Test expansion of empty patterns with MSI
This was subject to a regression in 3.15.6. See lp:1810946.
2019-01-08 09:22:40 -05:00
a2ccf3b631 add raspberryPi and skip unused vxWorks archs 2018-10-31 15:23:05 +01:00
57db34b303 Merge branch 'FixShellCommands' into PSI-7.0 2018-10-24 09:25:44 +02:00
4f790758af no PVA for mvl40-xscale_be 2018-10-23 10:01:13 +02:00
ce9dfc6bb4 need some .o files, but there aren't many any more 2018-10-18 16:20:45 +02:00
4f40ad1927 build for mvl40-xscale_be (without PVA)configure/os/CONFIG.Common.mvl40-xscale_be 2018-10-18 16:20:13 +02:00
a42a4010d6 skip building with clang on old SL6 to avoid problems with cross build from RHEL7 2018-10-11 13:20:59 +02:00
a2aa17fafc some drivers complain about strict-aliasing 2018-10-11 08:36:35 +02:00
5bf2784db2 add -fno-strict-aliasing for those archs which complain about anyscalar.h 2018-10-05 10:43:08 +02:00
7a4e7b7600 add tar and copysrc make rules 2018-10-03 17:13:13 +02:00
70aa23513f use -isystem option to find correct headers for cross compiling for old Linux host versions 2018-10-03 16:47:57 +02:00
71ded2f25f install dbCaPvt.h needed by devIocStats/ioccar 2018-10-03 16:43:32 +02:00
11103351b2 add build year-month to version string 2018-10-03 16:38:53 +02:00
146a413977 add -isystem to avoid system headers in .d files (does not work for vxWorks 5) 2018-10-03 13:48:09 +02:00
4e44550f62 Merge branch 'FixShellCommands' into PSI-7.0 2018-09-28 11:41:52 +02:00
9952470486 Merge branch 'FixShellCommands' into PSI-7.0 2018-09-27 13:58:23 +02:00
02d30dedbc install server.h for misc module 2018-09-26 16:10:30 +02:00
5ed0fe52a0 Merge branch '7.0' into PSI-7.0 2018-09-26 11:45:19 +02:00
42b1f774da add PSI configuration 2018-09-25 11:13:08 +02:00
7738b68320 fix missing template instances for old vxWorks (uses -fno-implicit-templates) 2018-09-24 18:00:53 +02:00
1199fabe90 Fix strange compiler errors with gcc 2.96:
using <namespace::function>; seems not to work but
using namespace <namespace>; works
Also 'add' only works with explicit namespace. Why?
2018-09-21 16:21:13 +02:00
1aefc5f2f0 re-enable building vxWorks 5 2018-09-21 16:20:17 +02:00
6f666c6c22 Add mechanism to skip modules for selected architectures 2018-09-21 15:50:06 +02:00
129 changed files with 1326 additions and 476 deletions

View File

@@ -48,6 +48,7 @@ environment:
TOOLCHAIN: 2017
- TOOLCHAIN: cygwin
- TOOLCHAIN: mingw
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
# Platform: architecture
platform:
@@ -60,6 +61,10 @@ matrix:
# VS Express installs don't have the 64 bit compiler
- platform: x64
TOOLCHAIN: 10.0
# Cygwin static-debug has compiler problems
- configuration: static-debug
TOOLCHAIN: cygwin
#---------------------------------#
# building & testing #
@@ -81,6 +86,9 @@ test_script:
notifications:
- provider: Slack
incoming_webhook:
secure: RYOm3FIUYeZGjWKaeTVKwq+C3fzK54AKwbmAoECED45mex3lN+8HmrC845a6mg9xPUJ/ND51RopWVaKDD9/UzaM0SO195RQLKqUTIUafiuM=
- provider: Email
to:
- core-talk@aps.anl.gov
on_build_success: false
- provider: GitHubPullRequest

View File

@@ -42,13 +42,13 @@ if "%TOOLCHAIN%"=="mingw" (
set "MAKE=mingw32-make"
if "%OS%"=="64BIT" (
set "EPICS_HOST_ARCH=windows-x64-mingw"
set "INCLUDE=C:\tools\mingw64\include;%INCLUDE%"
set "PATH=C:\tools\mingw64\bin;%PATH%"
set "INCLUDE=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\include;%INCLUDE%"
set "PATH=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;%PATH%"
echo [INFO] MinGW Toolchain 64bit
) else (
set "EPICS_HOST_ARCH=win32-x86-mingw"
set "INCLUDE=C:\tools\mingw32\include;%INCLUDE%"
set "PATH=C:\tools\mingw32\bin;%PATH%"
set "INCLUDE=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\include;%INCLUDE%"
set "PATH=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin;%PATH%"
echo [INFO] MinGW Toolchain 32bit
)
echo [INFO] Compiler Version

View File

@@ -55,16 +55,9 @@ if "%TOOLCHAIN%"=="mingw" (
) || (
echo [INFO] EPICS set up for optimized build
)
if "%OS%"=="64BIT" (
echo [INFO] Installing MinGW 64bit
cinst mingw || cinst mingw
) else (
echo [INFO] Installing MinGW 32bit
cinst mingw --x86 || cinst mingw --x86
)
)
echo [INFO] Installing Make 4.1
curl -fsS --retry 3 -o C:\tools\make-4.1.zip https://epics.anl.gov/download/tools/make-4.1-win64.zip
echo [INFO] Installing Make 4.2.1 from ANL web site
curl -fsS --retry 3 -o C:\tools\make-4.2.1.zip https://epics.anl.gov/download/tools/make-4.2.1-win64.zip
cd \tools
"C:\Program Files\7-Zip\7z" e make-4.1.zip
"C:\Program Files\7-Zip\7z" e make-4.2.1.zip

3
.gitmodules vendored
View File

@@ -22,3 +22,6 @@
path = modules/pva2pva
url = https://github.com/epics-base/pva2pva
branch = master
[submodule "modules/pcas"]
path = modules/pcas
url = https://github.com/epics-modules/pcas

View File

@@ -16,23 +16,46 @@ PREFIX="$3"
if ! [ "$TOPREV" ]
then
cat <<EOF >&2
usage: $0 [rev] [outfile.tar.gz] [prefix/]
usage: $0 <rev> [<outfile> [<prefix>]]
<rev> may be any git revision spec. (tag, branch, or commit id).
Output file may be .tar.gz, .tar.bz2, or any extension supported by "tar -a".
If output file name is omitted, "base-<rev>.tar.gz" will be used.
If <prefix> is omitted, the default prefix is "base-<rev>/".
If provided, <outfile> must end with ".tar", ".tar.gz" or ".tar.bz2".
If <outfile> is omitted, "base-<rev>.tar.gz" will be used.
If provided, <prefix> must end with "/". If <prefix> is omitted,
the default is "base-<rev>/".
EOF
exit 1
fi
[ "$FINALTAR" ] || FINALTAR="base-$TOPREV.tar.gz"
[ "$PREFIX" ] || PREFIX="base-$TOPREV/"
case "$FINALTAR" in
"")
TAROPT=-z
FINALTAR="base-$TOPREV.tar.gz"
;;
*.tar)
TAROPT=""
;;
*.tar.gz)
TAROPT=-z
;;
*.tar.bz2)
TAROPT=-j
;;
*)
die "outfile must end with '.tar.gz' or '.tar.bz2'"
;;
esac
case "$PREFIX" in
*/) ;;
*) die "Prefix must end with '/'";;
"")
PREFIX="base-$TOPREV/"
;;
*/)
;;
*)
die "Prefix must end with '/'"
;;
esac
# Check for both <tag> and R<tag>
@@ -97,13 +120,11 @@ then
fi
# Use the filtered list to build the final tar
# The -a option chooses compression automatically based on output file name.
tar -C "$TDIR"/tar --files-from="$TDIR"/list.2 -caf "$FINALTAR"
tar -c $TAROPT -C "$TDIR"/tar -T "$TDIR"/list.2 -f "$FINALTAR"
echo "Wrote $FINALTAR"
tar -taf "$FINALTAR" > "$TDIR"/list.3
tar -t $TAROPT -f "$FINALTAR" > "$TDIR"/list.3
# make sure we haven't picked up anything extra
if ! diff -u "$TDIR"/list.2 "$TDIR"/list.3

View File

@@ -23,3 +23,10 @@ DIRS += modules
modules_DEPEND_DIRS = src
include $(TOP)/configure/RULES_TOP
UNINSTALL_DIRS += $(INSTALL_LOCATION)/src
copysrc:
tar cf - --exclude-vcs --exclude-backups --exclude=O.* modules/*/src | tar xf - -C $(INSTALL_LOCATION)
tar:
tar cfjP epics_base-$(EPICS_VERSION_NUMBER).tar.bz2 $(INSTALL_LOCATION)

View File

@@ -34,7 +34,7 @@ CODE_CFLAGS = $(PROF_CFLAGS_$(PROFILE)) $(GPROF_CFLAGS_$(GPROF))
CODE_CFLAGS += $(ASAN_FLAGS_$(ENABLE_ASAN))
WARN_CFLAGS_YES = -Wall
WARN_CFLAGS_NO = -w
OPT_CFLAGS_YES = -O3
OPT_CFLAGS_YES = -O3 -g
OPT_CFLAGS_NO = -g
PROF_CXXFLAGS_YES = -p
@@ -43,7 +43,7 @@ CODE_CXXFLAGS = $(PROF_CXXFLAGS_$(PROFILE)) $(GPROF_CXXFLAGS_$(GPROF))
CODE_CXXFLAGS += $(ASAN_FLAGS_$(ENABLE_ASAN))
WARN_CXXFLAGS_YES = -Wall
WARN_CXXFLAGS_NO = -w
OPT_CXXFLAGS_YES = -O3
OPT_CXXFLAGS_YES = -O3 -g
OPT_CXXFLAGS_NO = -g
CODE_LDFLAGS = $(PROF_CXXFLAGS_$(PROFILE)) $(GPROF_CXXFLAGS_$(GPROF))

View File

@@ -48,11 +48,11 @@ EPICS_VERSION = 7
EPICS_REVISION = 0
# EPICS_MODIFICATION must be a number >=0 and <256
EPICS_MODIFICATION = 2
EPICS_MODIFICATION = 3
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
# Not included if zero
EPICS_PATCH_LEVEL = 2
# Not included in the official EPICS version number if zero
EPICS_PATCH_LEVEL = 0
# Between official releases, the EPICS_PATCH_LEVEL gets incremented
# and a -DEV suffix is added (similar to the Maven -SNAPSHOT versions)

View File

@@ -161,7 +161,7 @@ USE_POSIX_THREAD_PRIORITY_SCHEDULING = YES
# Site version number, if set will append '-' and this string to the
# EPICS version number string that is reported by many tools.
EPICS_SITE_VERSION =
EPICS_SITE_VERSION:=$(shell date +%Y-%m)
# For GNU compiler, use pipes rather than temporary files for
# communication between the various stages of compilation.

View File

@@ -86,6 +86,23 @@ include $(CONFIG)/RULES_FILE_TYPE
include $(CONFIG)/RULES.Db
#---------------------------------------------------------------
# Do not build anything if current path matches SKIP_BUILD
ifneq (,$(strip $(SKIP_BUILDS)))
CURRENT_MODULE=$(subst $(realpath $(TOP)/..)/,,$(subst $(realpath $(dir $(lastword $(MAKEFILE_LIST)))..)/,,$(realpath ..)))
ifneq ($(filter $(SKIP_BUILDS) $(addsuffix /%,$(SKIP_BUILDS)),$(CURRENT_MODULE)),)
$(info Skipping $(CURRENT_MODULE) for $(T_A))
PROD=
TESTPROD=
LIBRARY=
TESTLIBRARY=
LOADABLE_LIBRARY=
TESTS=
SRC_FILES=
endif
endif
#---------------------------------------------------------------
# Include defines and rules for prod, library and test* targets
@@ -202,9 +219,9 @@ endif
$(TESTPRODNAME) $(PRODNAME): $(PRODUCT_OBJS) $(PROD_RESS) $(PROD_DEPLIBS)
$(TESTPRODNAME) $(PRODNAME): %$(EXE): | $(INSTALL_LIB)
$(TESTPRODNAME) $(PRODNAME): %$(EXE):
@$(RM) $@
$(LINK.cpp)
$(DEBUGCMD) $(LINK.cpp)
$(MT_EXE_COMMAND)
%_ctdt$(OBJ) : %_ctdt.c
@@ -305,10 +322,6 @@ $(LOADABLE_SHRLIBNAME): $(LOADABLE_SHRLIB_PREFIX)%$(LOADABLE_SHRLIB_SUFFIX):
$(LINK.shrlib)
$(MT_DLL_COMMAND)
$(LIBNAME) $(SHRLIBNAME) $(LOADABLE_SHRLIBNAME): | $(INSTALL_LIB)
$(INSTALL_LIB):
@$(MKDIR) $@
#---------------------------------------------------------------
# C++ munching for VxWorks
@@ -471,11 +484,9 @@ $(INSTALL_TCLLIB)/%: ../%
@$(INSTALL) -d -m $(BIN_PERMISSIONS) $< $(INSTALL_TCLLIB)
endif
ifneq ($(TCLINDEX),)
$(INSTALL_TCLLIB)/$(TCLINDEX): $(INSTALL_TCLLIBS)
$(ECHO) "Updating $@"
$(ECHO) eval auto_mkindex $(INSTALL_TCLLIB) "$(TCLLIBNAME)" | tclsh
endif
$(INSTALL_LOADABLE_SHRLIBS): $(INSTALL_SHRLIB)/%: %
$(ECHO) "Installing loadable shared library $@"

View File

@@ -0,0 +1,4 @@
# Include definitions common to linux pentium targets
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
ARCH_DEP_CXXFLAGS += -fno-strict-aliasing

View File

@@ -0,0 +1 @@
include $(CONFIG)/os/CONFIG.Common.linux-clang

View File

@@ -0,0 +1,6 @@
# Include definitions common to linux pentium targets
include $(CONFIG)/os/CONFIG.Common.linux-x86
COMMANDLINE_LIBRARY = READLINE_NCURSES
ARCH_DEP_CFLAGS += -march=i686

View File

@@ -0,0 +1,4 @@
# Include definitions common to linux pentium targets
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
COMMANDLINE_LIBRARY = READLINE_NCURSES

View File

@@ -0,0 +1,7 @@
# Include definitions common to linux pentium targets
include $(CONFIG)/os/CONFIG.Common.linux-x86
ARCH_DEP_CFLAGS += -march=i686
# remove warning in anyscalar.h
ARCH_DEP_CXXFLAGS += -fno-strict-aliasing

View File

@@ -0,0 +1,5 @@
# Include definitions common to linux pentium targets
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
# remove warning in anyscalar.h
ARCH_DEP_CXXFLAGS += -fno-strict-aliasing

View File

@@ -0,0 +1 @@
include $(CONFIG)/os/CONFIG.Common.linux-clang

View File

@@ -0,0 +1,8 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 5.5.1
WIND_BASE = /afs/psi.ch/project/vxworks/Tornado2.2.1
#there is a problem with our ccppc and optimization
# -O0 works, -O and -O1 and higher are buggy
OPT_CFLAGS_YES = -O0
OPT_CXXFLAGS_YES = -O0

View File

@@ -0,0 +1,2 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.2

View File

@@ -0,0 +1,5 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc603_long
VXWORKS_VERSION = 6.3
# Buggy "uninitialized variable" warning produces many false positives
ARCH_DEP_CXXFLAGS += -Wno-uninitialized

View File

@@ -0,0 +1,5 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.3
# Buggy "uninitialized variable" warning produces many false positives
ARCH_DEP_CXXFLAGS += -Wno-uninitialized

View File

@@ -0,0 +1,2 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc603_long
VXWORKS_VERSION = 6.6

View File

@@ -0,0 +1,2 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.6

View File

@@ -0,0 +1,5 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.7
#needed when including memPartLib.h, e.g. through moduleLib.h or loadLib.h
ARCH_DEP_CFLAGS += -D_VSB_CONFIG_FILE='<../lib/h/config/vsbConfig.h>'

View File

@@ -0,0 +1,25 @@
# DeltaTau PowerPMAC with ELDK 4.2
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
COMMANDLINE_LIBRARY = READLINE_NCURSES
ARCH_CLASS = ppc
ELDK=/opt/eldk-4.2
GNU_TARGET=ppc_4xxFP
GNU_DIR=$(ELDK)/usr
# This cross tool chain is installed in a somehow weired way
# Without the following lines it does not work on RHEL7
# but it worked on SL6
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2/powerpc-linux
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2/backward
ARCH_DEP_LDFLAGS += -Wl,-rpath-link,$(ELDK)/$(GNU_TARGET)/lib
ARCH_DEP_LDFLAGS += -Wl,-rpath-link,$(ELDK)/$(GNU_TARGET)/usr/lib
# Some drivers complain
ARCH_DEP_CFLAGS += -fno-strict-aliasing

View File

@@ -0,0 +1,14 @@
# Virtex FPGA embedded Processor with ELDK 5.1
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
ARCH_CLASS = ppc
SDK = eldk
SDK_DIR = /opt/eldk-5.1
SDK_HOST_ARCH = $(GNU_HOST_ARCH)-$(SDK)-$(GNU_HOST_OS)
GNU_TARGET = powerpc-4xx-softfloat
GNU_ARCH = ppc405-linux
GNU_DIR = $(SDK_DIR)/$(GNU_TARGET)/sysroots/$(SDK_HOST_ARCH)/usr
GNU_BIN = $(GNU_DIR)/bin/$(GNU_ARCH)

View File

@@ -0,0 +1,15 @@
# IOxOS IFC1210 with ELDK 5.2
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
ARCH_CLASS = ppc
SDK = eldk
SDK_DIR = /opt/eldk-5.2
SDK_HOST_ARCH = $(GNU_HOST_ARCH)-$(SDK)-$(GNU_HOST_OS)
GNU_TARGET = powerpc-e500v2
GNU_ARCH = ppce500v2-linux-gnuspe
GNU_DIR = $(SDK_DIR)/$(GNU_TARGET)/sysroots/$(SDK_HOST_ARCH)/usr
GNU_BIN = $(GNU_DIR)/bin/$(GNU_ARCH)
GNU_TARGET_INCLUDE_DIR =

View File

@@ -0,0 +1,21 @@
# DeltaTau PowerPMAC with ELDK 5.2
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
ARCH_CLASS = ppc
SDK = eldk
SDK_DIR = /opt/eldk-5.3
SDK_HOST_ARCH = $(GNU_HOST_ARCH)-$(SDK)-$(GNU_HOST_OS)
GNU_ARCH = ppc440e-linux
SDKTARGETSYSROOT=$(SDK_DIR)/powerpc-4xx/sysroots
GNU_DIR = $(SDKTARGETSYSROOT)/$(SDK_HOST_ARCH)/usr
GNU_BIN = $(GNU_DIR)/bin/$(GNU_ARCH)
GNU_TARGET_INCLUDE_DIR =
GNU_TARGET=powerpc-linux
ARCH_DEP_CPPFLAGS = -m32 -mcpu=440fp -mhard-float
ARCH_DEP_CPPFLAGS += --sysroot=$(SDKTARGETSYSROOT)/$(GNU_ARCH)
ARCH_DEP_LDFLAGS = --sysroot=$(SDKTARGETSYSROOT)/$(GNU_ARCH)
AS=$(GNU_BIN)/$(GNU_TARGET)-as

View File

@@ -0,0 +1,23 @@
# IOxOS IFC1211 with Freescale QorIQ 2.0 toolchain
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
ARCH_CLASS = ppc
SDK = fslsdk
SDK_DIR = /opt/fsl-qoriq/2.0
SDK_HOST_ARCH = $(GNU_HOST_ARCH_64)-$(SDK)-$(GNU_HOST_OS)
SDK_TARGET = ppc64e6500-fsl-linux
GNU_TARGET = powerpc64-fsl-linux
SDKTARGETSYSROOT = $(SDK_DIR)/sysroots/$(SDK_TARGET)
GNU_DIR = $(SDK_DIR)/sysroots/$(SDK_HOST_ARCH)/usr
GNU_BIN = $(GNU_DIR)/bin/$(GNU_TARGET)
ARCH_DEP_CPPFLAGS = --sysroot=$(SDKTARGETSYSROOT)
ARCH_DEP_CFLAGS = -mcpu=e6500 -m64 -mhard-float
ARCH_DEP_LDFLAGS = --sysroot=$(SDKTARGETSYSROOT)
# warning -O2 and higher are broken!
#OPT_CFLAGS_YES = -O1
#OPT_CXXFLAGS_YES = -O1

View File

@@ -0,0 +1,5 @@
include $(CONFIG)/os/CONFIG.Common.linuxCommon
GNU = NO
CMPLR_CLASS = clang
CC = clang
CCC = clang++

View File

@@ -0,0 +1,19 @@
# Moxa DA-66x with SDK 4.2 and ARM7 processor
# Include definitions common to all Linux ARM targets
include $(CONFIG)/os/CONFIG.Common.linux-arm
GNU_DIR=/afs/psi.ch/project/embeddedlinux/moxa/arm-linux-4.4.2-v4
GNU_TARGET=arm
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(GNU_DIR)/arm-none-linux-gnueabi/lib
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(INSTALL_LIB)
COMMANDLINE_LIBRARY = READLINE_NCURSES
# suppress note "the mangling of 'va_list' has changed in GCC 4.4"
ARCH_DEP_CXXFLAGS += -Wno-psabi
ARCH_DEP_CFLAGS += -funwind-tables
# remove warning in anyscalar.h
ARCH_DEP_CXXFLAGS += -fno-strict-aliasing

View File

@@ -0,0 +1,15 @@
# Moxa DA-66x with Montavista Linux 4.0
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
COMMANDLINE_LIBRARY = READLINE_CURSES
ARCH_CLASS = xscale
GNU_DIR=/afs/psi.ch/project/embeddedlinux/moxa/xscale_be/armv5teb-montavista-linuxeabi
ARCH_DEP_CFLAGS += -funwind-tables
# Cannot build PVA because of missing boost support
SKIP_BUILDS = pv% normativeTypes

View File

@@ -0,0 +1,41 @@
# RaspberryPi with github.com/raspberrypi/tools toolchain
# Tested on:
# * Raspberry 3B+ Raspbian 9
# * Raspberry 2 Raspbian 7
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
# Using readline:
# Due to missing/messed up libs in the toolchain, readline needs copies of
# libtinfo.so.5.9 and libreadline.so.6.2 from a Raspbian 7 rootfs
# /lib/arm-linux-gnueabihf/ to the toolchain, e.g.
# $(SDK_DIR)/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabihf/
# and manually created links libtinfo.so.5 and libreadline.so.
# For gcc-linaro-arm-linux-gnueabihf-raspbian, an existing incompatible
# libtinfo.so.5 is in the way. Remove it.
# (Built with glibc 2.16 like installed on Raspbian 9 but toolchain uses glibc 2.13.)
# Also copy /usr/include/readline/ directory from some readline 6 installation
# to $(SDK_DIR)/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include/
ARCH_CLASS = arm
SDK_DIR = /opt/raspberrypi/arm-bcm2708
# Available SDK_TARGETs:
# gcc 4.8.3 for 32 bit hosts with GLIBC 2.3 or higher
SDK_TARGET = gcc-linaro-arm-linux-gnueabihf-raspbian
# gcc 4.8.3 for 64 bit hosts with GLIBC 2.14 or higher
# SDK_TARGET = gcc-linaro-arm-linux-gnueabihf-raspbian-x64
# gcc 4.7.1 for 64 bit hosts with GLIBC 2.8 or higher
# SDK_TARGET = arm-linux-gnueabihf
# gcc 4.7.1 for 32 bit hosts with GLIBC 2.4 or higher
# SDK_TARGET = arm-bcm2708hardfp-linux-gnueabi
# SDK_TARGET = arm-bcm2708-linux-gnueabi
GNU_DIR = $(SDK_DIR)/$(SDK_TARGET)
GNU_TARGET = $(if $(filter arm-bcm2708%,SDK_TARGET),$(SDK_TARGET),arm-linux-gnueabihf)

View File

@@ -13,7 +13,7 @@ CMPLR_SUFFIX = ppc
ARCH_CLASS = ppc
# Architecture specific build flags
ARCH_DEP_CPPFLAGS = -DCPU=PPC603
ARCH_DEP_CPPFLAGS = -DCPU=PPC603
ARCH_DEP_CFLAGS = -mcpu=603 -mstrict-align
GNU_TARGET = powerpc-wrs-vxworks

View File

@@ -0,0 +1,18 @@
# XILINX Zynq with Yocto 2.1 / Petalinux toolchain
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
ARCH_CLASS = arm64
SDK = petalinux
SDK_DIR = /opt/petalinux-gfa/2017.2
SDK_HOST_ARCH = $(GNU_HOST_ARCH_64)-$(SDK)-$(GNU_HOST_OS)
SDK_TARGET = aarch64-xilinx-linux
GNU_TARGET = $(SDK_TARGET)
SDKTARGETSYSROOT = $(SDK_DIR)/sysroots/$(SDK_TARGET)
GNU_DIR = $(SDK_DIR)/sysroots/$(SDK_HOST_ARCH)/usr
GNU_BIN = $(GNU_DIR)/bin/$(GNU_TARGET)
ARCH_DEP_CPPFLAGS = --sysroot=$(SDKTARGETSYSROOT)
ARCH_DEP_LDFLAGS = --sysroot=$(SDKTARGETSYSROOT)

View File

@@ -0,0 +1,3 @@
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
#Include definitions common to linux hosts
include $(CONFIG)/os/CONFIG.linux-x86_64.Common

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,16 @@
# "cross compile" for older Linux version
# Use older compiler and older libraries
# Used packages:
# compat-gcc-44-c++-4.4
# compat-gcc-44-4.4
# compat-glibc-headers-2.12-4
# It was neccessary to install 32 bit compatibility libraries manually
#-------------------------------------------------------
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
CC = $(GNU_BIN)/$(CMPLR_PREFIX)gcc44
CCC = $(GNU_BIN)/$(CMPLR_PREFIX)g++44
TARGET_CPPFLAGS = -isystem /usr/lib/x86_64-redhat-linux6E/include
TARGET_LDFLAGS = -L /usr/lib/x86_64-redhat-linux6E/lib
LINK.cpp += --as-needed -lc -lm -lrt -lpthread -lreadline -ltinfo

View File

@@ -0,0 +1,16 @@
# "cross compile" for older Linux version
# Use older compiler and older libraries
# Used packages:
# compat-gcc-44-c++-4.4
# compat-gcc-44-4.4
# compat-glibc-headers-2.12-4
# compat-glibc-2.12-4
#-------------------------------------------------------
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
CC = $(GNU_BIN)/$(CMPLR_PREFIX)gcc44
CCC = $(GNU_BIN)/$(CMPLR_PREFIX)g++44
TARGET_CPPFLAGS = -isystem /usr/lib/x86_64-redhat-linux6E/include
TARGET_LDFLAGS = -L /usr/lib/x86_64-redhat-linux6E/lib64
LINK.cpp += --as-needed -lc -lm -lrt -lpthread -lreadline -ltinfo

View File

@@ -0,0 +1,3 @@
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
#Include definitions common to linux hosts
include $(CONFIG)/os/CONFIG.linux-x86.Common

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,3 @@
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
#Include definitions common to linux hosts
include $(CONFIG)/os/CONFIG.linux-x86_64.Common

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,2 @@
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
#Include definitions common to linux hosts

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,3 @@
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
#Include definitions common to linux hosts
include $(CONFIG)/os/CONFIG.linux-x86_64.Common

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,2 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -0,0 +1,2 @@
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)

View File

@@ -0,0 +1 @@
COMMANDLINE_LIBRARY = READLINE

View File

@@ -2,24 +2,58 @@
#
# Site specific definitions for vxWorks target builds.
# Compiler options can vary with the vxWorks version number, so we
# need to know that. Do not include any third-level digits.
#### Fixes for CONFIG.Common.vxWorksCommon #######
# Note: vxWorks 5.4.x and 5.5.x (Tornado 2.x) are not supported.
# VxWorks 6.0 through 6.5 use older, untested versions of GCC.
# These are needed for vxWorks 6.x; the GNU toolset version number
# is in the path to the compiler tools:
VX_GNU_VERSION_5 = 2.96
VX_GNU_VERSION_6 = $(VX_GNU_VERSION_$(VXWORKS_VERSION))
VX_GNU_VERSION = $(VX_GNU_VERSION_$(VXWORKS_MAJOR_VERSION))
VX_GNU_MINOR_VERSION = $(basename $(patsubst $(VX_GNU_MAJOR_VERSION).%,%,$(VX_GNU_VERSION)))
#VXWORKS_VERSION = 6.6
#VXWORKS_VERSION = 6.7
#VXWORKS_VERSION = 6.8
VXWORKS_VERSION = 6.9
# gcc version before 3.4 are "old" and need special treatment
VX_OLD_GCC_2 = OLD
VX_OLD_GCC_3.3 = OLD
VX_OLD_GCC_3 = $(VX_OLD_GCC_3.$(VX_GNU_MINOR_VERSION))
VX_OLD_GCC = $(VX_OLD_GCC_$(VX_GNU_MAJOR_VERSION))
# vxWorks directory definitions
VX_DIR_5 = $(WIND_BASE)
VX_DIR_6 = $(WIND_BASE)/vxworks-$(VXWORKS_VERSION)
VX_DIR = $(VX_DIR_$(VXWORKS_MAJOR_VERSION))
# Sites may override the following path for a particular host
# architecture by adding it to an appropriate
# CONFIG_SITE.$(EPICS_HOST_ARCH).vxWorksCommon file.
VX_INCLUDE_DIRS_5 = $(VX_DIR)/target/h
VX_INCLUDE_DIRS_6 = $(VX_DIR)/target/h $(VX_DIR)/target/h/wrn/coreip
GNU_TARGET_INCLUDE_DIR = $(VX_INCLUDE_DIRS_$(VXWORKS_MAJOR_VERSION))
TARGET_CPPFLAGS = -isystem $(VX_DIR)/target/h
# vxWorks GNU directories
GNU_DIR_5 = $(WIND_BASE)/host/$(WIND_HOST_TYPE)
GNU_DIR_6 = $(WIND_BASE)/gnu/$(VX_GNU_VERSION)-vxworks-$(VXWORKS_VERSION)/$(WIND_HOST_TYPE)
GNU_DIR = $(GNU_DIR_$(VXWORKS_MAJOR_VERSION))
# Operating system flags
OP_SYS_CFLAGS += -fno-strict-aliasing
# For gcc versions before 3.4 we need this g++ compiler flag
# However WindRiver says gcc 3.3 does not need it any more
# which would allow to build vxWorks 6 without this flag.
# Maybe we can live without it at the penalty of larger code.
# See vxWorks 5 docs/gnu2.96+ppc/gcc.html
# chapter 4.5 "Where's the Template?"
CODE_CXXFLAGS_OLD = -fno-implicit-templates
CODE_CXXFLAGS = $(CODE_CXXFLAGS_$(VX_OLD_GCC))
# WIND_BASE is where you installed the Wind River software.
WIND_BASE = /afs/psi.ch/project/vxworks/VxWorks$(VXWORKS_VERSION)
#--------------------------------------------------
# Modules we cannot build with old compiler
PV_MODULES = pv% normativeTypes
SKIP_BUILDS_5 = $(PV_MODULES)
SKIP_BUILDS_OLD = $(PV_MODULES)
SKIP_BUILDS_6 = $(SKIP_BUILDS_$(VX_OLD_GCC))
SKIP_BUILDS = $(SKIP_BUILDS_$(VXWORKS_MAJOR_VERSION))
#WIND_BASE = /usr/local/vw/tornado22-$(ARCH_CLASS)
WIND_BASE = /usr/local/vw/vxWorks-$(VXWORKS_VERSION)
#WIND_BASE = /ade/vxWorks/$(VXWORKS_VERSION)

View File

@@ -0,0 +1,13 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.Common
# Build 32 bit version as a cross architecture
#CROSS_COMPILER_TARGET_ARCHS += RHEL7-x86
# Improved error checking with clang
CROSS_COMPILER_TARGET_ARCHS += RHEL7-x86_64-clang
# Build for old SL6 64 bit
CROSS_COMPILER_TARGET_ARCHS += SL6-x86_64
# Build for old SL6 32 bit
CROSS_COMPILER_TARGET_ARCHS += SL6-x86

View File

@@ -0,0 +1 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86.Common

View File

@@ -0,0 +1,3 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86.Common
# Build 32 bit version as a cross architecture
CROSS_COMPILER_TARGET_ARCHS += SL5-x86

View File

@@ -0,0 +1 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86.Common

View File

@@ -0,0 +1,7 @@
# Build 32 bit version as a cross architecture
CROSS_COMPILER_TARGET_ARCHS += SL6-x86
# Improved error checking with clang
#CROSS_COMPILER_TARGET_ARCHS += SL6-x86_64-clang
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.Common

View File

@@ -1,9 +1,43 @@
# CONFIG_SITE.linux-x86.Common
#
# Site override definitions for linux-x86 host builds
#-------------------------------------------------------
INSTALL_LOCATION=/usr/local/epics/base-$(EPICS_VERSION).$(EPICS_REVISION).$(EPICS_MODIFICATION)
EPICS_SITE_VERSION:=$(shell date +%Y-%m-%d)
# JBA test override values
#CROSS_COMPILER_TARGET_ARCHS = vxWorks-68040 solaris-sparc
#CROSS_COMPILER_TARGET_ARCHS = vxWorks-68040
#CROSS_COMPILER_TARGET_ARCHS = RTEMS-mvme2100 RTEMS-pc386 # RTEMS-mvme5500 RTEMS-mvme167
GNU_HOST_ARCH=i686
GNU_HOST_OS=linux
# LD_LIBRARY_PATH may cause problems for eldk53-ppc4xxFP
LD_LIBRARY_PATH=
# vxWorks 5.5 for MVxxxx boards
CROSS_COMPILER_TARGET_ARCHS += T2-ppc604
# vxWorks 6.7 for MVxxxx boards
CROSS_COMPILER_TARGET_ARCHS += V67-ppc604
# NI compact RIO
CROSS_COMPILER_TARGET_ARCHS += V63-ppc603
# MOXA montavista linux (No PVA because of missing boost support)
CROSS_COMPILER_TARGET_ARCHS += mvl40-xscale_be
# MOXA SDK 4.2
CROSS_COMPILER_TARGET_ARCHS += moxa42-armv6l
# Virtex embedded PPC
CROSS_COMPILER_TARGET_ARCHS += eldk51-ppc4xxSF
# IOxOS IFC1210
CROSS_COMPILER_TARGET_ARCHS += eldk52-e500v2
# DeltaTau PowerPMAC
CROSS_COMPILER_TARGET_ARCHS += eldk42-ppc4xxFP
CROSS_COMPILER_TARGET_ARCHS += eldk53-ppc4xxFP
# Test other vxWorks versions
#CROSS_COMPILER_TARGET_ARCHS += V66-ppc603
CROSS_COMPILER_TARGET_ARCHS += V66-ppc604
#CROSS_COMPILER_TARGET_ARCHS += V63-ppc604
# (No PVA because of old compiler)
CROSS_COMPILER_TARGET_ARCHS += V62-ppc604
# Raspberry Pi
CROSS_COMPILER_TARGET_ARCHS += raspbian-arm

View File

@@ -1,9 +1,9 @@
# CONFIG_SITE.linux-x86_64.Common
#
# Site override definitions for linux-x86_64 host builds
#-------------------------------------------------------
include $(CONFIG)/os/CONFIG_SITE.linux-x86.Common
#CROSS_COMPILER_TARGET_ARCHS = vxWorks-68040 solaris-sparc
#CROSS_COMPILER_TARGET_ARCHS = vxWorks-68040
#CROSS_COMPILER_TARGET_ARCHS = RTEMS-mvme2100
GNU_HOST_ARCH_64=x86_64
# IOxOS IFC1211
CROSS_COMPILER_TARGET_ARCHS += fslqoriq20-e6500_64
# Zynq
CROSS_COMPILER_TARGET_ARCHS += yocto21-aarch64

View File

@@ -4,17 +4,17 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Known Problems in EPICS 7.0.2</title>
<title>Known Problems in EPICS 7.0.3</title>
</head>
<body>
<h1 style="text-align: center">EPICS 7.0.2: Known Problems</h1>
<h1 style="text-align: center">EPICS 7.0.3: Known Problems</h1>
<p>Any patch files linked below should be applied at the root of the
base-7.0.2 tree. Download them, then use the GNU Patch program as
base-7.0.3 tree. Download them, then use the GNU Patch program as
follows:</p>
<blockquote><pre>% <b>cd <i>/path/to/</i>base-7.0.2</b>
<blockquote><pre>% <b>cd <i>/path/to/</i>base-7.0.3</b>
% <b>patch -p1 &lt; <i>/path/to/</i>file.patch</b></pre></blockquote>
<p>The following problems were known by the developers at the time of this

View File

@@ -1,24 +1,24 @@
Installation Instructions
EPICS Base Release 7.0.2
EPICS Base Release 7.0.3
--------------------------------------------------------------------------
Table of Contents
* What is EPICS base?
* What is new in this release?
* Copyright
* Supported platforms
* Supported compilers
* Software requirements
* Host system storage requirements
* Documentation
* Directory Structure
* Build related components
* Building EPICS base (Unix and Win32)
* Example application and extension
* Multiple host platforms
* What is EPICS base?
* What is new in this release?
* Copyright
* Supported platforms
* Supported compilers
* Software requirements
* Host system storage requirements
* Documentation
* Directory Structure
* Build related components
* Building EPICS base (Unix and Win32)
* Example application and extension
* Multiple host platforms
--------------------------------------------------------------------------

View File

@@ -9,7 +9,7 @@
<BODY>
<CENTER>
<H1>Installation Instructions</H1>
<H2>EPICS Base Release 7.0.2</H2><BR>
<H2>EPICS Base Release 7.0.3</H2><BR>
</CENTER>
<HR>
<H3> Table of Contents</H3>

View File

@@ -20,7 +20,7 @@ release.</p>
which should also be read to understand what has changed since an earlier
release.</p>
<h1 align="center">EPICS Release 7.0.2.2</h1>
<h1 align="center">EPICS Release 7.0.3</h1>
<!-- Insert new items immediately below this template ...
@@ -30,6 +30,28 @@ release.</p>
-->
<h3>epicsTimeGetCurrent() optimization</h3>
<p>Add a fast path to epicsTimeGetCurrent() and related calls
in the common case where only the default OS current time provider is
registered. This path does not take the global mutex guarding
the time providers list, potentially reducing lock contention.</p>
<h3>dbEvent tweak Queue size</h3>
<p>The size of the queue used by dbEvent to push monitor updates
has been slightly increased based on DBR_TIME_DOUBLE to better fill
an ethernet frame. This may result in slightly fewer, but larger
frames being sent.</p>
<h3>mbbo/mbbiDirect number of bits as precision</h3>
<p>Report NOBT as &quot;precision&quot; through the dbAccess API.
This is not accessible through CA, but is planned to be used through
QSRV.</p>
<h1 align="center">EPICS Release 7.0.2.2</h1>
<h3>Build System changes</h3>
<ul>
@@ -1015,6 +1037,15 @@ of its CALLBACK objects.</p>
<!-- Insert inherited items immediately below here ... -->
<h3>Cleaning up with Multiple CA contexts in a Process</h3>
<p>Bruno Martins reported a problem with the CA client library at shutdown in a
process that uses multiple CA client contexts. The first context that triggers
the CA client exit handler prevents any others from being able to clean up
because it resets the ID of an internal epicsThreadPrivate variable which is
shared by all clients. This action has been removed from the client library,
which makes cleanup of clients like this possible.</p>
<h3>Perl CA bindings fixed for macOS Mojave</h3>
<p>Apple removed some Perl header files from macOS Mojave that were available

View File

@@ -126,9 +126,10 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<tr>
<td>&nbsp;</td>
<td>Website Manager</td>
<td>Create a release milestone on Launchpad if necessary and set the
expected release date. Note that pre-release and release-candidate
versions do not appear on Launchpad, only the final release.</td>
<td>Create a release milestone on Launchpad. If a target release date is
known set "Date Targeted" to the expected release date. Note that
pre-release and release-candidate versions should not get Launchpad
milestones, only the final release.</td>
</tr>
<tr>
<th colspan="3">Creating pre-release and release-candidate versions</th>
@@ -146,17 +147,17 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Tag the module in Git, using these tag conventions:
<ul>
<li>
<tt>R7.0.2-pre<i>n</i></tt>
<tt>R7.0.3-pre<i>n</i></tt>
&mdash; pre-release tag
</li>
<li>
<tt>R7.0.2-rc<i>n</i></tt>
<tt>R7.0.3-rc<i>n</i></tt>
&mdash; release candidate tag
</li>
</ul>
<blockquote><tt>
cd base-7.0<br />
git tag -m 'ANJ: Tagged for 7.0.2-rc1' R7.0.2-rc1
git tag -m 'ANJ: Tagged for 7.0.3-rc1' R7.0.3-rc1
</tt></blockquote>
Note that submodules must <em>not</em> be tagged with the version used
for the top-level, they each have their own separate version numbers
@@ -170,11 +171,11 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
files and directories that are only used for continuous integration:
<blockquote><tt>
cd base-7.0<br />
./.tools/make-tar.sh R7.0.2-rc1 base-7.0.2-rc1.tar.gz base-7.0.2-rc1/
./.tools/make-tar.sh R7.0.3-rc1 base-7.0.3-rc1.tar.gz base-7.0.3-rc1/
</tt></blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote><tt>
gpg --armor --sign --detach-sig base-7.0.2-rc1.tar.gz
gpg --armor --sign --detach-sig base-7.0.3-rc1.tar.gz
</tt></blockquote>
</td>
</tr>
@@ -302,7 +303,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Tag the epics-base module in Git:
<blockquote><tt>
cd base-7.0<br />
git tag -m 'ANJ: Tagged for 7.0.2.2' R7.0.2.2</i>
git tag -m 'ANJ: Tagged for 7.0.3' R7.0.3</i>
</tt></blockquote>
Don't push the new tag to the Launchpad repository yet.</td>
</tr>
@@ -314,11 +315,11 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
files and directories that are only used for continuous integration:
<blockquote><tt>
cd base-7.0<br />
./.tools/make-tar.sh R7.0.2.2 base-7.0.2.2.tar.gz base-7.0.2.2/
./.tools/make-tar.sh R7.0.3 base-7.0.3.tar.gz base-7.0.3/
</tt></blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote><tt>
gpg --armor --sign --detach-sig base-7.0.2.2.tar.gz
gpg --armor --sign --detach-sig base-7.0.3.tar.gz
</tt></blockquote>
</td>
</tr>
@@ -348,27 +349,16 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
with a "-DEV" tag added (where applicable).
</td>
</tr>
<tr>
<th colspan="3">Publish to epics.anl.gov</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Copy the tarfile and its signature to the Base download area of the
website.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Find all Launchpad bug reports with the status Fix Committed which
have been fixed in this release and mark them Fix Released.</td>
</tr>
<tr>
<th colspan="3">Publish and Announce it</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Upload the tar file and its <tt>.asc</tt> signature file to the
Launchpad milestone for this release version.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
@@ -400,6 +390,47 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Add an entry to the website News page, linking to the new version
webpage.</td>
</tr>
<tr>
<th colspan="3">Publish to epics-controls</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Upload the tar file and its <tt>.asc</tt> signature file to the
epics-controls web-server [ToDo: ssh-key, location]</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Follow instructions on
<a href="https://epics-controls.org/resources-and-support/documents/epics-website-documentation/adding-a-page-for-a-new-release/">
Add a page for a new release</a> to create a new release webpage (not
required for a patch release though, just edit the existing page).</td>
</tr>
<tr>
<th colspan="3">Publish to Launchpad</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Go to the Launchpad milestone for this release. Click the Create
release button and add the release date. Put a URL for the release page
in the Release notes box, and click the Create release button. Upload
the tar file and its <tt>.asc</tt> signature file to the new Launchpad
release page.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Find all Launchpad bug reports with the status Fix Committed which
have been fixed in this release and mark them Fix Released.</td>
</tr>
<tr>
<th colspan="3">Make Announcement</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>

View File

@@ -37,6 +37,9 @@ pva2pva_DEPEND_DIRS = pvAccess
SUBMODULES += example
example_DEPEND_DIRS = pva2pva pvaClient
SUBMODULES += pcas
pcas_DEPEND_DIRS = ca
# Allow sites to add extra submodules
-include Makefile.local

View File

@@ -1,4 +1,4 @@
EPICS_CA_MAJOR_VERSION = 4
EPICS_CA_MINOR_VERSION = 13
EPICS_CA_MAINTENANCE_VERSION = 3
EPICS_CA_MAINTENANCE_VERSION = 4
EPICS_CA_DEVELOPMENT_FLAG = 0

View File

@@ -3143,7 +3143,8 @@ indicating the current state of the channel.</p>
<dl>
<dt><code>COUNT</code></dt>
<dd>The element count to be read from the specified channel. A count of
zero means use the current element count from the server.</dd>
zero means use the current element count from the server, effectively
resulting in a variable size array subscription.</dd>
</dl>
<dl>
<dt><code>CHID</code></dt>

View File

@@ -72,6 +72,7 @@ LIBSRCS += comQueSend.cpp
LIBSRCS += comBuf.cpp
LIBSRCS += hostNameCache.cpp
LIBSRCS += msgForMultiplyDefinedPV.cpp
LIBSRCS_vxWorks += templateInstances.cpp
LIBRARY=ca

View File

@@ -45,20 +45,12 @@ static epicsThreadOnceId cacOnce = EPICS_THREAD_ONCE_INIT;
const unsigned ca_client_context :: flushBlockThreshold = 0x58000;
extern "C" void cacExitHandler ( void *)
{
epicsThreadPrivateDelete ( caClientCallbackThreadId );
caClientCallbackThreadId = 0;
delete ca_client_context::pDefaultServiceInstallMutex;
}
// runs once only for each process
extern "C" void cacOnceFunc ( void * )
{
caClientCallbackThreadId = epicsThreadPrivateCreate ();
assert ( caClientCallbackThreadId );
ca_client_context::pDefaultServiceInstallMutex = newEpicsMutex;
epicsAtExit ( cacExitHandler,0 );
}
extern epicsThreadPrivateId caClientContextId;
@@ -67,6 +59,8 @@ cacService * ca_client_context::pDefaultService = 0;
epicsMutex * ca_client_context::pDefaultServiceInstallMutex;
ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
mutex(__FILE__, __LINE__),
cbMutex(__FILE__, __LINE__),
createdByThread ( epicsThreadGetIdSelf () ),
ca_exception_func ( 0 ), ca_exception_arg ( 0 ),
pVPrintfFunc ( errlogVprintf ), fdRegFunc ( 0 ), fdRegArg ( 0 ),

View File

@@ -289,7 +289,6 @@ private:
};
extern "C" void cacOnceFunc ( void * );
extern "C" void cacExitHandler ( void *);
struct ca_client_context : public cacContextNotify
{
@@ -429,7 +428,6 @@ private:
ca_client_context & operator = ( const ca_client_context & );
friend void cacOnceFunc ( void * );
friend void cacExitHandler ( void *);
static cacService * pDefaultService;
static epicsMutex * pDefaultServiceInstallMutex;
static const unsigned flushBlockThreshold;

View File

@@ -37,6 +37,7 @@ repeaterSubscribeTimer::repeaterSubscribeTimer (
epicsMutex & cbMutexIn, cacContextNotify & ctxNotifyIn ) :
timer ( queueIn.createTimer () ), iiu ( iiuIn ),
cbMutex ( cbMutexIn ),ctxNotify ( ctxNotifyIn ),
stateMutex(__FILE__, __LINE__),
attempts ( 0 ), registered ( false ), once ( false )
{
}

View File

@@ -0,0 +1,66 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, 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.
\*************************************************************************/
/*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include "cac.h"
#include "oldAccess.h"
#include "repeaterClient.h"
template class chronIntIdResTable < nciu >;
template class chronIntIdResTable < baseNMIU >;
template class chronIntIdResTable < CASG >;
template class resTable < nciu, chronIntId >;
template class resTable < baseNMIU, chronIntId >;
template class resTable < CASG, chronIntId >;
template class resTable < bhe, inetAddrID >;
template class resTable < tcpiiu, caServerID >;
template class tsFreeList < bhe, 0x100 >;
template class tsFreeList < tcpiiu, 32, epicsMutexNOOP >;
template class tsFreeList < netReadNotifyIO, 1024, epicsMutexNOOP >;
template class tsFreeList < netWriteNotifyIO, 1024, epicsMutexNOOP >;
template class tsFreeList < netSubscription, 1024, epicsMutexNOOP >;
template class tsFreeList < CASG, 128, epicsMutexNOOP >;
template class tsFreeList < syncGroupReadNotify, 128, epicsMutexNOOP >;
template class tsFreeList < syncGroupWriteNotify, 128, epicsMutexNOOP >;
template class tsFreeList < comBuf, 0x20 >;
template class tsFreeList < getCallback, 1024, epicsMutexNOOP >;
template class tsFreeList < getCopy, 1024, epicsMutexNOOP >;
template class tsFreeList < msgForMultiplyDefinedPV, 16 >;
template class tsFreeList < nciu, 1024, epicsMutexNOOP>;
template class tsFreeList < oldChannelNotify, 1024, epicsMutexNOOP >;
template class tsFreeList < oldSubscription, 1024, epicsMutexNOOP >;
template class tsFreeList < putCallback, 1024, epicsMutexNOOP >;
template class tsFreeList < repeaterClient, 0x20 >;
template class epicsSingleton < localHostName >;
template unsigned comBuf :: push ( const double * pValue, unsigned nElem );
template unsigned comBuf :: push ( const float * pValue, unsigned nElem );
template unsigned comBuf :: push ( const int * pValue, unsigned nElem );
template unsigned comBuf :: push ( const short * pValue, unsigned nElem );
template comBuf :: popStatus comBuf :: pop ( unsigned int & returnVal );
template comBuf :: popStatus comBuf :: pop ( unsigned short & returnVal );
template comBuf :: popStatus comBuf :: pop ( unsigned char & returnVal );
template void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO
(epicsGuard < epicsMutex > &, syncGroupWriteNotify & );
template void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO
( epicsGuard < epicsMutex > &, syncGroupReadNotify & );

View File

@@ -1,4 +1,4 @@
EPICS_DATABASE_MAJOR_VERSION = 3
EPICS_DATABASE_MINOR_VERSION = 17
EPICS_DATABASE_MAINTENANCE_VERSION = 3
EPICS_DATABASE_MAINTENANCE_VERSION = 4
EPICS_DATABASE_DEVELOPMENT_FLAG = 0

View File

@@ -240,6 +240,10 @@ int astac(const char *pname,const char *user,const char *location)
char *puser;
char *plocation;
if (!pname || !user || !location){
printf("Usage: astac \"record name\", \"user\", \"host\"\n");
return(1);
}
paddr = dbCalloc(1,sizeof(DBADDR) + sizeof(ASCLIENTPVT));
pasclientpvt = (ASCLIENTPVT *)(paddr + 1);
status=dbNameToAddr(pname,paddr);

View File

@@ -42,6 +42,7 @@ INC += dbState.h
INC += db_access_routines.h
INC += db_convert.h
INC += dbUnitTest.h
INC += dbCaPvt.h
# Generate menuGlobal.dbd, not really by concatenation, see RULES
DBDCAT += menuGlobal.dbd
@@ -96,4 +97,5 @@ dbCore_SRCS += chfPlugin.c
dbCore_SRCS += dbState.c
dbCore_SRCS += dbUnitTest.c
dbCore_SRCS += dbServer.c
dbCore_SRCS_vxWorks += templateInstances.cpp

View File

@@ -55,7 +55,7 @@ typedef struct cbQueueSet {
epicsRingPointerId queue;
int queueOverflow;
int queueOverflows;
int shutdown;
int shutdown; // use atomic
int threadsConfigured;
int threadsRunning;
} cbQueueSet;
@@ -71,12 +71,15 @@ epicsExportAddress(int,callbackParallelThreadsDefault);
/* Timer for Delayed Requests */
static epicsTimerQueueId timerQueue;
/* Shutdown handling */
enum ctl {ctlInit, ctlRun, ctlPause, ctlExit};
static volatile enum ctl cbCtl;
static epicsEventId startStopEvent;
enum cbState_t {
cbInit, /* before callbackInit() and after callbackCleanup() */
cbRun, /* after callbackInit() and before callbackStop() */
cbStop, /* after callbackStop() and before callbackCleanup() */
};
static int callbackIsInit;
static int cbState; // holdscbState_t, use atomic ops
static epicsEventId startStopEvent;
/* Static data */
static char *threadNamePrefix[NUM_CALLBACK_PRIORITIES] = {
@@ -96,7 +99,7 @@ static int priorityValue[NUM_CALLBACK_PRIORITIES] = {0, 1, 2};
int callbackSetQueueSize(int size)
{
if (callbackIsInit) {
if (epicsAtomicGetIntT(&cbState)!=cbInit) {
fprintf(stderr, "Callback system already initialized\n");
return -1;
}
@@ -107,7 +110,7 @@ int callbackSetQueueSize(int size)
int callbackQueueStatus(const int reset, callbackQueueStats *result)
{
int ret;
if (!callbackIsInit) return -1;
if (epicsAtomicGetIntT(&cbState)==cbInit) return -1;
if (result) {
int prio;
result->size = callbackQueueSize;
@@ -151,7 +154,7 @@ void callbackQueueShow(const int reset)
int callbackParallelThreads(int count, const char *prio)
{
if (callbackIsInit) {
if (epicsAtomicGetIntT(&cbState)!=cbInit) {
fprintf(stderr, "Callback system already initialized\n");
return -1;
}
@@ -207,7 +210,7 @@ static void callbackTask(void *arg)
taskwdInsert(0, NULL, NULL);
epicsEventSignal(startStopEvent);
while(!mySet->shutdown) {
while(!epicsAtomicGetIntT(&mySet->shutdown)) {
void *ptr;
if (epicsRingPointerIsEmpty(mySet->queue))
epicsEventMustWait(mySet->semWakeUp);
@@ -230,11 +233,10 @@ void callbackStop(void)
{
int i;
if (cbCtl == ctlExit) return;
cbCtl = ctlExit;
if (epicsAtomicCmpAndSwapIntT(&cbState, cbRun, cbStop)!=cbRun) return;
for (i = 0; i < NUM_CALLBACK_PRIORITIES; i++) {
callbackQueue[i].shutdown = 1;
epicsAtomicSetIntT(&callbackQueue[i].shutdown, 1);
epicsEventSignal(callbackQueue[i].semWakeUp);
}
@@ -252,6 +254,10 @@ void callbackCleanup(void)
{
int i;
if(epicsAtomicCmpAndSwapIntT(&cbState, cbStop, cbInit)!=cbStop) {
fprintf(stderr, "callbackCleanup() but not stopped\n");
}
for (i = 0; i < NUM_CALLBACK_PRIORITIES; i++) {
cbQueueSet *mySet = &callbackQueue[i];
@@ -261,7 +267,6 @@ void callbackCleanup(void)
}
epicsTimerQueueRelease(timerQueue);
callbackIsInit = 0;
memset(callbackQueue, 0, sizeof(callbackQueue));
}
@@ -271,15 +276,14 @@ void callbackInit(void)
int j;
char threadName[32];
if (callbackIsInit) {
errlogMessage("Warning: callbackInit called again before callbackCleanup\n");
if (epicsAtomicCmpAndSwapIntT(&cbState, cbInit, cbRun)!=cbInit) {
fprintf(stderr, "Warning: callbackInit called again before callbackCleanup\n");
return;
}
callbackIsInit = 1;
if(!startStopEvent)
startStopEvent = epicsEventMustCreate(epicsEventEmpty);
cbCtl = ctlRun;
timerQueue = epicsTimerQueueAllocate(0, epicsThreadPriorityScanHigh);
for (i = 0; i < NUM_CALLBACK_PRIORITIES; i++) {

View File

@@ -49,7 +49,13 @@
#include "link.h"
#include "special.h"
#define EVENTSPERQUE 32
/* Queue size based on Ethernet MTU of 1500 bytes.
* Assume <=66 bytes of ethernet+IP+TCP overhead
* and 40 byte CA messages (DBF_TIME_DOUBLE).
*
* (1500-66)/40 -> 35
*/
#define EVENTSPERQUE 36
#define EVENTENTRIES 4 /* the number of que entries for each event */
#define EVENTQUESIZE (EVENTENTRIES * EVENTSPERQUE)
#define EVENTQEMPTY ((struct evSubscrip *)NULL)

View File

@@ -0,0 +1,9 @@
#include "dbCAC.h"
#include "dbChannelIO.h"
#include "dbPutNotifyBlocker.h"
template class tsFreeList < dbSubscriptionIO, 256, epicsMutexNOOP >;
template class tsFreeList < dbChannelIO, 256, epicsMutexNOOP >;
template class tsFreeList < dbPutNotifyBlocker, 64, epicsMutexNOOP >;
template class resTable < dbBaseIO, chronIntId >;
template class chronIntIdResTable < dbBaseIO >;

View File

@@ -13,7 +13,7 @@ SRC_DIRS += $(IOCDIR)/dbtemplate
PROD_HOST += msi
msi_SRCS = msi.c
msi_SRCS = msi.cpp
msi_LIBS += Com
HTMLS += msi.html

View File

@@ -9,6 +9,9 @@
/* msi - macro substitutions and include */
#include <string>
#include <list>
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
@@ -18,7 +21,6 @@
#include <dbDefs.h>
#include <macLib.h>
#include <ellLib.h>
#include <errlog.h>
#include <epicsString.h>
#include <osiFileName.h>
@@ -56,32 +58,35 @@ int din = 0;
typedef struct inputData inputData;
static void inputConstruct(inputData **ppvt);
static void inputDestruct(inputData *pvt);
static void inputAddPath(inputData *pvt, char *pval);
static void inputBegin(inputData *pvt, char *fileName);
static char *inputNextLine(inputData *pvt);
static void inputNewIncludeFile(inputData *pvt, char *name);
static void inputErrPrint(inputData *pvt);
static void inputDestruct(inputData * const pvt);
static void inputAddPath(inputData * const pvt, const char * const pval);
static void inputBegin(inputData * const pvt, const char * const fileName);
static char *inputNextLine(inputData * const pvt);
static void inputNewIncludeFile(inputData * const pvt, const char * const name);
static void inputErrPrint(const inputData * const pvt);
/* Module to read the substitution file */
typedef struct subInfo subInfo;
static void substituteOpen(subInfo **ppvt, char *substitutionName);
static void substituteDestruct(subInfo *pvt);
static int substituteGetNextSet(subInfo *pvt, char **filename);
static int substituteGetGlobalSet(subInfo *pvt);
static char *substituteGetReplacements(subInfo *pvt);
static char *substituteGetGlobalReplacements(subInfo *pvt);
static void substituteOpen(subInfo **ppvt, const std::string& substitutionName);
static void substituteDestruct(subInfo * const pvt);
static bool substituteGetNextSet(subInfo * const pvt, char **filename);
static bool substituteGetGlobalSet(subInfo * const pvt);
static const char *substituteGetReplacements(subInfo * const pvt);
static const char *substituteGetGlobalReplacements(subInfo * const pvt);
/* Forward references to local routines */
static void usageExit(int status);
static void abortExit(int status);
static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval);
static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *templateName);
static void usageExit(const int status);
static void abortExit(const int status);
static void addMacroReplacements(MAC_HANDLE * const macPvt,
const char * const pval);
static void makeSubstitutions(inputData * const inputPvt,
MAC_HANDLE * const macPvt,
const char * const templateName);
/*Global variables */
static int opt_V = 0;
static int opt_D = 0;
static bool opt_D = false;
static char *outFile = 0;
static int numDeps = 0, depHashes[MAX_DEPS];
@@ -92,23 +97,21 @@ int main(int argc,char **argv)
inputData *inputPvt;
MAC_HANDLE *macPvt;
char *pval;
int narg;
char *substitutionName = 0;
std::string substitutionName;
char *templateName = 0;
int i;
int localScope = 1;
bool localScope = true;
inputConstruct(&inputPvt);
macCreateHandle(&macPvt, 0);
while ((argc > 1) && (argv[1][0] == '-')) {
narg = (strlen(argv[1]) == 2) ? 2 : 1;
int narg = (strlen(argv[1]) == 2) ? 2 : 1;
pval = (narg == 1) ? (argv[1] + 2) : argv[2];
if (strncmp(argv[1], "-I", 2) == 0) {
inputAddPath(inputPvt, pval);
}
else if (strcmp(argv[1], "-D") == 0) {
opt_D = 1;
opt_D = true;
narg = 1; /* no argument for this option */
}
else if(strncmp(argv[1], "-o", 2) == 0) {
@@ -118,14 +121,14 @@ int main(int argc,char **argv)
addMacroReplacements(macPvt, pval);
}
else if(strncmp(argv[1], "-S", 2) == 0) {
substitutionName = epicsStrDup(pval);
substitutionName = pval;
}
else if (strcmp(argv[1], "-V") == 0) {
opt_V = 1;
narg = 1; /* no argument for this option */
}
else if (strcmp(argv[1], "-g") == 0) {
localScope = 0;
localScope = false;
narg = 1; /* no argument for this option */
}
else if (strcmp(argv[1], "-h") == 0) {
@@ -137,7 +140,7 @@ int main(int argc,char **argv)
}
argc -= narg;
for (i = 1; i < argc; i++)
for (int i = 1; i < argc; i++)
argv[i] = argv[i + narg];
}
@@ -165,24 +168,24 @@ int main(int argc,char **argv)
if (argc == 2)
templateName = epicsStrDup(argv[1]);
if (!substitutionName) {
if (substitutionName.empty()) {
STEP("Single template+substitutions file");
makeSubstitutions(inputPvt, macPvt, templateName);
}
else {
subInfo *substitutePvt;
char *filename = 0;
int isGlobal, isFile;
bool isGlobal, isFile;
STEPS("Substitutions from file", substitutionName);
STEPS("Substitutions from file", substitutionName.c_str());
substituteOpen(&substitutePvt, substitutionName);
do {
isGlobal = substituteGetGlobalSet(substitutePvt);
if (isGlobal) {
STEP("Handling global macros");
pval = substituteGetGlobalReplacements(substitutePvt);
if (pval)
addMacroReplacements(macPvt, pval);
const char *macStr = substituteGetGlobalReplacements(substitutePvt);
if (macStr)
addMacroReplacements(macPvt, macStr);
}
else if ((isFile = substituteGetNextSet(substitutePvt, &filename))) {
if (templateName)
@@ -193,11 +196,12 @@ int main(int argc,char **argv)
}
STEPS("Handling template file", filename);
while ((pval = substituteGetReplacements(substitutePvt))) {
const char *macStr;
while ((macStr = substituteGetReplacements(substitutePvt))) {
if (localScope)
macPushScope(macPvt);
addMacroReplacements(macPvt, pval);
addMacroReplacements(macPvt, macStr);
makeSubstitutions(inputPvt, macPvt, filename);
if (localScope)
@@ -207,18 +211,18 @@ int main(int argc,char **argv)
} while (isGlobal || isFile);
substituteDestruct(substitutePvt);
}
errlogFlush();
macDeleteHandle(macPvt);
errlogFlush(); // macLib calls errlogPrintf()
inputDestruct(inputPvt);
if (opt_D) {
printf("\n");
}
fflush(stdout);
free(templateName);
free(substitutionName);
return opt_V & 2;
}
void usageExit(int status)
void usageExit(const int status)
{
fprintf(stderr,
"Usage: msi [options] [template]\n"
@@ -236,7 +240,7 @@ void usageExit(int status)
exit(status);
}
void abortExit(int status)
void abortExit(const int status)
{
if (outFile) {
fclose(stdout);
@@ -245,7 +249,8 @@ void abortExit(int status)
exit(status);
}
static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval)
static void addMacroReplacements(MAC_HANDLE * const macPvt,
const char * const pval)
{
char **pairs;
long status;
@@ -268,7 +273,9 @@ static void addMacroReplacements(MAC_HANDLE *macPvt, char *pval)
typedef enum {cmdInclude,cmdSubstitute} cmdType;
static const char *cmdNames[] = {"include","substitute"};
static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *templateName)
static void makeSubstitutions(inputData * const inputPvt,
MAC_HANDLE * const macPvt,
const char * const templateName)
{
char *input;
static char buffer[MAX_BUFFER_SIZE];
@@ -292,7 +299,6 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem
if (command) {
char *pstart;
char *pend;
char *copy;
int cmdind=-1;
int i;
@@ -325,16 +331,15 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem
/*skip quote and any trailing blanks*/
while (*++p == ' ') ;
if (*p != '\n' && *p != 0) goto endcmd;
copy = calloc(pend-pstart + 1, sizeof(char));
strncpy(copy, pstart, pend-pstart);
std::string copy = std::string(pstart, pend);
switch(cmdind) {
case cmdInclude:
inputNewIncludeFile(inputPvt,copy);
inputNewIncludeFile(inputPvt, copy.c_str());
break;
case cmdSubstitute:
addMacroReplacements(macPvt,copy);
addMacroReplacements(macPvt, copy.c_str());
break;
default:
@@ -342,7 +347,6 @@ static void makeSubstitutions(inputData *inputPvt, MAC_HANDLE *macPvt, char *tem
inputErrPrint(inputPvt);
abortExit(1);
}
free(copy);
expand = 0;
}
@@ -361,94 +365,72 @@ endcmd:
}
typedef struct inputFile {
ELLNODE node;
char *filename;
std::string filename;
FILE *fp;
int lineNum;
} inputFile;
typedef struct pathNode {
ELLNODE node;
char *directory;
} pathNode;
struct inputData {
ELLLIST inputFileList;
ELLLIST pathList;
std::list<inputFile> inputFileList;
std::list<std::string> pathList;
char inputBuffer[MAX_BUFFER_SIZE];
inputData() { memset(inputBuffer, 0, sizeof(inputBuffer) * sizeof(inputBuffer[0])); };
};
static void inputOpenFile(inputData *pinputData, char *filename);
static void inputOpenFile(inputData *pinputData, const char * const filename);
static void inputCloseFile(inputData *pinputData);
static void inputCloseAllFiles(inputData *pinputData);
static void inputConstruct(inputData **ppvt)
{
inputData *pinputData;
pinputData = calloc(1, sizeof(inputData));
ellInit(&pinputData->inputFileList);
ellInit(&pinputData->pathList);
*ppvt = pinputData;
*ppvt = new inputData;
}
static void inputDestruct(inputData *pinputData)
static void inputDestruct(inputData * const pinputData)
{
pathNode *ppathNode;
inputCloseAllFiles(pinputData);
while ((ppathNode = (pathNode *) ellFirst(&pinputData->pathList))) {
ellDelete(&pinputData->pathList, &ppathNode->node);
free(ppathNode->directory);
free(ppathNode);
}
free(pinputData);
delete(pinputData);
}
static void inputAddPath(inputData *pinputData, char *path)
static void inputAddPath(inputData * const pinputData, const char * const path)
{
ELLLIST *ppathList = &pinputData->pathList;
pathNode *ppathNode;
const char *pcolon;
const char *pdir;
size_t len;
int emptyName;
const char sep = *OSI_PATH_LIST_SEPARATOR;
ENTER;
pdir = path;
/*an empty name at beginning, middle, or end means current directory*/
while (pdir && *pdir) {
emptyName = ((*pdir == sep) ? 1 : 0);
bool emptyName = (*pdir == sep);
if (emptyName) ++pdir;
ppathNode = (pathNode *) calloc(1, sizeof(pathNode));
ellAdd(ppathList, &ppathNode->node);
std::string directory;
if (!emptyName) {
pcolon = strchr(pdir, sep);
len = (pcolon ? (pcolon - pdir) : strlen(pdir));
if (len > 0) {
ppathNode->directory = (char *) calloc(len + 1, sizeof(char));
strncpy(ppathNode->directory, pdir, len);
directory = std::string(pdir, len);
pdir = pcolon;
/*unless at end skip past first colon*/
if (pdir && *(pdir + 1) != 0) ++pdir;
}
else { /*must have been trailing : */
emptyName = 1;
emptyName = true;
}
}
if (emptyName) {
ppathNode->directory = (char *) calloc(2, sizeof(char));
strcpy(ppathNode->directory, ".");
directory = ".";
}
pinputData->pathList.push_back(directory);
}
EXIT;
}
static void inputBegin(inputData *pinputData, char *fileName)
static void inputBegin(inputData * const pinputData, const char * const fileName)
{
ENTER;
inputCloseAllFiles(pinputData);
@@ -456,16 +438,16 @@ static void inputBegin(inputData *pinputData, char *fileName)
EXIT;
}
static char *inputNextLine(inputData *pinputData)
static char *inputNextLine(inputData * const pinputData)
{
inputFile *pinputFile;
char *pline;
std::list<inputFile>& inFileList = pinputData->inputFileList;
ENTER;
while ((pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList))) {
pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, pinputFile->fp);
while (!inFileList.empty()) {
inputFile& inFile = inFileList.front();
char *pline = fgets(pinputData->inputBuffer, MAX_BUFFER_SIZE, inFile.fp);
if (pline) {
++pinputFile->lineNum;
++inFile.lineNum;
EXITS(pline);
return pline;
}
@@ -475,32 +457,31 @@ static char *inputNextLine(inputData *pinputData)
return 0;
}
static void inputNewIncludeFile(inputData *pinputData, char *name)
static void inputNewIncludeFile(inputData * const pinputData,
const char * const name)
{
ENTER;
inputOpenFile(pinputData,name);
EXIT;
}
static void inputErrPrint(inputData *pinputData)
static void inputErrPrint(const inputData *const pinputData)
{
inputFile *pinputFile;
ENTER;
fprintf(stderr, "input: '%s' at ", pinputData->inputBuffer);
pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList);
while (pinputFile) {
fprintf(stderr, "line %d of ", pinputFile->lineNum);
const std::list<inputFile>& inFileList = pinputData->inputFileList;
std::list<inputFile>::const_iterator inFileIt = inFileList.begin();
while (inFileIt != inFileList.end()) {
fprintf(stderr, "line %d of ", inFileIt->lineNum);
if (pinputFile->filename) {
fprintf(stderr, " file %s\n", pinputFile->filename);
if (!inFileIt->filename.empty()) {
fprintf(stderr, " file %s\n", inFileIt->filename.c_str());
}
else {
fprintf(stderr, "stdin:\n");
}
pinputFile = (inputFile *) ellNext(&pinputFile->node);
if (pinputFile) {
if (++inFileIt != inFileList.end()) {
fprintf(stderr, " included from ");
}
else {
@@ -511,12 +492,11 @@ static void inputErrPrint(inputData *pinputData)
EXIT;
}
static void inputOpenFile(inputData *pinputData,char *filename)
static void inputOpenFile(inputData *pinputData, const char * const filename)
{
ELLLIST *ppathList = &pinputData->pathList;
pathNode *ppathNode = 0;
inputFile *pinputFile;
char *fullname = 0;
std::list<std::string>& pathList = pinputData->pathList;
std::list<std::string>::iterator pathIt = pathList.end();
std::string fullname;
FILE *fp = 0;
ENTER;
@@ -524,24 +504,19 @@ static void inputOpenFile(inputData *pinputData,char *filename)
STEP("Using stdin");
fp = stdin;
}
else if ((ellCount(ppathList) == 0) || strchr(filename, '/')){
else if (pathList.empty() || strchr(filename, '/')){
STEPS("Opening ", filename);
fp = fopen(filename, "r");
}
else {
ppathNode = (pathNode *) ellFirst(ppathList);
while (ppathNode) {
fullname = calloc(strlen(filename) + strlen(ppathNode->directory) + 2,
sizeof(char));
strcpy(fullname, ppathNode->directory);
strcat(fullname, "/");
strcat(fullname, filename);
pathIt = pathList.begin();
while(pathIt != pathList.end()) {
fullname = *pathIt + "/" + filename;
STEPS("Trying", filename);
fp = fopen(fullname, "r");
fp = fopen(fullname.c_str(), "r");
if (fp)
break;
free(fullname);
ppathNode = (pathNode *) ellNext(&ppathNode->node);
++pathIt;
}
}
@@ -552,20 +527,20 @@ static void inputOpenFile(inputData *pinputData,char *filename)
}
STEP("File opened");
pinputFile = calloc(1, sizeof(inputFile));
inputFile inFile = inputFile();
if (ppathNode) {
pinputFile->filename = fullname;
if (pathIt != pathList.end()) {
inFile.filename = fullname;
}
else if (filename) {
pinputFile->filename = epicsStrDup(filename);
inFile.filename = filename;
}
else {
pinputFile->filename = epicsStrDup("stdin");
inFile.filename = "stdin";
}
if (opt_D) {
int hash = epicsStrHash(pinputFile->filename, 12345);
int hash = epicsStrHash(inFile.filename.c_str(), 12345);
int i = 0;
int match = 0;
@@ -578,7 +553,7 @@ static void inputOpenFile(inputData *pinputData,char *filename)
if (!match) {
const char *wrap = numDeps ? " \\\n" : "";
printf("%s %s", wrap, pinputFile->filename);
printf("%s %s", wrap, inFile.filename.c_str());
if (numDeps < MAX_DEPS) {
depHashes[numDeps++] = hash;
}
@@ -589,33 +564,29 @@ static void inputOpenFile(inputData *pinputData,char *filename)
}
}
pinputFile->fp = fp;
ellInsert(&pinputData->inputFileList, 0, &pinputFile->node);
inFile.fp = fp;
pinputData->inputFileList.push_front(inFile);
EXIT;
}
static void inputCloseFile(inputData *pinputData)
{
inputFile *pinputFile;
std::list<inputFile>& inFileList = pinputData->inputFileList;
ENTER;
pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList);
if (pinputFile) {
ellDelete(&pinputData->inputFileList, &pinputFile->node);
if (fclose(pinputFile->fp))
fprintf(stderr, "msi: Can't close input file '%s'\n", pinputFile->filename);
free(pinputFile->filename);
free(pinputFile);
if(!inFileList.empty()) {
inputFile& inFile = inFileList.front();
if (fclose(inFile.fp))
fprintf(stderr, "msi: Can't close input file '%s'\n", inFile.filename.c_str());
inFileList.erase(inFileList.begin());
}
EXIT;
}
static void inputCloseAllFiles(inputData *pinputData)
{
inputFile *pinputFile;
ENTER;
while ((pinputFile = (inputFile *) ellFirst(&pinputData->inputFileList))) {
const std::list<inputFile>& inFileList = pinputData->inputFileList;
while(!inFileList.empty()) {
inputCloseFile(pinputData);
}
EXIT;
@@ -627,7 +598,7 @@ typedef enum {
} tokenType;
typedef struct subFile {
char *substitutionName;
std::string substitutionName;
FILE *fp;
int lineNum;
char inputBuffer[MAX_BUFFER_SIZE];
@@ -636,25 +607,20 @@ typedef struct subFile {
char string[MAX_BUFFER_SIZE];
} subFile;
typedef struct patternNode {
ELLNODE node;
char *var;
} patternNode;
struct subInfo {
subFile *psubFile;
int isFile;
bool isFile;
char *filename;
int isPattern;
ELLLIST patternList;
size_t size;
size_t curLength;
char *macroReplacements;
bool isPattern;
std::list<std::string> patternList;
std::string macroReplacements;
subInfo() : psubFile(NULL), isFile(false), filename(NULL),
isPattern(false) {};
};
static char *subGetNextLine(subFile *psubFile);
static tokenType subGetNextToken(subFile *psubFile);
static void subFileErrPrint(subFile *psubFile,char * message);
static void subFileErrPrint(subFile *psubFile, const char * message);
static void freeSubFile(subInfo *psubInfo);
static void freePattern(subInfo *psubInfo);
static void catMacroReplacements(subInfo *psubInfo,const char *value);
@@ -668,7 +634,7 @@ void freeSubFile(subInfo *psubInfo)
if (fclose(psubFile->fp))
fprintf(stderr, "msi: Can't close substitution file\n");
}
free(psubFile);
delete(psubFile);
free(psubInfo->filename);
psubInfo->psubFile = 0;
EXIT;
@@ -676,43 +642,36 @@ void freeSubFile(subInfo *psubInfo)
void freePattern(subInfo *psubInfo)
{
patternNode *ppatternNode;
ENTER;
while ((ppatternNode = (patternNode *) ellFirst(&psubInfo->patternList))) {
ellDelete(&psubInfo->patternList, &ppatternNode->node);
free(ppatternNode->var);
free(ppatternNode);
}
psubInfo->isPattern = 0;
psubInfo->patternList.clear();
psubInfo->isPattern = false;
EXIT;
}
static void substituteDestruct(subInfo *psubInfo)
static void substituteDestruct(subInfo * const psubInfo)
{
ENTER;
freeSubFile(psubInfo);
freePattern(psubInfo);
free(psubInfo);
delete(psubInfo);
EXIT;
}
static void substituteOpen(subInfo **ppvt, char *substitutionName)
static void substituteOpen(subInfo **ppvt, const std::string& substitutionName)
{
subInfo *psubInfo;
subFile *psubFile;
FILE *fp;
ENTER;
psubInfo = calloc(1, sizeof(subInfo));
psubInfo = new subInfo;
*ppvt = psubInfo;
psubFile = calloc(1, sizeof(subFile));
psubFile = new subFile;
psubInfo->psubFile = psubFile;
ellInit(&psubInfo->patternList);
fp = fopen(substitutionName, "r");
fp = fopen(substitutionName.c_str(), "r");
if (!fp) {
fprintf(stderr, "msi: Can't open file '%s'\n", substitutionName);
fprintf(stderr, "msi: Can't open file '%s'\n", substitutionName.c_str());
abortExit(1);
}
@@ -725,7 +684,7 @@ static void substituteOpen(subInfo **ppvt, char *substitutionName)
EXIT;
}
static int substituteGetGlobalSet(subInfo *psubInfo)
static bool substituteGetGlobalSet(subInfo * const psubInfo)
{
subFile *psubFile = psubInfo->psubFile;
@@ -737,17 +696,16 @@ static int substituteGetGlobalSet(subInfo *psubInfo)
strcmp(psubFile->string, "global") == 0) {
subGetNextToken(psubFile);
EXITD(1);
return 1;
return true;
}
EXITD(0);
return 0;
return false;
}
static int substituteGetNextSet(subInfo *psubInfo,char **filename)
static bool substituteGetNextSet(subInfo * const psubInfo,char **filename)
{
subFile *psubFile = psubInfo->psubFile;
patternNode *ppatternNode;
ENTER;
*filename = 0;
@@ -756,7 +714,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
if (psubFile->token == tokenEOF) {
EXITD(0);
return 0;
return false;
}
if (psubFile->token == tokenString &&
@@ -764,7 +722,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
size_t len;
STEP("Parsed 'file'");
psubInfo->isFile = 1;
psubInfo->isFile = true;
if (subGetNextToken(psubFile) != tokenString) {
subFileErrPrint(psubFile, "Parse error, expecting a filename");
abortExit(1);
@@ -799,7 +757,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
if (psubFile->token == tokenLBrace) {
EXITD(1);
return 1;
return true;
}
if (psubFile->token == tokenRBrace) {
@@ -815,7 +773,7 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
STEP("Parsed 'pattern'");
freePattern(psubInfo);
psubInfo->isPattern = 1;
psubInfo->isPattern = true;
while (subGetNextToken(psubFile) == tokenSeparator);
@@ -825,15 +783,13 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
}
STEP("Parsed '{'");
while (1) {
while (true) {
while (subGetNextToken(psubFile) == tokenSeparator);
if (psubFile->token != tokenString)
break;
ppatternNode = calloc(1, sizeof(patternNode));
ellAdd(&psubInfo->patternList, &ppatternNode->node);
ppatternNode->var = epicsStrDup(psubFile->string);
psubInfo->patternList.push_back(psubFile->string);
}
if (psubFile->token != tokenRBrace) {
@@ -843,23 +799,21 @@ static int substituteGetNextSet(subInfo *psubInfo,char **filename)
subGetNextToken(psubFile);
EXITD(1);
return 1;
return true;
}
static char *substituteGetGlobalReplacements(subInfo *psubInfo)
static const char *substituteGetGlobalReplacements(subInfo * const psubInfo)
{
subFile *psubFile = psubInfo->psubFile;
ENTER;
if (psubInfo->macroReplacements)
psubInfo->macroReplacements[0] = 0;
psubInfo->curLength = 0;
psubInfo->macroReplacements.clear();
while (psubFile->token == tokenSeparator)
subGetNextToken(psubFile);
if (psubFile->token == tokenRBrace && psubInfo->isFile) {
psubInfo->isFile = 0;
psubInfo->isFile = false;
free(psubInfo->filename);
psubInfo->filename = 0;
freePattern(psubInfo);
@@ -877,12 +831,12 @@ static char *substituteGetGlobalReplacements(subInfo *psubInfo)
return 0;
}
while (1) {
while (true) {
switch(subGetNextToken(psubFile)) {
case tokenRBrace:
subGetNextToken(psubFile);
EXITS(psubInfo->macroReplacements);
return psubInfo->macroReplacements;
EXITS(psubInfo->macroReplacements.c_str());
return psubInfo->macroReplacements.c_str();
case tokenSeparator:
catMacroReplacements(psubInfo, ",");
@@ -902,21 +856,18 @@ static char *substituteGetGlobalReplacements(subInfo *psubInfo)
}
}
static char *substituteGetReplacements(subInfo *psubInfo)
static const char *substituteGetReplacements(subInfo * const psubInfo)
{
subFile *psubFile = psubInfo->psubFile;
patternNode *ppatternNode;
ENTER;
if (psubInfo->macroReplacements)
psubInfo->macroReplacements[0] = 0;
psubInfo->curLength = 0;
psubInfo->macroReplacements.clear();
while (psubFile->token == tokenSeparator)
subGetNextToken(psubFile);
if (psubFile->token==tokenRBrace && psubInfo->isFile) {
psubInfo->isFile = 0;
psubInfo->isFile = false;
free(psubInfo->filename);
psubInfo->filename = 0;
freePattern(psubInfo);
@@ -936,15 +887,16 @@ static char *substituteGetReplacements(subInfo *psubInfo)
}
if (psubInfo->isPattern) {
int gotFirstPattern = 0;
bool gotFirstPattern = false;
while (subGetNextToken(psubFile) == tokenSeparator);
ppatternNode = (patternNode *) ellFirst(&psubInfo->patternList);
while (1) {
std::list<std::string>& patternList = psubInfo->patternList;
std::list<std::string>::iterator patternIt = patternList.begin();
while (true) {
if (psubFile->token == tokenRBrace) {
subGetNextToken(psubFile);
EXITS(psubInfo->macroReplacements);
return psubInfo->macroReplacements;
EXITS(psubInfo->macroReplacements.c_str());
return psubInfo->macroReplacements.c_str();
}
if (psubFile->token != tokenString) {
@@ -954,13 +906,13 @@ static char *substituteGetReplacements(subInfo *psubInfo)
if (gotFirstPattern)
catMacroReplacements(psubInfo, ",");
gotFirstPattern = 1;
gotFirstPattern = true;
if (ppatternNode) {
catMacroReplacements(psubInfo, ppatternNode->var);
if (patternIt != patternList.end()) {
catMacroReplacements(psubInfo, patternIt->c_str());
catMacroReplacements(psubInfo, "=");
catMacroReplacements(psubInfo, psubFile->string);
ppatternNode = (patternNode *) ellNext(&ppatternNode->node);
++patternIt;
}
else {
subFileErrPrint(psubFile, "Warning, too many values given");
@@ -969,12 +921,12 @@ static char *substituteGetReplacements(subInfo *psubInfo)
while (subGetNextToken(psubFile) == tokenSeparator);
}
}
else while(1) {
else while(true) {
switch(subGetNextToken(psubFile)) {
case tokenRBrace:
subGetNextToken(psubFile);
EXITS(psubInfo->macroReplacements);
return psubInfo->macroReplacements;
EXITS(psubInfo->macroReplacements.c_str());
return psubInfo->macroReplacements.c_str();
case tokenSeparator:
catMacroReplacements(psubInfo, ",");
@@ -1017,11 +969,12 @@ static char *subGetNextLine(subFile *psubFile)
return &psubFile->inputBuffer[0];
}
static void subFileErrPrint(subFile *psubFile,char * message)
static void subFileErrPrint(subFile *psubFile, const char * message)
{
fprintf(stderr, "msi: %s\n",message);
fprintf(stderr, " in substitution file '%s' at line %d:\n %s",
psubFile->substitutionName, psubFile->lineNum, psubFile->inputBuffer);
psubFile->substitutionName.c_str(), psubFile->lineNum,
psubFile->inputBuffer);
}
@@ -1107,32 +1060,8 @@ done:
static void catMacroReplacements(subInfo *psubInfo, const char *value)
{
size_t len = strlen(value);
ENTER;
if (psubInfo->size <= (psubInfo->curLength + len)) {
size_t newsize = psubInfo->size + MAX_BUFFER_SIZE;
char *newbuf;
STEP("Enlarging buffer");
if (newsize <= psubInfo->curLength + len)
newsize = psubInfo->curLength + len + 1;
newbuf = calloc(1, newsize);
if (!newbuf) {
fprintf(stderr, "calloc failed for size %lu\n",
(unsigned long) newsize);
abortExit(1);
}
if (psubInfo->macroReplacements) {
memcpy(newbuf, psubInfo->macroReplacements, psubInfo->curLength);
free(psubInfo->macroReplacements);
}
psubInfo->size = newsize;
psubInfo->macroReplacements = newbuf;
}
STEPS("Appending", value);
strcat(psubInfo->macroReplacements, value);
psubInfo->curLength += len;
psubInfo->macroReplacements += value;
EXIT;
}

View File

@@ -16,6 +16,7 @@ caserverio_INCLUDES = -I$(SRC)/ca/client
camessage_INCLUDES = -I$(SRC)/ca/client
INC += rsrv.h
INC += server.h
DBD += rsrv.dbd

View File

@@ -241,7 +241,7 @@ Assuming there is a system state called "blue", that is being controlled by
some other facility such as a timing system, updates could be restricted to
periods only when "blue" is true by using
Hal$ camonitor 'test:channel' 'test:channel.{"while":"blue"}'
Hal$ camonitor 'test:channel' 'test:channel.{"sync":{"while":"blue"}}'
...
=cut

View File

@@ -348,9 +348,9 @@ static long get_enum_strs(const DBADDR *paddr,struct dbr_enumStrs *pes)
/*SETTING no_str=0 breaks channel access clients*/
pes->no_str = 2;
memset(pes->strs,'\0',sizeof(pes->strs));
strncpy(pes->strs[0],prec->znam,sizeof(prec->znam));
strncpy(pes->strs[0],prec->znam,sizeof(pes->strs[0]));
if(*prec->znam!=0) pes->no_str=1;
strncpy(pes->strs[1],prec->onam,sizeof(prec->onam));
strncpy(pes->strs[1],prec->onam,sizeof(pes->strs[1]));
if(*prec->onam!=0) pes->no_str=2;
return(0);
}

View File

@@ -51,7 +51,7 @@ static long special(DBADDR *, int);
#define get_array_info NULL
#define put_array_info NULL
#define get_units NULL
#define get_precision NULL
static long get_precision(const DBADDR *, long *);
#define get_enum_str NULL
#define get_enum_strs NULL
#define put_enum_str NULL
@@ -204,6 +204,16 @@ static long special(DBADDR *paddr, int after)
}
}
static long get_precision(const DBADDR *paddr,long *precision)
{
mbbiDirectRecord *prec=(mbbiDirectRecord *)paddr->precord;
if(dbGetFieldIndex(paddr)==mbbiDirectRecordVAL)
*precision = prec->nobt;
else
recGblGetPrec(paddr,precision);
return 0;
}
static void monitor(mbbiDirectRecord *prec)
{
epicsUInt16 events = recGblResetAlarms(prec);

View File

@@ -51,7 +51,7 @@ static long special(DBADDR *, int);
#define get_array_info NULL
#define put_array_info NULL
#define get_units NULL
#define get_precision NULL
static long get_precision(const DBADDR *, long *);
#define get_enum_str NULL
#define get_enum_strs NULL
#define put_enum_str NULL
@@ -313,6 +313,16 @@ static long special(DBADDR *paddr, int after)
return 0;
}
static long get_precision(const DBADDR *paddr,long *precision)
{
mbboDirectRecord *prec=(mbboDirectRecord *)paddr->precord;
if(dbGetFieldIndex(paddr)==mbboDirectRecordVAL)
*precision = prec->nobt;
else
recGblGetPrec(paddr,precision);
return 0;
}
static void monitor(mbboDirectRecord *prec)
{
epicsUInt16 events = recGblResetAlarms(prec);

View File

@@ -99,7 +99,7 @@ static void monitor(stateRecord *prec)
monitor_mask = recGblResetAlarms(prec);
if(strncmp(prec->oval,prec->val,sizeof(prec->val))) {
db_post_events(prec,&(prec->val[0]),monitor_mask|DBE_VALUE|DBE_LOG);
strncpy(prec->oval,prec->val,sizeof(prec->val));
strncpy(prec->oval,prec->val,sizeof(prec->oval));
}
return;
}

View File

@@ -121,8 +121,7 @@ static long init_record(struct dbCommon *pcommon, int pass)
if (status)
return status;
}
strncpy(prec->oval, prec->val, sizeof(prec->val));
strncpy(prec->oval, prec->val, sizeof(prec->oval));
return 0;
}
@@ -183,7 +182,7 @@ static void monitor(stringinRecord *prec)
if (strncmp(prec->oval, prec->val, sizeof(prec->val))) {
monitor_mask |= DBE_VALUE | DBE_LOG;
strncpy(prec->oval, prec->val, sizeof(prec->val));
strncpy(prec->oval, prec->val, sizeof(prec->oval));
}
if (prec->mpst == stringinPOST_Always)

View File

@@ -126,8 +126,7 @@ static long init_record(struct dbCommon *pcommon, int pass)
if(status)
return status;
}
strncpy(prec->oval, prec->val, sizeof(prec->val));
strncpy(prec->oval, prec->val, sizeof(prec->oval));
return 0;
}
@@ -215,7 +214,7 @@ static void monitor(stringoutRecord *prec)
if (strncmp(prec->oval, prec->val, sizeof(prec->val))) {
monitor_mask |= DBE_VALUE | DBE_LOG;
strncpy(prec->oval, prec->val, sizeof(prec->val));
strncpy(prec->oval, prec->val, sizeof(prec->oval));
}
if (prec->mpst == stringoutPOST_Always)

View File

@@ -12,6 +12,8 @@ SRC_DIRS += $(STDDIR)/softIoc
PROD_IOC_DEFAULT = softIoc
PROD_IOC_iOS = -nil-
PROD_LDFLAGS_vxWorks = --whole-archive
DBD += base.dbd
DBD += asSub.dbd
DBD += softIoc.dbd

View File

@@ -11,7 +11,7 @@
use strict;
use Test;
BEGIN {plan tests => 9}
BEGIN {plan tests => 12}
# Check include/substitute command model
ok(msi('-I .. ../t1-template.txt'), slurp('../t1-result.txt'));
@@ -33,16 +33,9 @@ ok(msi('-S../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt'));
# Output option -o and verbose option -V
my $out = 't7-output.txt';
my $count = 5; # Try up to 5 times...
my $result;
do {
unlink $out;
msi("-I.. -V -o $out ../t1-template.txt");
$result = slurp($out);
print "# msi output file empty, retrying\n"
if $result eq '';
} while ($result eq '') && (--$count > 0);
ok($result, slurp('../t7-result.txt'));
unlink $out;
msi("-I.. -V -o $out ../t1-template.txt");
ok(slurp($out), slurp('../t7-result.txt'));
# Dependency generation, include/substitute model
ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt'));
@@ -50,6 +43,17 @@ ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt'));
# Dependency generation, dbLoadTemplate format
ok(msi('-I.. -D -ot9.txt -S ../t2-substitution.txt'), slurp('../t9-result.txt'));
# Substitution file, variable format, with 0 variable definitions
ok(msi('-I. -I.. -S ../t10-substitute.txt'), slurp('../t10-result.txt'));
# Substitution file, pattern format, with 0 pattern definitions
ok(msi('-I. -I.. -S ../t11-substitute.txt'), slurp('../t11-result.txt'));
# Substitution file, environment variable macros in template filename
my %envs = (TEST_NO => 12, PREFIX => 't');
@ENV{ keys %envs } = values %envs;
ok(msi('-I. -I.. -S ../t12-substitute.txt'), slurp('../t12-result.txt'));
delete @ENV{ keys %envs }; # Not really needed
# Test support routines
@@ -63,21 +67,8 @@ sub slurp {
sub msi {
my ($args) = @_;
my $nul = $^O eq 'MSWin32' ? 'NUL' : '/dev/null';
my $msi = '@TOP@/bin/@ARCH@/msi';
$msi .= '.exe' if ($^O eq 'MSWin32') || ($^O eq 'cygwin');
my $result;
if ($args =~ m/-o / && $args !~ m/-D/) {
# An empty result is expected
$result = `$msi $args`;
}
else {
# Try up to 5 times, sometimes msi fails on Windows
my $count = 5;
do {
$result = `$msi $args`;
print "# result of '$msi $args' empty, retrying\n"
if $result eq '';
} while ($result eq '') && (--$count > 0);
}
return $result;
$msi =~ tr(/)(\\) if $^O eq 'MSWin32';
return `$msi $args 2>$nul`;
}

View File

@@ -0,0 +1,4 @@
# comment line
a=$(a)
# comment line
a=gbl

View File

@@ -0,0 +1,8 @@
file t10-template.txt {
{}
}
global { a=gbl }
file t10-template.txt {
{}
}

View File

@@ -0,0 +1,2 @@
# comment line
a=$(a)

View File

@@ -0,0 +1,4 @@
# comment line
a=$(a)
# comment line
a=gbl

View File

@@ -0,0 +1,10 @@
file t11-template.txt {
pattern {}
{}
}
global { a=gbl }
file t11-template.txt {
pattern {}
{}
}

View File

@@ -0,0 +1,2 @@
# comment line
a=$(a)

View File

@@ -0,0 +1,2 @@
# comment line
a=foo

View File

@@ -0,0 +1,3 @@
file $(PREFIX)$(TEST_NO)-template.txt {
{ a=foo }
}

View File

@@ -0,0 +1,2 @@
# comment line
a=$(a)

View File

@@ -1,4 +1,4 @@
EPICS_LIBCOM_MAJOR_VERSION = 3
EPICS_LIBCOM_MINOR_VERSION = 17
EPICS_LIBCOM_MAINTENANCE_VERSION = 4
EPICS_LIBCOM_MAINTENANCE_VERSION = 5
EPICS_LIBCOM_DEVELOPMENT_FLAG = 0

View File

@@ -37,7 +37,7 @@
static unsigned short ioc_log_port;
static long ioc_log_file_limit;
static char ioc_log_file_name[256];
static char ioc_log_file_name[512];
static char ioc_log_file_command[256];
@@ -866,7 +866,12 @@ static int setupSIGHUP(struct ioc_log_server *pserver)
*/
static void sighupHandler(int signo)
{
(void) write(sighupPipe[1], "SIGHUP\n", 7);
const char msg[] = "SIGHUP\n";
const ssize_t bytesWritten = write(sighupPipe[1], msg, sizeof(msg));
if (bytesWritten != sizeof(msg)) {
fprintf(stderr, "iocLogServer: failed to write to SIGHUP pipe because "
"`%s'\n", strerror(errno));
}
}
@@ -884,7 +889,10 @@ static void serviceSighupRequest(void *pParam)
/*
* Read and discard message from pipe.
*/
(void) read(sighupPipe[0], buff, sizeof buff);
if (read(sighupPipe[0], buff, sizeof buff) <= 0) {
fprintf(stderr, "iocLogServer: failed to read from SIGHUP pipe because "
"`%s'\n", strerror(errno));
};
/*
* Determine new log file name.

Some files were not shown because too many files have changed in this diff Show More