Compare commits

..

5 Commits

Author SHA1 Message Date
6bb78e0d59 bump rpm release
Some checks failed
Check EditorConfig / editorconfig (push) Failing after 1s
Base / Cross linux-aarch64 (push) Failing after 2s
Base / Cross linux-arm gnueabi (push) Failing after 1s
Base / Cross linux-arm gnueabihf (push) Failing after 2s
Base / Fedora-33 (push) Failing after 1s
Base / Fedora-latest (push) Failing after 2s
Base / Ub-20 clang-10 C++11 (push) Has been cancelled
Base / MacOS clang-12 (push) Has been cancelled
Base / Ub-20 clang-10 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 beatnik (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-4.10 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-4.9 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 pc686 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 uC5282 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 xilinx_zynq_a9_qemu (push) Has been cancelled
Base / Win2019 mingw (push) Has been cancelled
Base / Ub-20 gcc-9 + MinGW (push) Has been cancelled
Base / Ub-20 gcc-9 unsigned char (push) Has been cancelled
Base / Ub-20 gcc-9 C++11, static (push) Has been cancelled
Base / Ub-20 gcc-9 + MinGW, static (push) Has been cancelled
Base / Ub-22 gcc-12 c++20 Werror (push) Has been cancelled
Base / Win2019 MSC-19 (push) Has been cancelled
Base / Win2019 MSC-19, debug (push) Has been cancelled
Base / Win2019 MSC-19, static (push) Has been cancelled
2024-11-25 11:33:27 +01:00
7d73932dc8 fix recursion bug
Previously, linking a field of e.g. a calc record to itself
(calc.INPA = calc.A) directly or through a chain of other records
that support to follow the link for attributes like units, precision
caused an infinite recursion and crashed the ioc.

Affected records: calc, calcout, seq, sub and aSub

Also added support for seq link 0 fields which had been added meanwhile.
2024-11-25 11:32:41 +01:00
4a442bb56c Support deb12-x86_64 2024-11-25 09:27:53 +01:00
60075df3cf Support deb10-x86_64 as a Host arch (allow to build modules on the system) 2024-11-25 09:26:50 +01:00
42892f3921 make VALID_BUILDS contain Host automatically if BUILD_CLASS is HOST 2024-11-18 10:26:59 +01:00
16 changed files with 234 additions and 118 deletions

View File

@@ -8,7 +8,7 @@
#-------------------------------------------------------
# Unix valid build types
VALID_BUILDS = Host Ioc Command
VALID_BUILDS = $(if $(filter HOST,$(BUILD_CLASS)),Host) Ioc Command
#-------------------------------------------------------
# Unix prefix and suffix definitions

View File

@@ -1,11 +1,16 @@
# Cross Debian 10 with gcc 8.3
# Debian 10
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linuxCommon
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
ARCH_CLASS = x86_64
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
GNU_TARGET = x86_64-deb10-linux-gnu
BUILD_CLASS = HOST
STD_CXXFLAGS = -std=c++17
ifneq ($(EPICS_HOST_ARCH),$(T_A))
# Cross compile
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
GNU_TARGET = x86_64-deb10-linux-gnu
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
CMPLR_PREFIX = $(GNU_TARGET)-
endif

View File

@@ -0,0 +1,17 @@
# Debian 12
# Include definitions common to all Linux targets
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
BUILD_CLASS = HOST
STD_CXXFLAGS = -std=c++17
ifneq ($(EPICS_HOST_ARCH),$(T_A))
# Cross compile
GNU_DIR = /opt/xgcc/gcc-12.2.0-deb12
GNU_TARGET = x86_64-deb12-linux-gnu
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
CMPLR_PREFIX = $(GNU_TARGET)-
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(SYSROOT)/lib/x86_64-linux-gnu
endif

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,3 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
GNU_DIR=/usr

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,3 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
GNU_DIR=/usr

View File

@@ -0,0 +1,2 @@
# Debian 10
COMMANDLINE_LIBRARY=READLINE

View File

@@ -18,10 +18,6 @@ GNU_DIR = $(SYSROOT)$(TOOLSET_DIR)
TARGET_CPPFLAGS += $(SYSROOT:%=--sysroot=%)
TARGET_LDFLAGS += $(SYSROOT:%=--sysroot=%)
ifeq ($(filter SL% RHEL%,$(T_A)),)
VALID_BUILDS = Ioc Command
endif
# backward compatibility: Keep unversioned libs
# in order to prevent dynamic linking problems
# when minor changes increment *_MAINTENANCE_VERSION

View File

@@ -21,8 +21,9 @@ CROSS_COMPILER_TARGET_ARCHS += windows-x64
#CROSS_COMPILER_TARGET_ARCHS += yocto21-aarch64
CROSS_COMPILER_TARGET_ARCHS += yocto40-aarch64
# Debian 10
# Debian
CROSS_COMPILER_TARGET_ARCHS += deb10-x86_64
CROSS_COMPILER_TARGET_ARCHS += deb12-x86_64
# Newer DeltaTau PowerPMAC
CROSS_COMPILER_TARGET_ARCHS += gcc8-ppc4xxFP

View File

@@ -5,7 +5,7 @@
Name: epics-base-%{EpicsVersion}
Summary: EPICS Base %{EpicsVersion}
Version: 2
Release: 1%{?dist}
Release: 2%{?dist}
License: EPICS Open License
Group: Development/Languages
URL: https://git.psi.ch/epics_base/base-7.0
@@ -334,19 +334,52 @@ fi
###########################################
%files boot
# including files to build on some Linux cross archs
# hence some configure/* and lib/perl/* listed twice
%defattr(-,root,root,-)
%dir %{prog_folder}
%dir %{prog_folder}/configure
%{prog_folder}/configure/CONFIG_BASE_VERSION
%{prog_folder}/configure/RELEASE
%{prog_folder}/configure/CONFIG*
%{prog_folder}/configure/RULES*
%dir %{prog_folder}/configure/os
%{prog_folder}/configure/os/CONFIG.Common.UnixCommon
%{prog_folder}/configure/os/CONFIG.Common.linuxCommon
%{prog_folder}/configure/os/CONFIG.Common.linux-clang
%{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}*
%{prog_folder}/configure/os/CONFIG.Common.[a-z]*-*
%{prog_folder}/configure/os/CONFIG.UnixCommon.Common
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.Common
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.[a-z]*-*
%{prog_folder}/configure/os/CONFIG.linux-*.Common
%{prog_folder}/configure/os/CONFIG.linux-*.linux-*
%{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon
%{prog_folder}/configure/os/CONFIG_SITE.Common.linux-*
%{prog_folder}/configure/os/CONFIG_SITE.[a-z]*-*.Common
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.Common
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.UnixCommon
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.linux-*
%dir %{prog_folder}/include
%{prog_folder}/include/*.h
%{prog_folder}/include/compiler
%dir %{prog_folder}/include/os
%{prog_folder}/include/os/Linux/
%{prog_folder}/include/pv/
%{prog_folder}/include/pva/
%{prog_folder}/include/valgrind/
%{prog_folder}/include/flex.skel.static
%dir %{prog_folder}/dbd
%{prog_folder}/dbd/softIoc*.dbd
%{prog_folder}/db
%dir %{prog_folder}/lib
# avoid pulling in pkgconfig and perl
%dir %{prog_folder}/lib/[a-z]*-*
%{prog_folder}/lib/[a-z]*-*/*.so*
%dir %{prog_folder}/lib/perl
%{prog_folder}/lib/perl/EPICS
%{prog_folder}/lib/perl/DBD*
%dir %{prog_folder}/bin
# avoid pulling in host files again
@@ -354,9 +387,11 @@ fi
# including all Windows dlls (hence listed twice: here and in wine)
%dir %{prog_folder}/bin/[a-z]*
%{prog_folder}/bin/[a-z]*/[Scips]*[^.]??
%{prog_folder}/bin/[a-z]*/p2p
%{prog_folder}/bin/[a-z]*/msi*
%{prog_folder}/bin/[a-z]*/acctst*
%{prog_folder}/bin/[a-z]*/*.dll
%{prog_folder}/bin/[a-z]*/registerRecordDeviceDriver*
# vxWorks and RTEMS
%dir %{prog_folder}/bin/V*

View File

@@ -302,6 +302,16 @@ static long get_outlinkNumber(int fieldIndex) {
return -1;
}
#define do_recursion_safe(func, plink, ...) \
do { \
dbScanLock((dbCommon*)prec); \
DBLINK link = *(plink); \
(plink)->lset = NULL; \
func(&link, __VA_ARGS__); \
(plink)->lset = link.lset; \
dbScanUnlock((dbCommon*)prec); \
} while(0)
static long get_units(DBADDR *paddr, char *units)
{
aSubRecord *prec = (aSubRecord *)paddr->precord;
@@ -309,12 +319,12 @@ static long get_units(DBADDR *paddr, char *units)
linkNumber = get_inlinkNumber(dbGetFieldIndex(paddr));
if (linkNumber >= 0) {
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
return 0;
}
linkNumber = get_outlinkNumber(dbGetFieldIndex(paddr));
if (linkNumber >= 0) {
dbGetUnits(&prec->outa + linkNumber, units, DB_UNITS_SIZE);
do_recursion_safe(dbGetUnits, &prec->outa + linkNumber, units, DB_UNITS_SIZE);
}
return 0;
}
@@ -322,27 +332,25 @@ static long get_units(DBADDR *paddr, char *units)
static long get_precision(const DBADDR *paddr, long *pprecision)
{
aSubRecord *prec = (aSubRecord *)paddr->precord;
long status;
int fieldIndex = dbGetFieldIndex(paddr);
int linkNumber;
short precision;
*pprecision = prec->prec;
linkNumber = get_inlinkNumber(fieldIndex);
if (linkNumber >= 0) {
short precision;
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
*pprecision = precision;
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
if (status == 0) *pprecision = precision;
return 0;
}
linkNumber = get_outlinkNumber(fieldIndex);
if (linkNumber >= 0) {
short precision;
if (dbGetPrecision(&prec->outa + linkNumber, &precision) == 0)
*pprecision = precision;
} else
recGblGetPrec(paddr, pprecision);
do_recursion_safe(status = dbGetPrecision, &prec->outa + linkNumber, &precision);
if (status == 0) *pprecision = precision;
return 0;
}
recGblGetPrec(paddr, pprecision);
return 0;
}
@@ -354,16 +362,16 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
linkNumber = get_inlinkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetGraphicLimits(&prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
return 0;
}
linkNumber = get_outlinkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetGraphicLimits(&prec->outa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
do_recursion_safe(dbGetGraphicLimits, &prec->outa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
}
return 0;
}
@@ -382,20 +390,20 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
linkNumber = get_inlinkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetAlarmLimits(&prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
return 0;
}
linkNumber = get_outlinkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetAlarmLimits(&prec->outa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
do_recursion_safe(dbGetAlarmLimits, &prec->outa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
return 0;
}
recGblGetAlarmDouble(paddr, pad);

View File

@@ -166,6 +166,16 @@ static long get_linkNumber(int fieldIndex) {
return -1;
}
#define do_recursion_safe(func, plink, ...) \
do { \
dbScanLock((dbCommon*)prec); \
DBLINK link = *(plink); \
(plink)->lset = NULL; \
func(&link, __VA_ARGS__); \
(plink)->lset = link.lset; \
dbScanUnlock((dbCommon*)prec); \
} while(0)
static long get_units(DBADDR *paddr, char *units)
{
calcRecord *prec = (calcRecord *)paddr->precord;
@@ -174,7 +184,7 @@ static long get_units(DBADDR *paddr, char *units)
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
if (linkNumber >= 0)
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
else
strncpy(units,prec->egu,DB_UNITS_SIZE);
}
@@ -193,10 +203,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
long status;
short precision;
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
*pprecision = precision;
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
if (status == 0) *pprecision = precision;
} else
recGblGetPrec(paddr, pprecision);
return 0;
@@ -222,11 +232,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
break;
default:
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetGraphicLimits(&prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
} else
if (linkNumber >= 0)
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
else
recGblGetGraphicDouble(paddr,pgd);
}
return 0;
@@ -267,13 +277,13 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
} else {
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetAlarmLimits(&prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
} else
if (linkNumber >= 0)
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
else
recGblGetAlarmDouble(paddr, pad);
}
return 0;

View File

@@ -413,6 +413,16 @@ static long get_linkNumber(int fieldIndex) {
return -1;
}
#define do_recursion_safe(func, plink, ...) \
do { \
dbScanLock((dbCommon*)prec); \
DBLINK link = *(plink); \
(plink)->lset = NULL; \
func(&link, __VA_ARGS__); \
(plink)->lset = link.lset; \
dbScanUnlock((dbCommon*)prec); \
} while(0)
static long get_units(DBADDR *paddr, char *units)
{
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
@@ -425,9 +435,9 @@ static long get_units(DBADDR *paddr, char *units)
}
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0)
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
else
strncpy(units,prec->egu,DB_UNITS_SIZE);
}
@@ -451,10 +461,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
long status;
short precision;
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
*pprecision = precision;
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
if (status == 0) *pprecision = precision;
} else
recGblGetPrec(paddr, pprecision);
return 0;
@@ -484,11 +494,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
break;
default:
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetGraphicLimits(&prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
} else
if (linkNumber >= 0)
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
else
recGblGetGraphicDouble(paddr,pgd);
}
return 0;
@@ -533,13 +543,13 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
} else {
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetAlarmLimits(&prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
} else
if (linkNumber >= 0)
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
else
recGblGetAlarmDouble(paddr, pad);
}
return 0;

View File

@@ -279,39 +279,49 @@ static void processCallback(epicsCallback *arg)
#define get_dol(prec, fieldOffset) \
&((linkGrp *) &prec->dly0)[fieldOffset >> 2].dol
#define do_recursion_safe(func, plink, ...) \
do { \
dbScanLock((dbCommon*)prec); \
DBLINK link = *(plink); \
(plink)->lset = NULL; \
func(&link, __VA_ARGS__); \
(plink)->lset = link.lset; \
dbScanUnlock((dbCommon*)prec); \
} while(0)
static long get_units(DBADDR *paddr, char *units)
{
seqRecord *prec = (seqRecord *) paddr->precord;
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
if (fieldOffset >= 0)
switch (fieldOffset & 2) {
switch (fieldOffset & 3) {
case 0: /* DLYn */
strcpy(units, "s");
break;
case 2: /* DOn */
dbGetUnits(get_dol(prec, fieldOffset),
units, DB_UNITS_SIZE);
}
do_recursion_safe(dbGetUnits, get_dol(prec, fieldOffset),
units, DB_UNITS_SIZE);
}
return 0;
}
static long get_precision(const DBADDR *paddr, long *pprecision)
{
seqRecord *prec = (seqRecord *) paddr->precord;
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
long status;
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
short precision;
if (fieldOffset >= 0)
switch (fieldOffset & 2) {
switch (fieldOffset & 3) {
case 0: /* DLYn */
*pprecision = seqDLYprecision;
return 0;
case 2: /* DOn */
if (dbGetPrecision(get_dol(prec, fieldOffset), &precision) == 0) {
*pprecision = precision;
return 0;
}
do_recursion_safe(status = dbGetPrecision, get_dol(prec, fieldOffset), &precision);
if (status == 0) *pprecision = precision;
return 0;
}
*pprecision = prec->prec;
recGblGetPrec(paddr, pprecision);
@@ -321,18 +331,18 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
{
seqRecord *prec = (seqRecord *) paddr->precord;
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
if (fieldOffset >= 0)
switch (fieldOffset & 2) {
switch (fieldOffset & 3) {
case 0: /* DLYn */
pgd->lower_disp_limit = 0.0;
pgd->lower_disp_limit = 10.0;
pgd->upper_disp_limit = 10.0;
return 0;
case 2: /* DOn */
dbGetGraphicLimits(get_dol(prec, fieldOffset),
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
do_recursion_safe(dbGetGraphicLimits, get_dol(prec, fieldOffset),
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
return 0;
}
recGblGetGraphicDouble(paddr, pgd);
@@ -341,9 +351,9 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
{
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
if (fieldOffset >= 0 && (fieldOffset & 2) == 0) { /* DLYn */
if (fieldOffset >= 0 && (fieldOffset & 3) == 0) { /* DLYn */
pcd->lower_ctrl_limit = 0.0;
pcd->upper_ctrl_limit = seqDLYlimit;
}
@@ -355,12 +365,12 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
{
seqRecord *prec = (seqRecord *) paddr->precord;
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
if (fieldOffset >= 0 && (fieldOffset & 2) == 2) /* DOn */
dbGetAlarmLimits(get_dol(prec, fieldOffset),
&pad->lower_alarm_limit, &pad->lower_warning_limit,
&pad->upper_warning_limit, &pad->upper_alarm_limit);
if (fieldOffset >= 0 && (fieldOffset & 3) == 2) /* DOn */
do_recursion_safe(dbGetAlarmLimits, get_dol(prec, fieldOffset),
&pad->lower_alarm_limit, &pad->lower_warning_limit,
&pad->upper_warning_limit, &pad->upper_alarm_limit);
else
recGblGetAlarmDouble(paddr, pad);
return 0;

View File

@@ -201,6 +201,16 @@ static long get_linkNumber(int fieldIndex) {
return -1;
}
#define do_recursion_safe(func, plink, ...) \
do { \
dbScanLock((dbCommon*)prec); \
DBLINK link = *(plink); \
(plink)->lset = NULL; \
func(&link, __VA_ARGS__); \
(plink)->lset = link.lset; \
dbScanUnlock((dbCommon*)prec); \
} while(0)
static long get_units(DBADDR *paddr, char *units)
{
subRecord *prec = (subRecord *)paddr->precord;
@@ -209,7 +219,7 @@ static long get_units(DBADDR *paddr, char *units)
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
if (linkNumber >= 0)
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
else
strncpy(units,prec->egu,DB_UNITS_SIZE);
}
@@ -228,10 +238,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
long status;
short precision;
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
*pprecision = precision;
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
if (status == 0) *pprecision = precision;
} else
recGblGetPrec(paddr, pprecision);
return 0;
@@ -257,11 +267,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
break;
default:
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetGraphicLimits(&prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
} else
if (linkNumber >= 0)
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
&pgd->lower_disp_limit,
&pgd->upper_disp_limit);
else
recGblGetGraphicDouble(paddr,pgd);
}
return 0;
@@ -302,14 +312,14 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
} else {
linkNumber = get_linkNumber(fieldIndex);
if (linkNumber >= 0) {
dbGetAlarmLimits(&prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
} else
recGblGetAlarmDouble(paddr, pad);
if (linkNumber >= 0)
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
&pad->lower_alarm_limit,
&pad->lower_warning_limit,
&pad->upper_warning_limit,
&pad->upper_alarm_limit);
else
recGblGetAlarmDouble(paddr, pad);
}
return 0;
}