Compare commits
106 Commits
R3.14.12-r
...
R3.14.12.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
967ce8eb84 | ||
|
|
b27e22d75e | ||
|
|
6ef52b5d03 | ||
|
|
652235ef13 | ||
|
|
5b46eebe1a | ||
|
|
a252218e69 | ||
|
|
fae5bbcf86 | ||
|
|
a0c1c0fb15 | ||
|
|
bb14c6594b | ||
|
|
0dfbd460e1 | ||
|
|
b36b07db9e | ||
|
|
ee95f0c4b7 | ||
|
|
d72b4a3c1e | ||
|
|
21b4acfa86 | ||
|
|
96cad82a2a | ||
|
|
d088d4b664 | ||
|
|
6cb9a3f7c1 | ||
|
|
6c4164d953 | ||
|
|
3a101aa697 | ||
|
|
46ea687c6d | ||
|
|
75aa05d30f | ||
|
|
3cfa011760 | ||
|
|
83e5247ed4 | ||
|
|
f203e9a48b | ||
|
|
14e7111e72 | ||
|
|
2b65025d93 | ||
|
|
2b4edba8f3 | ||
|
|
35b72b60fb | ||
|
|
d286a81ef0 | ||
|
|
bc4a7854ec | ||
|
|
f59825a462 | ||
|
|
7783f0044b | ||
|
|
1b9ca756cc | ||
|
|
f9f8d1150c | ||
|
|
e71785edf6 | ||
|
|
a367e4be95 | ||
|
|
a80bd1a630 | ||
|
|
515712c0e7 | ||
|
|
2fb7df8548 | ||
|
|
4448a5501a | ||
|
|
dafb7d5d4c | ||
|
|
5343b836b8 | ||
|
|
d0423738d1 | ||
|
|
3bf5b21f57 | ||
|
|
8d15407e2f | ||
|
|
7560fb1bb1 | ||
|
|
445b5e473b | ||
|
|
f18b435cf6 | ||
|
|
5649e15842 | ||
|
|
43f58c990a | ||
|
|
0dfc92f48d | ||
|
|
f1a646240b | ||
|
|
ce0114418f | ||
|
|
342920b1db | ||
|
|
ef0442b50d | ||
|
|
c71093f47f | ||
|
|
c11a31f549 | ||
|
|
ed0e3e60ed | ||
|
|
0373da87ed | ||
|
|
3c0cea0f38 | ||
|
|
4c7684aad1 | ||
|
|
6efd4be222 | ||
|
|
1584f98e26 | ||
|
|
f3f2f23fbc | ||
|
|
5aeb325185 | ||
|
|
2949f6650e | ||
|
|
b472473ef1 | ||
|
|
8418aa059a | ||
|
|
1106bab73e | ||
|
|
038ac0cd38 | ||
|
|
8dea585dc2 | ||
|
|
fc6df7652d | ||
|
|
db89c1f463 | ||
|
|
c6e1787ff9 | ||
|
|
0dab032751 | ||
|
|
4b780b1011 | ||
|
|
fc3e876d57 | ||
|
|
f4528ff5e1 | ||
|
|
d73f466dbc | ||
|
|
3d056f63e4 | ||
|
|
fd72cb63bf | ||
|
|
c698853394 | ||
|
|
22f1e8201f | ||
|
|
b38127450e | ||
|
|
fbcc7b4a0d | ||
|
|
5a11866431 | ||
|
|
253036c36c | ||
|
|
793639f4da | ||
|
|
a2c87268f5 | ||
|
|
a52b995ca2 | ||
|
|
2af392a099 | ||
|
|
6170dc9406 | ||
|
|
23daca46a1 | ||
|
|
f9ebe082ff | ||
|
|
dc76951945 | ||
|
|
253fd8109b | ||
|
|
fd4b34be8f | ||
|
|
23c7e64490 | ||
|
|
3ca705752a | ||
|
|
2069889347 | ||
|
|
04085d340b | ||
|
|
bc7e87b961 | ||
|
|
81d155c98b | ||
|
|
512e14e4b7 | ||
|
|
c503a03f37 | ||
|
|
fb493a064c |
9
LICENSE
9
LICENSE
@@ -1,11 +1,14 @@
|
||||
Copyright (c) 1991-2007 UChicago Argonne LLC and The Regents of the
|
||||
University of California. All rights reserved.
|
||||
Copyright (c) 1991-2011 UChicago Argonne LLC.
|
||||
Copyright (c) 1991-2006 The Regents of the University of California.
|
||||
Copyright (c) 2006-2011. Los Alamos National Security, LLC. Some of this
|
||||
material was produced under U.S. Government contract DE-AC52-06NA25396
|
||||
for Los Alamos National Laboratory (LANL), which is operated by Los Alamos
|
||||
National Security, LLC for the U.S. Department of Energy.
|
||||
|
||||
EPICS BASE is distributed subject to the following license conditions:
|
||||
|
||||
SOFTWARE LICENSE AGREEMENT
|
||||
Software: EPICS BASE
|
||||
Versions: 3.13.7 and higher
|
||||
|
||||
1. The "Software", below, refers to EPICS BASE (in either source code, or
|
||||
binary form and accompanying documentation). Each licensee is
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
@@ -34,6 +34,7 @@
|
||||
# LIBSRCS source files for building libraries (deprecated)
|
||||
# PROD_OBJS object files for building prods
|
||||
# LIB_OBJS object files for building libraries
|
||||
# USR_OBJS object files for building libraries and prods
|
||||
# USR_LIBS libs needed by PROD and TESTPROD and LIBRARY
|
||||
# PROD_LIBS libs needed by PROD and TESTPROD
|
||||
# LIB_LIBS libs needed by shared LIBRARY
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2010 UChicago Argonne LLC, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
@@ -19,26 +19,26 @@
|
||||
|
||||
BASE_3_14=YES
|
||||
|
||||
# EPICS_VERSION must be a number >0 and <256
|
||||
# EPICS_VERSION must be a number >0 and <256
|
||||
EPICS_VERSION = 3
|
||||
|
||||
# EPICS_REVISION must be a number >=0 and <256
|
||||
# EPICS_REVISION must be a number >=0 and <256
|
||||
EPICS_REVISION = 14
|
||||
|
||||
# EPICS_MODIFICATION must be a number >=0 and <256
|
||||
# EPICS_MODIFICATION must be a number >=0 and <256
|
||||
EPICS_MODIFICATION = 12
|
||||
|
||||
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
|
||||
# Not included if zero
|
||||
EPICS_PATCH_LEVEL = 0
|
||||
EPICS_PATCH_LEVEL = 2
|
||||
|
||||
# This will end in -DEV between official releases
|
||||
#EPICS_DEV_SNAPSHOT=-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre1
|
||||
EPICS_DEV_SNAPSHOT=-pre1
|
||||
#EPICS_DEV_SNAPSHOT=-pre1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre2
|
||||
#EPICS_DEV_SNAPSHOT=-pre2-DEV
|
||||
EPICS_DEV_SNAPSHOT=-rc1
|
||||
#EPICS_DEV_SNAPSHOT=-rc1
|
||||
#EPICS_DEV_SNAPSHOT=-rc1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-rc2
|
||||
#EPICS_DEV_SNAPSHOT=-rc2-DEV
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
#
|
||||
@@ -82,7 +81,8 @@ COMMON_DIR = ../O.Common
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Make echo output - suppress echoing if make's '-s' flag is set
|
||||
ECHO := $(if $(findstring s,$(MAKEFLAGS)),\#,@echo)
|
||||
COMMENT = \#
|
||||
ECHO = @$(if $(findstring s,$(patsubst T_A=%,,$(MAKEFLAGS))),$(COMMENT),echo)
|
||||
|
||||
#-------------------------------------------------------
|
||||
ifdef T_A
|
||||
@@ -335,7 +335,7 @@ HDEPENDS_CFLAGS = $(HDEPENDS_CFLAGS_$(HDEPENDS))
|
||||
#--------------------------------------------------
|
||||
# depends definition
|
||||
|
||||
TARGET_SRCS = $(foreach name, $(TESTPROD) $(PROD) $(LIBRARY), $($(name)_SRCS))
|
||||
TARGET_SRCS = $(foreach name, $(TESTPROD) $(PROD) $(LIBRARY) $(LOADABLE_LIBRARY), $($(name)_SRCS))
|
||||
SRC_FILES = $(LIB_SRCS) $(LIBSRCS) $(SRCS) $(USR_SRCS) $(PROD_SRCS) $(TARGET_SRCS)
|
||||
HDEPENDS_FILES_YES = $(addsuffix $(DEP),$(notdir $(basename $(SRC_FILES))))
|
||||
HDEPENDS_FILES = $(if $(filter NO,$(HDEPENDS)),,$(HDEPENDS_FILES_YES))
|
||||
|
||||
@@ -78,12 +78,15 @@
|
||||
# vxWorks-68040lc
|
||||
# vxWorks-68060
|
||||
# vxWorks-pentium
|
||||
# vxWorks-ppc32 (32-bit PowerPC CPUs with full FPU)
|
||||
# vxWorks-ppc32sf (32-bit PowerPC CPUs without FPU)
|
||||
# vxWorks-ppc603
|
||||
# vxWorks-ppc603_long
|
||||
# vxWorks-ppc604
|
||||
# vxWorks-ppc604_long
|
||||
# vxWorks-ppc604_altivec
|
||||
# vxWorks-mpc8540
|
||||
# vxWorks-mpc8548
|
||||
# RTEMS-at91rm9200ek
|
||||
# RTEMS-beatnik
|
||||
# RTEMS-gen68360
|
||||
@@ -103,7 +106,7 @@
|
||||
# override
|
||||
#
|
||||
CROSS_COMPILER_TARGET_ARCHS=
|
||||
#CROSS_COMPILER_TARGET_ARCHS=vxWorks-68040
|
||||
#CROSS_COMPILER_TARGET_ARCHS=vxWorks-ppc32
|
||||
|
||||
# If only a subset of the host architectures perform
|
||||
# the build for the CROSS_COMPILER_TARGET_ARCHS
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
#RULES.Db
|
||||
@@ -23,8 +22,8 @@ vpath %.acs $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
||||
##################################################### dbdflags
|
||||
|
||||
# dbExpand
|
||||
INSTALL_DBDFLAGS += -I $(INSTALL_LOCATION)/dbd
|
||||
INSTALL_DBFLAGS += -I $(INSTALL_LOCATION)/db
|
||||
INSTALL_DBDFLAGS += -I $(INSTALL_DBD)
|
||||
INSTALL_DBFLAGS += -I $(INSTALL_DB)
|
||||
DBDFLAGS = $(USR_DBDFLAGS) -I . -I .. $(INSTALL_DBDFLAGS) $(RELEASE_DBDFLAGS)
|
||||
DBFLAGS = $($*_DBFLAGS) $(USR_DBFLAGS) -I. -I.. $(INSTALL_DBFLAGS) $(RELEASE_DBFLAGS)
|
||||
|
||||
@@ -48,7 +47,7 @@ DBFLAGS = $($*_DBFLAGS) $(USR_DBFLAGS) -I. -I.. $(INSTALL_DBFLAGS) $(RELEASE_DBF
|
||||
# Following line added for backward compatibilty
|
||||
DBD += $(DBDNAME)
|
||||
|
||||
DBDINC_NAME = $(patsubst %.h,%,$(patsubst %.db,%,$(DBDINC)))
|
||||
DBDINC_NAME = $(patsubst %.h,%,$(patsubst %.dbd,%,$(DBDINC)))
|
||||
DBD += $(addsuffix .dbd,$(DBDINC_NAME))
|
||||
INC += $(addsuffix .h,$(DBDINC_NAME))
|
||||
|
||||
@@ -109,7 +108,8 @@ ACF_CMD = $(CPP) $(ACF_CPPFLAGS) $(ACF_INCLUDES) $< > $@
|
||||
HINC += $(addsuffix .h,$(DBDINC_NAME))
|
||||
COMMON_DBDINC += $(addprefix $(COMMON_DIR)/,$(HINC))
|
||||
|
||||
DBDDEPENDS_FILES += $(addsuffix $(DEP),$(HINC) $(DBS) \
|
||||
DBDDEPENDS_FILES += $(addsuffix $(DEP),$(HINC) \
|
||||
$(patsubst $(COMMON_DIR)/%,%,$(COMMON_DBS)) \
|
||||
$(patsubst $(COMMON_DIR)/%,%,$(COMMON_DBDS)))
|
||||
|
||||
DBDDEPENDS_FLAGS = $(subst -I,,$(filter-out -S%,$(DBDFLAGS)))
|
||||
@@ -121,7 +121,7 @@ MAKEDBDEPENDS = $(PERL) $(TOOLS)/makeDbDepends.pl
|
||||
|
||||
ifndef T_A
|
||||
|
||||
ECHO := $(if $(findstring s,$(MAKEFLAGS)),\#,@echo)
|
||||
ECHO := $(if $(findstring s,$(MAKEFLAGS)),$(COMMENT),@echo)
|
||||
COMMON_DIR = .
|
||||
INSTALL_DBDS =
|
||||
INSTALL_DBS =
|
||||
@@ -223,58 +223,65 @@ $(INSTALL_DB)/%.template: %.template
|
||||
$(COMMON_DIR)/%Record.h: $(COMMON_DIR)/%Record.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $@
|
||||
$(DBTORECORDTYPEH) $(DBDFLAGS) $< $@
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTORECORDTYPEH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%Record.h: %Record.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $@
|
||||
$(DBTORECORDTYPEH) $(DBDFLAGS) $< $@
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTORECORDTYPEH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/menu%.h: $(COMMON_DIR)/menu%.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $@
|
||||
$(DBTOMENUH) $(DBDFLAGS) $< $@
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTOMENUH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/menu%.h: menu%.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $@
|
||||
$(DBTOMENUH) $(DBDFLAGS) $< $@
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTOMENUH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
.PRECIOUS: $(COMMON_DIR)/%.h
|
||||
|
||||
##################################################### DBD files
|
||||
|
||||
$(COMMON_DIR)/bpt%.dbd: bpt%.data
|
||||
@$(RM) $@
|
||||
$(MAKEBPT) $< $@
|
||||
$(MAKEBPT) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.dbd: $(COMMON_DIR)/%Include.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "Expanding dbd"
|
||||
@$(RM) $@
|
||||
@$(DBEXPAND) $(DBDFLAGS) -o $@ $<
|
||||
@$(RM) $(notdir $@)
|
||||
@$(DBEXPAND) $(DBDFLAGS) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%.dbd: %Include.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
$(ECHO) "$<:../Makefile" >> $(notdir $@)$(DEP)
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "Expanding dbd"
|
||||
@$(RM) $@
|
||||
$(DBEXPAND) $(DBDFLAGS) -o $@ $<
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBEXPAND) $(DBDFLAGS) -o $(notdir $@) $<
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(COMMON_DIR)/%Include.dbd:
|
||||
@$(RM) $@
|
||||
$(PERL) $(TOOLS)/makeIncludeDbd.pl $($*_DBD) $@
|
||||
@$(RM) $(notdir $@)
|
||||
$(PERL) $(TOOLS)/makeIncludeDbd.pl $($*_DBD) $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
|
||||
$(INSTALL_DBD)/%: $(COMMON_DIR)/%
|
||||
$(ECHO) "Installing created dbd file $@"
|
||||
@@ -302,8 +309,8 @@ $(COMMON_DIR)/%.db$(RAW): $(COMMON_DIR)/%.edf
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): %.substitutions
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
$(MAKEDBDEPENDS) $@ $< $(TEMPLATE_FILENAME) >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "$@:$(TEMPLATE_FILENAME)" >> $(notdir $@)$(DEP)
|
||||
@$(MAKEDBDEPENDS) $@ $< $(TEMPLATE_FILENAME) >> $(notdir $@)$(DEP)
|
||||
echo "$@ : $(TEMPLATE_FILENAME)" >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "Inflating database from $< $(TEMPLATE_FILENAME)"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) -S$< $(TEMPLATE_FILENAME) > $*.tmp
|
||||
|
||||
@@ -205,11 +205,6 @@ $(OBJLIBNAME):%$(OBJ):
|
||||
@$(RM) $@
|
||||
$(COMPILE.cpp) $(call PATH_FILTER,$<) $(COMPILE_FILTER.cpp)
|
||||
|
||||
%$(OBJ): %.C
|
||||
@$(HDEPENDS_CMD)
|
||||
@$(RM) $@
|
||||
$(COMPILE.cpp) $(call PATH_FILTER,$<) $(COMPILE_FILTER.cpp)
|
||||
|
||||
# WIN95/NT resource compiler
|
||||
%$(RES): %.rc
|
||||
@$(RM) $@
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
#
|
||||
@@ -13,73 +12,73 @@
|
||||
|
||||
include $(CONFIG)/RULES_DIRS
|
||||
|
||||
distclean: realclean cvsclean realuninstall
|
||||
|
||||
CVSCLEAN=$(firstword $(wildcard $(TOOLS)/cvsclean.pl $(TOP)/src/tools/cvsclean.pl))
|
||||
cvsclean:
|
||||
$(PERL) $(CVSCLEAN)
|
||||
|
||||
realuninstall: uninstallDirs
|
||||
$(RMDIR) $(INSTALL_LOCATION_BIN)
|
||||
$(RMDIR) $(INSTALL_LOCATION_LIB)
|
||||
|
||||
UNINSTALL_DIRS += $(INSTALL_DBD) $(INSTALL_INCLUDE) $(INSTALL_DOC)\
|
||||
$(INSTALL_HTML) $(INSTALL_JAVA) $(INSTALL_TEMPLATES) \
|
||||
$(INSTALL_DB)
|
||||
UNINSTALL_DIRS += $(DIRECTORY_TARGETS)
|
||||
uninstallDirs:
|
||||
$(RMDIR) $(UNINSTALL_DIRS)
|
||||
|
||||
uninstall: archuninstall uninstallDirs
|
||||
|
||||
archuninstall: $(addprefix uninstall$(DIVIDER),$(BUILD_ARCHS))
|
||||
@$(MAKE) -f Makefile cleandirs
|
||||
|
||||
uninstallArchTargets = $(foreach arch,$(BUILD_ARCHS), uninstall$(DIVIDER)$(arch))
|
||||
archPart = $(word 2, $(subst $(DIVIDER), ,$@))
|
||||
|
||||
$(uninstallArchTargets): uninstallDirs
|
||||
@$(RMDIR) $(INSTALL_LOCATION_BIN)/$(archPart) $(INSTALL_LOCATION_LIB)/$(archPart)
|
||||
uninstall$(DIVIDER)%:
|
||||
$(RMDIR) $(INSTALL_LOCATION_BIN)/$(archPart)
|
||||
$(RMDIR) $(INSTALL_LOCATION_LIB)/$(archPart)
|
||||
|
||||
cleandirs:
|
||||
ifeq ($(wildcard $(INSTALL_LOCATION_BIN)/*),)
|
||||
@$(RMDIR) $(INSTALL_LOCATION_BIN)
|
||||
$(RMDIR) $(INSTALL_LOCATION_BIN)
|
||||
endif
|
||||
ifeq ($(wildcard $(INSTALL_LOCATION_LIB)/*),)
|
||||
@$(RMDIR) $(INSTALL_LOCATION_LIB)
|
||||
$(RMDIR) $(INSTALL_LOCATION_LIB)
|
||||
endif
|
||||
@echo
|
||||
# The echo above stops a "nothing to be done for cleandirs" message
|
||||
|
||||
distclean: realclean realuninstall
|
||||
|
||||
CVSCLEAN=$(firstword $(wildcard $(TOOLS)/cvsclean.pl $(TOP)/src/tools/cvsclean.pl))
|
||||
|
||||
cvsclean:
|
||||
@$(PERL) $(CVSCLEAN)
|
||||
|
||||
realuninstall:
|
||||
@$(RMDIR) $(INSTALL_LOCATION_BIN) $(INSTALL_LOCATION_LIB)
|
||||
@$(RMDIR) $(UNINSTALL_DIRS)
|
||||
|
||||
uninstall: $(addprefix uninstall$(DIVIDER),$(BUILD_ARCHS))
|
||||
@$(MAKE) -f Makefile cleandirs
|
||||
|
||||
uninstallDirs:
|
||||
@$(RMDIR) $(UNINSTALL_DIRS)
|
||||
|
||||
help:
|
||||
@echo "Usage: gnumake [options] [target] ..."
|
||||
@echo "Targets supported by all Makefiles:"
|
||||
@echo " install - Builds and installs all targets (default rule)"
|
||||
@echo " all - Same as install"
|
||||
@echo " buildInstall - Same as install"
|
||||
@echo " all - Same as install (default rule)"
|
||||
@echo " inc - Installs header files"
|
||||
@echo " build - Builds and installs all targets"
|
||||
@echo " install - Builds and installs all targets"
|
||||
@echo " buildInstall - Same as install (deprecated)"
|
||||
@echo " clean - Removes the O.<arch> dirs created by running make"
|
||||
@echo " In O.<arch> dir, clean removes build created files"
|
||||
@echo " realclean - Removes ALL O.<arch> dirs"
|
||||
@echo " Cannot be used within an O.<arch> dir"
|
||||
@echo " rebuild - Same as clean install"
|
||||
@echo " inc - Installs header files"
|
||||
@echo " build - Builds all targets"
|
||||
@echo " archclean - Removes O.<arch> dirs but not O.Common dir"
|
||||
@echo "\"Partial\" build targets supported by Makefiles:"
|
||||
@echo " inc.<arch> - Installs <arch> only header files."
|
||||
@echo " build.<arch> - Builds and installs <arch> only."
|
||||
@echo " install.<arch> - Builds and installs <arch> only."
|
||||
@echo " clean.<arch> - Cleans <arch> binaries in O.<arch> dirs only."
|
||||
@echo " build.<arch> - Builds <arch> only."
|
||||
@echo " uninstall.<arch> - Remove bin & lib directories for <arch> only."
|
||||
@echo "Targets supported by top level Makefile:"
|
||||
@echo " uninstall - Cleans directories created by the install."
|
||||
@echo " archuninstall - Remove bin & lib directories created by this hostarch."
|
||||
@echo " uninstall - Remove install directories created by this hostarch."
|
||||
@echo " realuninstall - Removes ALL install dirs"
|
||||
@echo " distclean - Same as realclean realuninstall."
|
||||
@echo " distclean - Same as realclean cvsclean realuninstall."
|
||||
@echo " cvsclean - Removes cvs .#* files in all dirs of directory tree"
|
||||
@echo " help - Prints this list of valid make targets "
|
||||
@echo "Indiv. object targets are supported by O.<arch> level Makefile .e.g"
|
||||
@echo " xxxRecord.o"
|
||||
|
||||
.PHONY : $(uninstallArchTargets)
|
||||
.PHONY : uninstall help cleandirs distclean uninstallDirs realuninstall
|
||||
.PHONY : cvsclean
|
||||
.PHONY: cleandirs distclean cvsclean realuninstall archuninstall uninstallDirs
|
||||
.PHONY: uninstall help
|
||||
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
#
|
||||
# CONFIG.Common.RTEMS-beatnik
|
||||
# A migration from Eric Norum's CONFIG.Common.RTEMS-mvme5500
|
||||
# Author: Dayle Kotturi
|
||||
# SLAC
|
||||
# dayle@slac.stanford.edu
|
||||
# $Revision-Id$
|
||||
# Author: Dayle Kotturi <dayle@slac.stanford.edu>
|
||||
#
|
||||
# All RTEMS targets use the same Makefile fragment
|
||||
#
|
||||
override EXE=.elf
|
||||
EXE = .elf
|
||||
RTEMS_TARGET_CPU = powerpc
|
||||
GNU_TARGET=powerpc-rtems
|
||||
GNU_TARGET = powerpc-rtems
|
||||
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
|
||||
ARCH_DEP_CFLAGS += -DHAVE_MOTLOAD
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_MBUF_SPACE=2048
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_CLUSTER_SPACE=5120
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
MUNCH_SUFFIX = .boot
|
||||
MUNCHNAME = $(PRODNAME:%$(EXE)=%$(MUNCH_SUFFIX))
|
||||
@@ -19,16 +21,13 @@ define MUNCH_CMD
|
||||
$(RTEMS_TOOLS)/bin/$(OBJCOPY_FOR_TARGET) -O binary $< $@
|
||||
endef
|
||||
|
||||
CROSS_COMPILER_TARGET_ARCHS=RTEMS-beatnik
|
||||
|
||||
include $(CONFIG)/os/CONFIG.Common.RTEMS
|
||||
|
||||
RTEMSSYMS=$(PRODNAME:%$(EXE)=%.sym)
|
||||
RTEMSIMGS=$(PRODNAME:%$(EXE)=%.bin)
|
||||
INSTALL_RTEMSSYMS=$(RTEMSSYMS:%=$(INSTALL_BIN)/%)
|
||||
INSTALL_RTEMSIMGS=$(RTEMSIMGS:%=$(INSTALL_BIN)/%)
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
%.sym: %$(EXE)
|
||||
$(XSYMS) $^ $@
|
||||
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
#
|
||||
# CONFIG.Common.RTEMS-mvme3100
|
||||
# $Revision-Id$
|
||||
# Author: W. Eric Norum
|
||||
# Canadian Light Source
|
||||
# eric@cls.usask.ca
|
||||
# Author: W. Eric Norum <wenorum@lbl.gov>
|
||||
#
|
||||
# All RTEMS targets use the same Makefile fragment
|
||||
#
|
||||
EXE = .elf
|
||||
RTEMS_TARGET_CPU = powerpc
|
||||
GNU_TARGET = powerpc-rtems
|
||||
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
|
||||
ARCH_DEP_CFLAGS += -DHAVE_PPCBUG
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
MUNCH_SUFFIX = .boot
|
||||
MUNCHNAME = $(PRODNAME:%$(EXE)=%$(MUNCH_SUFFIX))
|
||||
define MUNCH_CMD
|
||||
@@ -24,6 +27,4 @@ define MUNCH_CMD
|
||||
rm -f rtems.gz
|
||||
endef
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
include $(CONFIG)/os/CONFIG.Common.RTEMS
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
#
|
||||
# CONFIG.Common.RTEMS-mvme3100
|
||||
# $Revision-Id$
|
||||
# Author: W. Eric Norum <wenorum@lbl.gov>
|
||||
#
|
||||
# All RTEMS targets use the same Makefile fragment
|
||||
#
|
||||
override EXE=.elf
|
||||
EXE = .elf
|
||||
RTEMS_TARGET_CPU = powerpc
|
||||
GNU_TARGET=powerpc-rtems
|
||||
GNU_TARGET = powerpc-rtems
|
||||
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
|
||||
ARCH_DEP_CFLAGS += -DHAVE_MOTLOAD
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_MBUF_SPACE=2048
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_CLUSTER_SPACE=5120
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
MUNCH_SUFFIX = .boot
|
||||
MUNCHNAME = $(PRODNAME:%$(EXE)=%$(MUNCH_SUFFIX))
|
||||
@@ -13,16 +21,13 @@ define MUNCH_CMD
|
||||
$(RTEMS_TOOLS)/bin/$(OBJCOPY_FOR_TARGET) -O binary $< $@
|
||||
endef
|
||||
|
||||
CROSS_COMPILER_TARGET_ARCHS=RTEMS-beatnik
|
||||
|
||||
include $(CONFIG)/os/CONFIG.Common.RTEMS
|
||||
|
||||
RTEMSSYMS=$(PRODNAME:%$(EXE)=%.sym)
|
||||
RTEMSIMGS=$(PRODNAME:%$(EXE)=%.bin)
|
||||
INSTALL_RTEMSSYMS=$(RTEMSSYMS:%=$(INSTALL_BIN)/%)
|
||||
INSTALL_RTEMSIMGS=$(RTEMSIMGS:%=$(INSTALL_BIN)/%)
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
%.sym: %$(EXE)
|
||||
$(XSYMS) $^ $@
|
||||
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
#
|
||||
# CONFIG.Common.RTEMS-mvme5500
|
||||
# $Revision-Id$
|
||||
# Author: W. Eric Norum
|
||||
# Advanced Photon Source
|
||||
# norume@aps.anl.gov
|
||||
# Author: W. Eric Norum <wenorum@lbl.gov>
|
||||
#
|
||||
# All RTEMS targets use the same Makefile fragment
|
||||
#
|
||||
EXE = .elf
|
||||
RTEMS_TARGET_CPU = powerpc
|
||||
GNU_TARGET = powerpc-rtems
|
||||
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
|
||||
ARCH_DEP_CFLAGS += -DHAVE_MOTLOAD
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_MBUF_SPACE=2048
|
||||
ARCH_DEP_CFLAGS += -DRTEMS_NETWORK_CONFIG_CLUSTER_SPACE=5120
|
||||
ARCH_DEP_CFLAGS += -DBSP_NVRAM_BASE_ADDR=0xf1110000
|
||||
|
||||
OP_SYS_LDLIBS += -lbspExt
|
||||
|
||||
MUNCH_SUFFIX = .boot
|
||||
MUNCHNAME = $(PRODNAME:%$(EXE)=%$(MUNCH_SUFFIX))
|
||||
define MUNCH_CMD
|
||||
|
||||
@@ -55,7 +55,7 @@ CCC = $(GNU_BIN)/c++
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Linker flags
|
||||
OP_SYS_LDFLAGS += -dynamic -Z -L$(SDK_DIR)/usr/lib
|
||||
OP_SYS_LDFLAGS += -dynamic -Z -L$(SDK_DIR)/usr/lib -L$(SDK_DIR)/usr/lib/system
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Shared libraries
|
||||
|
||||
@@ -51,8 +51,8 @@ OP_SYS_LDLIBS += $(STLPORT_LDLIBS_$(USE_STLPORT))
|
||||
|
||||
# OS libraries used when generating shared libraries or static binaries
|
||||
OP_SYS_LDLIBS += -lsocket -lnsl
|
||||
OP_SYS_LDLIBS_8 += -lCrun -lc
|
||||
OP_SYS_LDLIBS_9 += -lumem -lCrun -lc
|
||||
OP_SYS_LDLIBS_8 += -ldl -lCrun -lc
|
||||
OP_SYS_LDLIBS_9 += -ldl -lumem -lCrun -lc
|
||||
OP_SYS_LDLIBS_10 += -lumem -lCrun -lc
|
||||
OP_SYS_LDLIBS += $(OP_SYS_LDLIBS_$(SOLARIS_VERSION))
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ COMPILER_CPPFLAGS = -D_REENTRANT
|
||||
|
||||
STLPORT_LDLIBS_NO =
|
||||
|
||||
OP_SYS_LDLIBS_8 =
|
||||
OP_SYS_LDLIBS_9 =
|
||||
OP_SYS_LDLIBS_8 = -ldl
|
||||
OP_SYS_LDLIBS_9 = -ldl
|
||||
OP_SYS_LDLIBS_10 =
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@ OP_SYS_CFLAGS+=$(STLPORT_CFLAGS_$(USE_STLPORT))
|
||||
OP_SYS_LDFLAGS+=$(STLPORT_CFLAGS_$(USE_STLPORT))
|
||||
|
||||
OP_SYS_LDLIBS += -lsocket -lnsl
|
||||
OP_SYS_LDLIBS_8 += -lCrun -lc
|
||||
OP_SYS_LDLIBS_9 += -lCrun -lc
|
||||
OP_SYS_LDLIBS_8 += -ldl -lCrun -lc
|
||||
OP_SYS_LDLIBS_9 += -ldl -lCrun -lc
|
||||
OP_SYS_LDLIBS_10 += -lCrun -lc
|
||||
OP_SYS_LDLIBS += $(OP_SYS_LDLIBS_$(SOLARIS_VERSION))
|
||||
OP_SYS_LDLIBS += $(STLPORT_LDLIBS_$(USE_STLPORT))
|
||||
|
||||
@@ -14,7 +14,7 @@ COMPILER_CPPFLAGS = -D_REENTRANT
|
||||
|
||||
STLPORT_LDLIBS_NO =
|
||||
|
||||
OP_SYS_LDLIBS_8 = -lc
|
||||
OP_SYS_LDLIBS_9 = -lc
|
||||
OP_SYS_LDLIBS_8 = -ldl -lc
|
||||
OP_SYS_LDLIBS_9 = -ldl -lc
|
||||
OP_SYS_LDLIBS_10 = -lc
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
# CONFIG.Common.vxWorks-mpc8540
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for vxWorks-mpc8540 targets: MPC8540 CPU with >32MB RAM.
|
||||
# Site-specific overrides go in CONFIG_SITE.Common.vxWorks-mpc8540
|
||||
#
|
||||
# This file is maintained by the EPICS build community.
|
||||
# Definitions for vxWorks-mpc8540 target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.vxWorks-mpc8540
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks target archs
|
||||
|
||||
26
configure/os/CONFIG.Common.vxWorks-mpc8548
Normal file
26
configure/os/CONFIG.Common.vxWorks-mpc8548
Normal file
@@ -0,0 +1,26 @@
|
||||
# CONFIG.Common.vxWorks-mpc8548
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for vxWorks-mpc8548 target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.vxWorks-mpc8548
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks target archs
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorksCommon
|
||||
|
||||
# Vx GNU cross compiler suffix
|
||||
CMPLR_SUFFIX = ppc
|
||||
|
||||
ARCH_CLASS = ppc
|
||||
|
||||
# Architecture specific build flags
|
||||
ARCH_DEP_CPPFLAGS = -DCPU=PPC32
|
||||
ARCH_DEP_CFLAGS = -DCPU_VARIANT=_ppc85XX_e500v2
|
||||
ARCH_DEP_CFLAGS += -mlongcall
|
||||
|
||||
# This flag isn't present in early vxWorks 6.x versions
|
||||
#ARCH_DEP_CFLAGS += -te500v2
|
||||
|
||||
GNU_TARGET = powerpc-wrs-vxworks
|
||||
14
configure/os/CONFIG.Common.vxWorks-mpc8548-debug
Normal file
14
configure/os/CONFIG.Common.vxWorks-mpc8548-debug
Normal file
@@ -0,0 +1,14 @@
|
||||
# CONFIG.Common.vxWorks-mpc8548-debug
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for vxWorks-mpc8548-debug targets.
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.vxWorks-mpc8548-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks archs
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-mpc8548
|
||||
|
||||
CROSS_OPT = NO
|
||||
|
||||
24
configure/os/CONFIG.Common.vxWorks-ppc32
Normal file
24
configure/os/CONFIG.Common.vxWorks-ppc32
Normal file
@@ -0,0 +1,24 @@
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Definitions for vxWorks-ppc603 targets with >32MB of RAM
|
||||
# Site-specific overrides go in CONFIG_SITE.Common.vxWorks-ppc603_long
|
||||
#
|
||||
# This file is maintained by the EPICS build community.
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks target archs
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorksCommon
|
||||
|
||||
# Vx GNU cross compiler suffix
|
||||
CMPLR_SUFFIX = ppc
|
||||
|
||||
ARCH_CLASS = ppc
|
||||
|
||||
# Architecture specific build flags
|
||||
ARCH_DEP_CPPFLAGS = -DCPU=PPC32
|
||||
ARCH_DEP_CFLAGS = -mstrict-align
|
||||
|
||||
GNU_TARGET = powerpc-wrs-vxworks
|
||||
|
||||
# Tell compiler to generate long branches
|
||||
ARCH_DEP_CFLAGS += -mlongcall
|
||||
14
configure/os/CONFIG.Common.vxWorks-ppc32-debug
Normal file
14
configure/os/CONFIG.Common.vxWorks-ppc32-debug
Normal file
@@ -0,0 +1,14 @@
|
||||
# CONFIG.Common.vxWorks-ppc32-debug
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for vxWorks-ppc32-debug target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.vxWorks-ppc32-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks archs
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc32
|
||||
|
||||
CROSS_OPT = NO
|
||||
|
||||
13
configure/os/CONFIG.Common.vxWorks-ppc32sf
Normal file
13
configure/os/CONFIG.Common.vxWorks-ppc32sf
Normal file
@@ -0,0 +1,13 @@
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Definitions for vxWorks-ppc32sf targets
|
||||
# Site-specific overrides go in CONFIG_SITE.Common.vxWorks-ppc32sf
|
||||
#
|
||||
# This file is maintained by the EPICS build community.
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Inherit the settings from vxWorks-ppc32
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc32
|
||||
|
||||
# Tell compiler to use software floating-point
|
||||
ARCH_DEP_CFLAGS += -msoft-float
|
||||
14
configure/os/CONFIG.Common.vxWorks-ppc32sf-debug
Normal file
14
configure/os/CONFIG.Common.vxWorks-ppc32sf-debug
Normal file
@@ -0,0 +1,14 @@
|
||||
# CONFIG.Common.vxWorks-ppc32sf-debug
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for vxWorks-ppc32sf-debug target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.vxWorks-ppc32sf-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all vxWorks archs
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc32sf
|
||||
|
||||
CROSS_OPT = NO
|
||||
|
||||
@@ -159,7 +159,7 @@ export TOOL_FAMILY = GNU
|
||||
|
||||
#--------------------------------------------------
|
||||
# Operating system flags
|
||||
OP_SYS_CPPFLAGS += -DvxWorks
|
||||
OP_SYS_CPPFLAGS += -DvxWorks=vxWorks
|
||||
OP_SYS_CFLAGS += -fno-builtin
|
||||
|
||||
# Fix for vxWorks 5 headers that use macros defined in vxWorks.h but
|
||||
|
||||
@@ -8,10 +8,11 @@
|
||||
#-------------------------------------------------------
|
||||
|
||||
CP = $(PERL) -MExtUtils::Command -e cp
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
|
||||
CP = $(PERL) -MExtUtils::Command -e cp
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -8,10 +8,11 @@
|
||||
#-------------------------------------------------------
|
||||
|
||||
CP = $(PERL) -MExtUtils::Command -e cp
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -31,7 +31,9 @@ BAFCMD = bscmake /nologo /o $@
|
||||
# Configure OS vendor C compiler
|
||||
CC = cl
|
||||
|
||||
# Override CONFIG.gnuCommon for cross builds.
|
||||
GNU = NO
|
||||
HDEPENDS_METHOD = CMD
|
||||
|
||||
#
|
||||
# /W<N> use warning level N
|
||||
|
||||
@@ -13,3 +13,11 @@
|
||||
ARCH_CLASS = i386
|
||||
#ARCH_CLASS = x86_64
|
||||
#ARCH_CLASS = i386 x86_64
|
||||
|
||||
#
|
||||
# Uncomment the followings lines to build with CLANG instead of GCC.
|
||||
#
|
||||
#CC = clang
|
||||
#CCC = clang++
|
||||
#GNU_LDLIBS_YES =
|
||||
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
# iOS Version number
|
||||
|
||||
#IOS_VERSION = 3.2
|
||||
IOS_VERSION = 4.1
|
||||
#IOS_VERSION = 4.1
|
||||
IOS_VERSION = 4.3
|
||||
|
||||
|
||||
# Most sites will want shared libraries
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# CONFIG_SITE.Common.linux-cris
|
||||
#
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Site Specific definitions for linux-cris target
|
||||
# Only the local epics system manager should modify this file
|
||||
|
||||
@@ -15,9 +17,21 @@
|
||||
# c) Add the runtime path to /etc/ld.so.conf and run ldconfig
|
||||
# to inform the system of the shared library location.
|
||||
|
||||
# If readline is not installed comment the following line
|
||||
# to omit command-line editing and history support
|
||||
# Depending on your version of Linux you may want one of the following
|
||||
# lines to enable command-line editing and history in iocsh. If you're
|
||||
# not sure which, start with the top one and work downwards until the
|
||||
# build doesn't fail to link the readline library. If none of them work,
|
||||
# comment them all out to build without readline support.
|
||||
|
||||
# No other libraries needed (recent Fedora, Ubuntu etc.):
|
||||
#COMMANDLINE_LIBRARY = READLINE
|
||||
|
||||
# Needs -lncurses (RHEL 5 etc.):
|
||||
#COMMANDLINE_LIBRARY = READLINE_NCURSES
|
||||
|
||||
# Needs -lcurses (older versions)
|
||||
#COMMANDLINE_LIBRARY = READLINE_CURSES
|
||||
|
||||
|
||||
OP_SYS_CFLAGS += -g
|
||||
|
||||
|
||||
@@ -18,12 +18,19 @@
|
||||
# to inform the system of the shared library location.
|
||||
|
||||
# Depending on your version of Linux you'll want one of the following
|
||||
# lines to enable command-line editing and history support. If you're
|
||||
# lines to enable command-line editing and history in iocsh. If you're
|
||||
# not sure which, start with the top one and work downwards until the
|
||||
# build doesn't fail to link the readline library. If none of them
|
||||
# work, comment them all out.
|
||||
#COMMANDLINE_LIBRARY = READLINE
|
||||
COMMANDLINE_LIBRARY = READLINE_NCURSES
|
||||
# build doesn't fail to link the readline library. If none of them work,
|
||||
# comment them all out to build without readline support.
|
||||
|
||||
# No other libraries needed (recent Fedora, Ubuntu etc.):
|
||||
COMMANDLINE_LIBRARY = READLINE
|
||||
|
||||
# Needs -lncurses (RHEL 5 etc.):
|
||||
#COMMANDLINE_LIBRARY = READLINE_NCURSES
|
||||
|
||||
# Needs -lcurses (older versions)
|
||||
#COMMANDLINE_LIBRARY = READLINE_CURSES
|
||||
|
||||
|
||||
OP_SYS_CFLAGS += -g
|
||||
|
||||
@@ -18,12 +18,19 @@
|
||||
# to inform the system of the shared library location.
|
||||
|
||||
# Depending on your version of Linux you'll want one of the following
|
||||
# lines to enable command-line editing and history support. If you're
|
||||
# lines to enable command-line editing and history in iocsh. If you're
|
||||
# not sure which, start with the top one and work downwards until the
|
||||
# build doesn't fail to link the readline library. If none of them
|
||||
# work, comment them all out.
|
||||
# build doesn't fail to link the readline library. If none of them work,
|
||||
# comment them all out to build without readline support.
|
||||
|
||||
# No other libraries needed (recent Fedora, Ubuntu etc.):
|
||||
COMMANDLINE_LIBRARY = READLINE
|
||||
|
||||
# Needs -lncurses (RHEL 5 etc.):
|
||||
#COMMANDLINE_LIBRARY = READLINE_NCURSES
|
||||
|
||||
# Needs -lcurses (older versions)
|
||||
#COMMANDLINE_LIBRARY = READLINE_CURSES
|
||||
|
||||
|
||||
OP_SYS_CFLAGS += -g
|
||||
|
||||
6
configure/os/CONFIG_SITE.Common.vxWorks-mpc8548
Normal file
6
configure/os/CONFIG_SITE.Common.vxWorks-mpc8548
Normal file
@@ -0,0 +1,6 @@
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Site Specific definitions for the vxWorks-mpc8548 target
|
||||
#
|
||||
# Only the local epics system manager should modify this file
|
||||
#-------------------------------------------------------
|
||||
@@ -4,11 +4,21 @@
|
||||
<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 R3.14.12</title>
|
||||
<title>Known Problems in R3.14.12.1</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1 style="text-align: center">EPICS Base R3.14.12: Known Problems</h1>
|
||||
<h1 style="text-align: center">EPICS Base R3.14.12.1: Known Problems</h1>
|
||||
|
||||
<p>Any patch files linked below should be applied at the root of the
|
||||
base-3.14.12.1 tree. Download them, then use the GNU Patch program as
|
||||
follows:</p>
|
||||
|
||||
<blockquote><pre>% <b>cd <i>/path/to/</i>base-3.14.12.1</b>
|
||||
% <b>patch -p0 < <i>/path/to/</i>file.patch</b></pre></blockquote>
|
||||
|
||||
<p>The following significant problems have been reported with this
|
||||
version of EPICS Base:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
|
||||
@@ -3,15 +3,357 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<title>EPICS Base R3.14.12 Release Notes</title>
|
||||
<title>EPICS Base R3.14.12.2-pre1 Release Notes</title>
|
||||
</head>
|
||||
|
||||
<body lang="en">
|
||||
<h1 align="center">EPICS Base Release 3.14.12</h1>
|
||||
<h1 align="center">EPICS Base Release 3.14.12.2-pre1</h1>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2-pre1</h2>
|
||||
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h4>Launchpad Bugs Resolved</h4>
|
||||
|
||||
<p>The following are links to bugs in the Launchpad bug tracker that have been
|
||||
fixed in this release:</p>
|
||||
|
||||
<ul>
|
||||
<li>697509
|
||||
<a href="https://launchpad.net/bugs/697509">
|
||||
Thread synchronization issue in libCom/osi/os/WIN32/osdTime.cpp</a></li>
|
||||
<li>697516
|
||||
<a href="https://launchpad.net/bugs/697516">
|
||||
Crash occurs in Com.dll if filetime is before the EPICS epoch </a></li>
|
||||
<li>697517
|
||||
<a href="https://launchpad.net/bugs/697517">
|
||||
WIN32 osdtime should handle the system time change properly</a></li>
|
||||
<li>697519
|
||||
<a href="https://launchpad.net/bugs/697519">
|
||||
The incorrect way to compute the roll-over in WIN32 osdTime.cpp</a></li>
|
||||
<li>736273
|
||||
<a href="https://launchpad.net/bugs/736273">
|
||||
nonstandard c++ mutable ref in cac</a></li>
|
||||
<li>786979
|
||||
<a href="https://launchpad.net/bugs/786979">
|
||||
incorrect ref counting for timer queues</a></li>
|
||||
<li>794749
|
||||
<a href="https://launchpad.net/bugs/794749">
|
||||
3.14.12 caget without -c always requests maximum element count</a></li>
|
||||
<li>816678
|
||||
<a href="https://launchpad.net/bugs/816678">
|
||||
g++ generic thunk generation fails virtual varargs</a></li>
|
||||
<li>831648
|
||||
<a href="https://launchpad.net/bugs/831648">
|
||||
RTEMS dynamically loaded app fails to execute osdTimeRegister</a></li>
|
||||
<li>835138
|
||||
<a href="https://launchpad.net/bugs/835138">
|
||||
Incorrect calculation oss priorities for posix threads</a></li>
|
||||
<li>861214
|
||||
<a href="https://launchpad.net/bugs/861214">
|
||||
epicsThreadOnce crashes in static object destructor on win32</a></li>
|
||||
<li>861627
|
||||
<a href="https://launchpad.net/bugs/861627">
|
||||
RULES.db has incorrect dbExpand flags</a></li>
|
||||
<li>878372
|
||||
<a href="https://launchpad.net/bugs/878372">
|
||||
in-memory channel, ca client subscribe isnt thread safe</a></li>
|
||||
<li>878387
|
||||
<a href="https://launchpad.net/bugs/878387">
|
||||
In memory channel clear fails from put callback function</a></li>
|
||||
</ul>
|
||||
|
||||
<h4>Added database sanity checks to iocInit</h4>
|
||||
|
||||
<p>Two menus may legitimately be modified by users; some checks have been added
|
||||
that run at iocInit and make sure the choices haven't been changed too much for
|
||||
the IOC to function properly:</p>
|
||||
|
||||
<ul>
|
||||
<li><tt>menuConvert</tt> is checked to flag problems with IOCs converted from
|
||||
3.13.x, where the SLOPE choice didn't exist.</p>
|
||||
<li><tt>menuScan</tt> is checked to ensure the three initial choices are still
|
||||
present and that there is at least one periodic scan rate.</li>
|
||||
</ul>
|
||||
|
||||
<h4>Fix various catools issues</h4>
|
||||
|
||||
<p>Array handling in the caget and camonitor programs has been debugged, fixing
|
||||
<a href="https://bugs.launchpad.net/bugs/794749">launchpad bug 794749</a> along
|
||||
with a few other related issues dating back to the addition of variable length
|
||||
array support.</p>
|
||||
|
||||
<h4>Another race condition in errlog cleaned up</h4>
|
||||
|
||||
<p>If it was still busy when the IOC was closed down, the errlog thread could
|
||||
have preempted the exit handler and freed the various internal pvtData mutex and
|
||||
event objects too soon.</p>
|
||||
|
||||
<h4>Top-level make target changes</h4>
|
||||
|
||||
<p>Several make targets have been changed. Note that these can only be used from
|
||||
an application's <top> directory.</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>make uninstall.<arch></code></dt>
|
||||
<dd>Deletes the bin/<arch> and lib/<arch> directories for
|
||||
<arch> only. Note that <arch> does not have to be an
|
||||
architecture that this host is configured to build, it works for any
|
||||
arch.</dd>
|
||||
|
||||
<dt><code>make archuninstall</code></dt>
|
||||
<dd>Deletes the bin/<arch> and lib/<arch> directories for all
|
||||
architectures that this host is configured to build. Should not affect files
|
||||
used for multiple architectures, or for host or target architectures that
|
||||
this host is not configured to build.</dd>
|
||||
|
||||
<dt><code>make uninstall</code></dt>
|
||||
<dd>Does archuninstall and also deletes the other install directories include,
|
||||
db, dbd, doc, html, templates and java. This will affect subsequent builds
|
||||
for other architectures, but it doesn't delete their bin/<arch> or
|
||||
lib/<arch> contents.</dd>
|
||||
|
||||
<dt><code>make realuninstall</code></dt>
|
||||
<dd>Deletes all install directories for all architectures.</dd>
|
||||
|
||||
<dt><code>make distclean</code></dt>
|
||||
<dd>Does realclean realuninstall as before, and also now does a cvsclean,
|
||||
which removes file remnants from CVS operations named <code>.#*</code> and
|
||||
editor backups named <code>*~</code> throughout the source tree.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h4>Compress record type</h4>
|
||||
|
||||
<p>This record now posts monitors on its NUSE field whenever its value changes.
|
||||
A new field OUSE was added to support this.</p>
|
||||
|
||||
<h4>Remove C++ build rule for <code>.C</code> files</h4>
|
||||
|
||||
<p>An early convention on Unix systems was to name C++ files with an upper-case
|
||||
extention, <code>.C</code>. This does not work on Windows or MacOS where the
|
||||
filesystems are case-insensitive, and the C++ build rule was causing problems so
|
||||
has been eliminated. Any remaining C++ source files that are still using this
|
||||
convention will have to be renamed, preferably to <code>.cpp</code></p>
|
||||
|
||||
<h4>Support <code>make -s</code> on Windows</h4>
|
||||
|
||||
<p>The flag to silence build output did not work on some Windows architecture
|
||||
combinations. This has now been fixed.</p>
|
||||
|
||||
<h4>iocLogServer now supports logrotate</h4>
|
||||
|
||||
<p>The feature in the iocLogServer that closed and reopened the logfile used to
|
||||
ignore the SIGHUP signal when the log filename did not change. This has now been
|
||||
changed so these logfiles can be used with the standard Linux logrotate
|
||||
package.</p>
|
||||
|
||||
|
||||
<h2 align="center">Changes between 3.14.12 and 3.14.12.1</h2>
|
||||
|
||||
<p>This release only contains changes that fix bugs or add build configuration
|
||||
files for new or updated target architectures. No functionality has been
|
||||
changed, and as this is a patch release the software has not gone through as
|
||||
rigorous a testing regime as it does for a normal minor release.</p>
|
||||
|
||||
<h4>Launchpad Bugs Resolved</h4>
|
||||
|
||||
<p>The following are links to bugs in the Launchpad bug tracker that have been
|
||||
fixed in this release:</p>
|
||||
|
||||
<ul>
|
||||
<li>693534
|
||||
<a href="https://launchpad.net/bugs/693534">
|
||||
errlog causes crash on IOC exit</a></li>
|
||||
<li>701673
|
||||
<a href="https://launchpad.net/bugs/701673">
|
||||
Large array problem in 3.14.12</a></li>
|
||||
<li>717252
|
||||
<a href="https://launchpad.net/bugs/771252">
|
||||
local caput causes ioc crash on win32</a></li>
|
||||
<li>750549
|
||||
<a href="https://launchpad.net/bugs/750549 ">
|
||||
epicsTime has non-portable c++ static initialization</a></li>
|
||||
<li>753137
|
||||
<a href="https://launchpad.net/bugs/753137">
|
||||
Makefile dependency checking of database files is broken</a></li>
|
||||
</ul>
|
||||
|
||||
<h4>New/Updated target architectures</h4>
|
||||
|
||||
<p>The following target architectures have been added or updated:</p>
|
||||
|
||||
<dl>
|
||||
<dt>vxWorks-mpc8548</dt>
|
||||
<dt>vxWorks-mpc8548-debug</dt>
|
||||
<dd style="margin-bottom: 1ex">This PowerPC CPU is used on the Emerson MVME4100
|
||||
VME CPU board (from Ernest Williams, SLAC).</dd>
|
||||
|
||||
<dt>vxWorks-ppc32</dt>
|
||||
<dt>vxWorks-ppc32sf</dt>
|
||||
<dt>vxWorks-ppc32-debug</dt>
|
||||
<dt>vxWorks-ppc32sf-debug</dt>
|
||||
<dd style="margin-bottom: 1ex">New generic 32-bit PowerPC targets for vxWorks
|
||||
6.x, using hardware or software floating-point. These targets can be used
|
||||
instead of the CPU-specific ppc603, ppc604, mpc8540 and mpc8548 targets (and
|
||||
their _long alternatives, these targets are all compiled with the -mlongcall
|
||||
flag) to reduce the number of distinct build targets needed when supporting
|
||||
multiple PowerPC board types.</dd>
|
||||
|
||||
<dt>ios-386</dt>
|
||||
<dt>ios-arm</dt>
|
||||
<dd style="margin-bottom: 1ex">Updated for iOS 4.3, which is now the default OS
|
||||
version (from Tom Palaia, ORNL).</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h4>IOCSH_STARTUP_SCRIPT environment variable</h4>
|
||||
|
||||
<p>The function <tt>iocsh(const char *pathname)</tt> now sets the environment
|
||||
variable <tt>IOCSH_STARTUP_SCRIPT</tt> to the value of its pathname
|
||||
argument before it starts executing the script commands.</p>
|
||||
|
||||
<h4>RTEMS-mvme5500</h4>
|
||||
|
||||
<p>This target now automatically links binary files with the bspExt library, and
|
||||
adds the extension <tt>.elf</tt> to their filenames, matching the other mvme
|
||||
targets.</p>
|
||||
|
||||
<h4>RTEMS Network Buffer Configuration</h4>
|
||||
|
||||
<p>Add the macros <tt>RTEMS_NETWORK_CONFIG_MBUF_SPACE</tt> and
|
||||
<tt>RTEMS_NETWORK_CONFIG_MBUF_SPACE</tt> to rtems_netconfig.c to allow
|
||||
customization of the network buffer space allocated. The configuration files
|
||||
for the RTEMS-mvme3100, RTEMS-mvme5500 and RTEMS-beatnik targets now default to
|
||||
allocating 2MB for mbufs and 5MB for clusters; other RTEMS targets will continue
|
||||
to use 180KB and 350KB rspectively.</p>
|
||||
|
||||
<h4>RTEMS TFTP filesystem</h4>
|
||||
|
||||
<p>Use the new mount API to initialize TFTP on newer RTEMS versions.</p>
|
||||
|
||||
<h4>C++ build issues on older Solaris compiler</h4>
|
||||
|
||||
<p>Dirk Zimoch reported some problems building with an older SUNWspro C++
|
||||
compiler which have been resolved where possible.</p>
|
||||
|
||||
<h4>FreeBSD broadcast problem</h4>
|
||||
|
||||
<p>The <tt>ifreq_size</tt> macro in freebsd/osdsock.h must be different in BSD
|
||||
4.4.</p>
|
||||
|
||||
<h4>Thread exit synchronization</h4>
|
||||
|
||||
<p>When finished waiting for a thread to exit, signal the event in case other
|
||||
threads are waiting also.</p>
|
||||
|
||||
<h4>Win32 osdTime provider fix</h4>
|
||||
|
||||
<p>Jeff Hill fixed the last time compare in PLL drift factor update loop.</p>
|
||||
|
||||
<h4>Errlog can lose messages</h4>
|
||||
|
||||
<p>Systems that generate large numbers of errlog messages or have a slow message
|
||||
listener could overwrite older messages in the message buffer after the buffer
|
||||
wraps. This also corrects and annotates the test code to describe what's being
|
||||
checked.</p>
|
||||
|
||||
<p>When the IOC is shutting down, the errlog thread should process all queued
|
||||
messages before it quits.</p>
|
||||
|
||||
<h4>Back-slash escapes for Win32</h4>
|
||||
|
||||
<p>Stephen Norum pointed out the need for various Perl scripts to escape
|
||||
back-slash characters in Windows file paths.</p>
|
||||
|
||||
<h4>catools on Windows</h4>
|
||||
|
||||
<p>Windows 7 does not properly support line-mode buffering of stdio streams; the
|
||||
catools programs used this mode to ensure that they could be used in pipelines,
|
||||
but in Windows 7 they became fully buffered and are not flushed when the program
|
||||
exits, so buffering of stdout has now been completely disabled on Windows.</p>
|
||||
|
||||
|
||||
<h2 align="center">Changes between 3.14.11 and 3.14.12</h2>
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h4>Launchpad Bugs Resolved</h4>
|
||||
|
||||
<p>The following are links to bugs in the Launchpad bug tracker that have been
|
||||
fixed in this release:</p>
|
||||
|
||||
<ul>
|
||||
<li>541258
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/541258">
|
||||
compiler warnings in base</a></li>
|
||||
<li>541264
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/541264">
|
||||
CA subscription element count is fixed - eliminates compressed video
|
||||
option</a></li>
|
||||
<li>541331
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/541331">
|
||||
Several devLib routines don't use vector table</a></li>
|
||||
<li>541391
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/541391">
|
||||
when subscribing for zero elements, array element count should be
|
||||
dynamic</a></li>
|
||||
<li>545385
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/545385">
|
||||
SIGFPE calculating epicsNAN, epicsINF</a></li>
|
||||
<li>546991
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/546991">
|
||||
prev. value fields not initialized in init_record</a></li>
|
||||
<li>551909
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/551909">
|
||||
macExpandString writes out of boundary</a></li>
|
||||
<li>552803
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/552803">
|
||||
Compress record segfaults on ALG (algorithm) change</a></li>
|
||||
<li>571121
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/571121">
|
||||
Perl issue compiling with INSTALL_LOCATION set</a></li>
|
||||
<li>572589
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/572589">
|
||||
Make dbl emit empty strings for non-existent fields</a></li>
|
||||
<li>595154
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/595154">
|
||||
C++ errors building base using cygwin1.7</a></li>
|
||||
<li>595240
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/595240">
|
||||
C code uses C++ keywords as variable names</a></li>
|
||||
<li>595242
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/595242">
|
||||
C code uses C++ "//" style comments</a></li>
|
||||
<li>615916
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/615916">
|
||||
Bug in RULES.Db breaks parallel make when using MSI</a></li>
|
||||
<li>625034
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/625034">
|
||||
Remove compiler checks for VMS in src/toolsComm/flex</a></li>
|
||||
<li>626848
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/626848">
|
||||
Build with GNU make 3.82 fails when installing libraries</a></li>
|
||||
<li>626859
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/626859">
|
||||
RTEMS build does not create .d dependancy files</a></li>
|
||||
<li>627511
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/627511">
|
||||
MSVC linker fails if input lib dirs start with forward slash</a></li>
|
||||
<li>644263
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/644263">
|
||||
EPICS softIOC always dies in response to SIGHUP</a></li>
|
||||
<li>650000
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/650000">
|
||||
caput tool won't write to mbbo w/o state strings</a></li>
|
||||
<li>663875
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/663875">
|
||||
NTP broadcasts break NTP synchronization (RTEMS)</a></li>
|
||||
<li>667384
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/667384">
|
||||
are the request and response bytes pending reversed in casr?</a></li>
|
||||
<li>680702
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/680702">
|
||||
calc and calcout record get_precision bug</a></li>
|
||||
</ul>
|
||||
|
||||
<h4>Support for Cygwin 1.7</h4>
|
||||
|
||||
@@ -26,8 +368,8 @@ installation.</p>
|
||||
|
||||
<p>epicsEvent is now explicitly required to act as a simple binary semaphore.
|
||||
A single epicsEventSignal call must awaken just one thread when multiple
|
||||
threads are waiting for the event. A test thats checks for this has been
|
||||
added to epicsEventTest and the application developers guide is being updated
|
||||
threads are waiting for the event. A test that checks for this has been
|
||||
added to epicsEventTest and the Application Developer's Guide has been updated
|
||||
to describe this requirement.</p>
|
||||
|
||||
<h4>Enable array puts to subArray records</h4>
|
||||
@@ -110,8 +452,8 @@ connections over ssh. See the CA reference manual for more details.</p>
|
||||
<h4>Record Types aai and aao</h4>
|
||||
|
||||
<ul>
|
||||
<li>Fixed bug in memory allocation that caused crashes when linking other records
|
||||
to aai or aao.</li>
|
||||
<li>Fixed bug in memory allocation that caused crashes when linking other
|
||||
records to aai or aao.</li>
|
||||
<li>Fixed bug where NELM was modified instead of NORD.</li>
|
||||
<li>Added Soft Channel device support.</li>
|
||||
<li>Added SIOL link and proper simulation mode for Soft Channel support.</li>
|
||||
@@ -139,19 +481,20 @@ macro <tt>NO_DEVLIB_COMPAT</tt> is defined.</li>
|
||||
<li>The "virtual os" table was renamed from <tt>pdevLibVirtualOS</tt> to
|
||||
<tt>pdevLibVME</tt> reflecting the fact that other bus types will need seperate
|
||||
tables.</li>
|
||||
<li>The "virtual os" table API has been moved to a seperate header file,
|
||||
<li>The "virtual os" table API has been moved to a different header file,
|
||||
<tt>devLibVMEImpl.h</tt>.</li>
|
||||
</ul>
|
||||
|
||||
<h4>DTYP and INP/OUT order</h4>
|
||||
|
||||
<p>The fields DTYP and INP/OUT can now be specified in any order.</p>
|
||||
<p>The fields DTYP and INP/OUT can now be specified in any order in a database
|
||||
instance (.db) file.</p>
|
||||
|
||||
<h4>Rewrite epicsThreadOnce()</h4>
|
||||
|
||||
<p>Michael Davidsaver suggested a better implementation of epicsThreadOnce()
|
||||
which makes it possible for all architectures to detect recursive initialization
|
||||
functions. This change also renames the routines to remove the original macro
|
||||
functions. This change also renames the routines to remove the original macro,
|
||||
and fixes some questionable usage in places.</p>
|
||||
|
||||
<h4>Many Record Types</h4>
|
||||
@@ -162,7 +505,7 @@ giving correct initial monitor behavior in some circumstances.</p>
|
||||
|
||||
<h4>Compress Record Type</h4>
|
||||
|
||||
<p>Fixed crash when ALG (algorithm) was changed to Average at runtime.</p>
|
||||
<p>Fixed a crash when ALG (algorithm) was changed to Average at runtime.</p>
|
||||
|
||||
<h4>configure/RELEASE Enhancements</h4>
|
||||
|
||||
@@ -174,9 +517,11 @@ definition is expanded. The variable <tt>EPICS_HOST_ARCH</tt> can now be used,
|
||||
but target-architecture-specific values must be set in a target-specific
|
||||
<tt>configure/RELEASE</tt> file such as <tt>RELEASE.Common.linux-x86</tt>.</p>
|
||||
|
||||
<h4>VxWorks 6.7 support</h4>
|
||||
<h4>VxWorks 6.7 and 6.8 support</h4>
|
||||
|
||||
<p>Added build support for the latest Wind River release.</p>
|
||||
<p>Added build support for the latest Wind River releases. This does not
|
||||
include the ability to run on SMP vxWorks systems though, those will need some
|
||||
more extensive modifications.</p>
|
||||
|
||||
<h4>RTEMS 4.10 support</h4>
|
||||
|
||||
@@ -188,7 +533,7 @@ is used.</p>
|
||||
|
||||
<p>Changes to the way in which we generate header dependency files, which are
|
||||
now named with a <tt>.d</tt> suffix instead of <tt>.depends</tt>. We now use
|
||||
the compiler to generate these if possible, and create them in the
|
||||
the compiler to generate these where possible, and create them in the
|
||||
<tt>O.$(T_A)</tt> directory.</p>
|
||||
|
||||
<h4>Installed file permissions</h4>
|
||||
@@ -210,7 +555,11 @@ server.</p>
|
||||
readline; some need <tt>-lcurses</tt>, others <tt>-lncurses</tt> and others
|
||||
don't require either. The <tt>configure/os/CONFIG_SITE.Common.linux-*</tt>
|
||||
files now make this configuration easy to choose between different settings for
|
||||
the <tt>COMMANDLINE_LIBRARY</tt> variable.</p>
|
||||
the <tt>COMMANDLINE_LIBRARY</tt> variable. If your build fails as it's trying
|
||||
to create the <tt>antelope</tt> binary in the Base directory
|
||||
<tt>src/toolsComm/antelope/O.<i>arch</i></tt> this is almost certainly the
|
||||
problem. You will need to do a <tt>make rebuild</tt> from the top of Base after
|
||||
fixing the setting of <tt>COMMANDLINE_LIBRARY</tt>.</p>
|
||||
|
||||
<h4>CA Command Line Tools Changes</h4>
|
||||
|
||||
|
||||
@@ -12,15 +12,14 @@ include $(TOP)/configure/CONFIG
|
||||
|
||||
INC += epicsRtemsInitHooks.h
|
||||
|
||||
SRCS += rtems_init.c
|
||||
SRCS += rtems_config.c
|
||||
SRCS += rtems_netconfig.c
|
||||
SRCS += rtems_util.c
|
||||
SRCS += setBootConfigFromNVRAM.c
|
||||
SRCS += epicsRtemsInitHookPre.c
|
||||
SRCS += epicsRtemsInitHookPost.c
|
||||
rtemsCom_SRCS += rtems_init.c
|
||||
rtemsCom_SRCS += rtems_config.c
|
||||
rtemsCom_SRCS += rtems_netconfig.c
|
||||
rtemsCom_SRCS += rtems_util.c
|
||||
rtemsCom_SRCS += setBootConfigFromNVRAM.c
|
||||
rtemsCom_SRCS += epicsRtemsInitHookPre.c
|
||||
rtemsCom_SRCS += epicsRtemsInitHookPost.c
|
||||
|
||||
LIBRARY_RTEMS = rtemsCom
|
||||
LIBRARY_SRCS = $(SRCS) $(BUILD_ARCHS)
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
@@ -209,7 +209,17 @@ initialize_remote_filesystem(char **argv, int hasLocalFilesystem)
|
||||
{
|
||||
#ifdef OMIT_NFS_SUPPORT
|
||||
printf ("***** Initializing TFTP *****\n");
|
||||
#if __RTEMS_MAJOR__>4 || \
|
||||
(__RTEMS_MAJOR__==4 && __RTEMS_MINOR__>9) || \
|
||||
(__RTEMS_MAJOR__==4 && __RTEMS_MINOR__==9 && __RTEMS_REVISION__==99)
|
||||
mount_and_make_target_path(NULL,
|
||||
"/TFTP",
|
||||
RTEMS_FILESYSTEM_TYPE_TFTPFS,
|
||||
RTEMS_FILESYSTEM_READ_WRITE,
|
||||
NULL);
|
||||
#else
|
||||
rtems_bsdnet_initialize_tftp_filesystem ();
|
||||
#endif
|
||||
if (!hasLocalFilesystem) {
|
||||
char *path;
|
||||
int pathsize = 200;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Saskatchewan
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
@@ -93,6 +92,17 @@ static struct rtems_bsdnet_ifconfig bsp_driver_config = {
|
||||
# define MY_DO_BOOTP rtems_bsdnet_do_bootp
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Allow site- and BSP-specific network buffer space configuration.
|
||||
* The macro values are specified in KBytes.
|
||||
*/
|
||||
#ifndef RTEMS_NETWORK_CONFIG_MBUF_SPACE
|
||||
# define RTEMS_NETWORK_CONFIG_MBUF_SPACE 180
|
||||
#endif
|
||||
#ifndef RTEMS_NETWORK_CONFIG_CLUSTER_SPACE
|
||||
# define RTEMS_NETWORK_CONFIG_CLUSTER_SPACE 350
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Network configuration
|
||||
*/
|
||||
@@ -104,8 +114,8 @@ struct rtems_bsdnet_config rtems_bsdnet_config = {
|
||||
/* EPICS scan thread. */
|
||||
/* If non-zero then the network daemons will run */
|
||||
/* at this *RTEMS* priority */
|
||||
180*1024, /* MBUF space */
|
||||
350*1024, /* MBUF cluster space */
|
||||
RTEMS_NETWORK_CONFIG_MBUF_SPACE*1024,
|
||||
RTEMS_NETWORK_CONFIG_CLUSTER_SPACE*1024,
|
||||
NULL, /* Host name */
|
||||
MY_DOMAINNAME, /* Domain name */
|
||||
};
|
||||
|
||||
@@ -133,12 +133,13 @@ motScriptParm(const char *mot_script_boot, char parm)
|
||||
int l;
|
||||
|
||||
while (*mot_script_boot != '\0') {
|
||||
if (isspace(*mot_script_boot)
|
||||
if (isspace(*(unsigned char *)mot_script_boot)
|
||||
&& (*(mot_script_boot+1) == '-')
|
||||
&& (*(mot_script_boot+2) == parm)) {
|
||||
mot_script_boot += 3;
|
||||
cp = mot_script_boot;
|
||||
while ((*mot_script_boot != '\0') && !isspace(*mot_script_boot))
|
||||
while ((*mot_script_boot != '\0') &&
|
||||
!isspace(*(unsigned char *)mot_script_boot))
|
||||
mot_script_boot++;
|
||||
l = mot_script_boot - cp;
|
||||
ret = malloc(l+1);
|
||||
|
||||
@@ -22,7 +22,8 @@ DBD += bptTypeKdegF.dbd
|
||||
|
||||
PROD_LIBS = Com
|
||||
PROD_HOST += makeBpt
|
||||
makeBpt_SRCS=makeBpt
|
||||
|
||||
makeBpt_SRCS = makeBpt
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ $Date$</span></small></p>
|
||||
|
||||
<h3>Why Reconfigure Channel Access</h3>
|
||||
|
||||
<p>Typically reasons to reconfigure EPICS Channel Access:</p>
|
||||
<p>Typical reasons to reconfigure EPICS Channel Access:</p>
|
||||
<ul>
|
||||
<li>Two independent control systems must share a network without fear of
|
||||
interaction</li>
|
||||
@@ -1322,7 +1322,7 @@ the output.</p>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-s</td>
|
||||
<td>Get value as string (may honour server-side precision)</td>
|
||||
<td>Get value as string (honors server-side precision)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-lx</td>
|
||||
@@ -1466,7 +1466,7 @@ the output.</p>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-s</td>
|
||||
<td>Get value as string (may honour server-side precision)</td>
|
||||
<td>Get value as string (honors server-side precision)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-lx</td>
|
||||
@@ -4359,7 +4359,7 @@ that use ca_context_destroy).</p>
|
||||
<p><a href="#ca_context_destroy">ca_context_destroy</a>()</p>
|
||||
|
||||
<h3><code><a name="ca_dump_dbr">ca_dump_dbr()</a></code></h3>
|
||||
<pre>void ca_dump_dbr (chtype TYPE, unsigned COUNT, const void * PDBR);</pre>
|
||||
<code><pre>void ca_dump_dbr (chtype TYPE, unsigned COUNT, const void * PDBR);</pre></code>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ PROD_LIBS = ca Com
|
||||
PROD_SYS_LIBS_WIN32 = ws2_32 advapi32 user32
|
||||
|
||||
PROD_HOST += caRepeater catime acctst caConnTest casw caEventRate
|
||||
OBJS_IOC_vxWorks += catime acctst caConnTest casw caEventRate
|
||||
OBJS_IOC += catime acctst caConnTest casw caEventRate acctstRegister
|
||||
caRepeater_SRCS = caRepeater.cpp
|
||||
catime_SRCS = catimeMain.c catime.c
|
||||
acctst_SRCS = acctstMain.c acctst.c
|
||||
|
||||
257
src/ca/acctst.c
257
src/ca/acctst.c
@@ -10,6 +10,10 @@
|
||||
|
||||
/*
|
||||
* CA regression test
|
||||
* Authors:
|
||||
* Jeff Hill
|
||||
* Murali Shankar - initial versions of verifyMultithreadSubscr
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -26,6 +30,8 @@
|
||||
*/
|
||||
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
|
||||
#include "epicsAssert.h"
|
||||
#include "epicsMutex.h"
|
||||
#include "epicsEvent.h"
|
||||
#include "epicsTime.h"
|
||||
#include "dbDefs.h"
|
||||
#include "envDefs.h"
|
||||
@@ -2719,6 +2725,186 @@ void fdRegCB ( void * parg, int fd, int opened )
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
char m_chanName[100u];
|
||||
struct ca_client_context * m_pCtx;
|
||||
chid m_chan;
|
||||
epicsMutexId m_mutex;
|
||||
epicsEventId m_testCompleteEvent;
|
||||
epicsEventId m_threadExitEvent;
|
||||
size_t m_nUpdatesReceived;
|
||||
size_t m_nUpdatesRequired;
|
||||
int m_testInitiated;
|
||||
int m_testComplete;
|
||||
unsigned m_interestLevel;
|
||||
} MultiThreadSubscrTest;
|
||||
|
||||
static void testMultithreadSubscrSubscrCallback
|
||||
( struct event_handler_args eha )
|
||||
{
|
||||
const epicsEventId firstUpdateEvent = ( epicsEventId ) eha.usr;
|
||||
epicsEventSignal ( firstUpdateEvent );
|
||||
}
|
||||
|
||||
static void testMultithreadSubscrCreateSubscr ( void * pParm )
|
||||
{
|
||||
static unsigned nElem = 0;
|
||||
int testComplete = FALSE;
|
||||
evid id;
|
||||
epicsEventId firstUpdateEvent;
|
||||
epicsEventWaitStatus eventWaitStatus;
|
||||
MultiThreadSubscrTest * const pMultiThreadSubscrTest =
|
||||
( MultiThreadSubscrTest * ) pParm;
|
||||
|
||||
/* this is required for the ca_flush below to work correctly */
|
||||
int status = ca_attach_context ( pMultiThreadSubscrTest->m_pCtx );
|
||||
verify ( status == ECA_NORMAL );
|
||||
firstUpdateEvent = epicsEventMustCreate ( epicsEventEmpty );
|
||||
verify ( firstUpdateEvent );
|
||||
status = ca_create_subscription (
|
||||
DBR_TIME_LONG,
|
||||
nElem,
|
||||
pMultiThreadSubscrTest->m_chan,
|
||||
DBE_VALUE,
|
||||
testMultithreadSubscrSubscrCallback,
|
||||
firstUpdateEvent,
|
||||
& id );
|
||||
verify ( status == ECA_NORMAL );
|
||||
status = ca_flush_io ();
|
||||
verify ( status == ECA_NORMAL );
|
||||
/* wait for first update */
|
||||
eventWaitStatus = epicsEventWaitWithTimeout (
|
||||
firstUpdateEvent, 60.0 * 10 );
|
||||
verify ( eventWaitStatus == epicsEventWaitOK );
|
||||
epicsEventDestroy ( firstUpdateEvent );
|
||||
status = ca_clear_subscription ( id );
|
||||
verify ( status == ECA_NORMAL );
|
||||
epicsMutexMustLock ( pMultiThreadSubscrTest->m_mutex );
|
||||
pMultiThreadSubscrTest->m_nUpdatesReceived++;
|
||||
testComplete = ( pMultiThreadSubscrTest->m_nUpdatesReceived ==
|
||||
pMultiThreadSubscrTest->m_nUpdatesRequired );
|
||||
pMultiThreadSubscrTest->m_testComplete = testComplete;
|
||||
epicsMutexUnlock ( pMultiThreadSubscrTest->m_mutex );
|
||||
if ( testComplete ) {
|
||||
epicsEventSignal ( pMultiThreadSubscrTest->m_testCompleteEvent );
|
||||
}
|
||||
}
|
||||
|
||||
void testMultithreadSubscrConnHandler ( struct connection_handler_args args )
|
||||
{
|
||||
MultiThreadSubscrTest * const pMultiThreadSubscrTest =
|
||||
( MultiThreadSubscrTest * ) ca_puser ( args.chid );
|
||||
epicsMutexMustLock ( pMultiThreadSubscrTest->m_mutex );
|
||||
if ( !pMultiThreadSubscrTest->m_testInitiated &&
|
||||
args.op == CA_OP_CONN_UP ) {
|
||||
int i;
|
||||
pMultiThreadSubscrTest->m_testInitiated = TRUE;
|
||||
for ( i = 0; i < pMultiThreadSubscrTest->m_nUpdatesRequired; i++ ) {
|
||||
char threadname[64];
|
||||
epicsThreadId threadId;
|
||||
sprintf(threadname, "testSubscr%06u", i);
|
||||
threadId = epicsThreadCreate ( threadname,
|
||||
epicsThreadPriorityMedium,
|
||||
epicsThreadGetStackSize(epicsThreadStackSmall),
|
||||
testMultithreadSubscrCreateSubscr,
|
||||
pMultiThreadSubscrTest );
|
||||
verify ( threadId );
|
||||
}
|
||||
}
|
||||
epicsMutexUnlock ( pMultiThreadSubscrTest->m_mutex );
|
||||
}
|
||||
|
||||
void testMultithreadSubscr ( void * pParm )
|
||||
{
|
||||
MultiThreadSubscrTest * const pMultiThreadSubscrTest =
|
||||
( MultiThreadSubscrTest * ) pParm;
|
||||
int status;
|
||||
unsigned i;
|
||||
|
||||
status = ca_context_create ( ca_enable_preemptive_callback );
|
||||
verify ( status == ECA_NORMAL );
|
||||
pMultiThreadSubscrTest->m_pCtx = ca_current_context ();
|
||||
verify ( pMultiThreadSubscrTest->m_pCtx );
|
||||
status = ca_create_channel (
|
||||
pMultiThreadSubscrTest->m_chanName,
|
||||
testMultithreadSubscrConnHandler,
|
||||
pMultiThreadSubscrTest,
|
||||
CA_PRIORITY_MIN,
|
||||
& pMultiThreadSubscrTest->m_chan );
|
||||
verify ( status == ECA_NORMAL );
|
||||
|
||||
showProgressBegin ( "verifyMultithreadSubscr",
|
||||
pMultiThreadSubscrTest->m_interestLevel );
|
||||
i = 0;
|
||||
while ( TRUE ) {
|
||||
int success = FALSE;
|
||||
epicsEventWaitStatus eventWaitStatus;
|
||||
epicsMutexMustLock ( pMultiThreadSubscrTest->m_mutex );
|
||||
success = pMultiThreadSubscrTest->m_testComplete;
|
||||
epicsMutexUnlock ( pMultiThreadSubscrTest->m_mutex );
|
||||
if ( success ) {
|
||||
break;
|
||||
}
|
||||
eventWaitStatus = epicsEventWaitWithTimeout (
|
||||
pMultiThreadSubscrTest->m_testCompleteEvent, 0.1 );
|
||||
verify ( eventWaitStatus == epicsEventWaitOK ||
|
||||
eventWaitStatus == epicsEventWaitTimeout );
|
||||
if ( i++ % 100 == 0u )
|
||||
showProgress ( pMultiThreadSubscrTest->m_interestLevel );
|
||||
verify ( i < 1000 );
|
||||
}
|
||||
showProgressEnd ( pMultiThreadSubscrTest->m_interestLevel );
|
||||
|
||||
status = ca_clear_channel ( pMultiThreadSubscrTest->m_chan );
|
||||
verify ( status == ECA_NORMAL );
|
||||
ca_context_destroy ();
|
||||
epicsEventSignal ( pMultiThreadSubscrTest->m_threadExitEvent );
|
||||
}
|
||||
|
||||
/*
|
||||
* test installation of subscriptions similar to usage paterns
|
||||
* employed by modern versions of the sequencer
|
||||
*/
|
||||
void verifyMultithreadSubscr ( const char * pName, unsigned interestLevel )
|
||||
{
|
||||
static unsigned nSubscr = 3000;
|
||||
epicsThreadId threadId;
|
||||
MultiThreadSubscrTest * const pMultiThreadSubscrTest =
|
||||
(MultiThreadSubscrTest*) calloc ( 1,
|
||||
sizeof ( MultiThreadSubscrTest ) );
|
||||
verify ( pMultiThreadSubscrTest);
|
||||
pMultiThreadSubscrTest->m_mutex = epicsMutexMustCreate ();
|
||||
verify ( pMultiThreadSubscrTest->m_mutex );
|
||||
pMultiThreadSubscrTest->m_testCompleteEvent =
|
||||
epicsEventMustCreate ( epicsEventEmpty );
|
||||
verify ( pMultiThreadSubscrTest->m_testCompleteEvent );
|
||||
pMultiThreadSubscrTest->m_threadExitEvent =
|
||||
epicsEventMustCreate ( epicsEventEmpty );
|
||||
verify ( pMultiThreadSubscrTest->m_threadExitEvent );
|
||||
strncpy ( pMultiThreadSubscrTest->m_chanName, pName,
|
||||
sizeof ( pMultiThreadSubscrTest->m_chanName ) );
|
||||
pMultiThreadSubscrTest->m_chanName
|
||||
[ sizeof ( pMultiThreadSubscrTest->m_chanName ) - 1u ] = '\0';
|
||||
pMultiThreadSubscrTest->m_nUpdatesRequired = nSubscr;
|
||||
pMultiThreadSubscrTest->m_interestLevel = interestLevel;
|
||||
threadId = epicsThreadCreate (
|
||||
"testMultithreadSubscr",
|
||||
epicsThreadPriorityMedium,
|
||||
epicsThreadGetStackSize(epicsThreadStackSmall),
|
||||
testMultithreadSubscr, pMultiThreadSubscrTest );
|
||||
verify ( threadId );
|
||||
{
|
||||
epicsEventWaitStatus eventWaitStatus;
|
||||
eventWaitStatus = epicsEventWaitWithTimeout (
|
||||
pMultiThreadSubscrTest->m_threadExitEvent, 1000.0 );
|
||||
verify ( eventWaitStatus == epicsEventWaitOK );
|
||||
}
|
||||
epicsEventDestroy ( pMultiThreadSubscrTest->m_testCompleteEvent );
|
||||
epicsEventDestroy ( pMultiThreadSubscrTest->m_threadExitEvent );
|
||||
epicsMutexDestroy ( pMultiThreadSubscrTest->m_mutex );
|
||||
free ( pMultiThreadSubscrTest );
|
||||
}
|
||||
|
||||
void fdManagerVerify ( const char * pName, unsigned interestLevel )
|
||||
{
|
||||
int status;
|
||||
@@ -2965,17 +3151,22 @@ void verifyContextRundownFlush ( const char * pName, unsigned interestLevel )
|
||||
SEVCHK ( status, "context create failed" );
|
||||
|
||||
status = ca_create_channel ( pName, 0, 0, 0, & chan );
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
status = ca_pend_io( timeoutToPendIO );
|
||||
SEVCHK ( status, "channel connect failed" );
|
||||
|
||||
status = ca_put ( DBR_DOUBLE, chan, & stim );
|
||||
SEVCHK ( status, "channel put failed" );
|
||||
|
||||
status = ca_clear_channel ( chan );
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
/*
|
||||
* currently in-memory channels cant be used with this test
|
||||
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
|
||||
*/
|
||||
if ( status != ECA_UNAVAILINSERV ) {
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
status = ca_pend_io( timeoutToPendIO );
|
||||
SEVCHK ( status, "channel connect failed" );
|
||||
|
||||
status = ca_put ( DBR_DOUBLE, chan, & stim );
|
||||
SEVCHK ( status, "channel put failed" );
|
||||
|
||||
status = ca_clear_channel ( chan );
|
||||
SEVCHK ( status, NULL );
|
||||
}
|
||||
ca_context_destroy ();
|
||||
}
|
||||
|
||||
@@ -2985,24 +3176,28 @@ void verifyContextRundownFlush ( const char * pName, unsigned interestLevel )
|
||||
dbr_double_t resp;
|
||||
status = ca_context_create ( ca_disable_preemptive_callback );
|
||||
SEVCHK ( status, "context create failed" );
|
||||
|
||||
|
||||
status = ca_create_channel ( pName, 0, 0, 0, & chan );
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
status = ca_pend_io( timeoutToPendIO );
|
||||
SEVCHK ( status, "channel connect failed" );
|
||||
|
||||
status = ca_get ( DBR_DOUBLE, chan, & resp );
|
||||
SEVCHK ( status, "channel get failed" );
|
||||
|
||||
status = ca_pend_io ( timeoutToPendIO );
|
||||
SEVCHK ( status, "get, pend io failed" );
|
||||
|
||||
verify ( stim == resp );
|
||||
|
||||
status = ca_clear_channel ( chan );
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
/*
|
||||
* currently in-memory channels cant be used with this test
|
||||
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
|
||||
*/
|
||||
if ( status != ECA_UNAVAILINSERV ) {
|
||||
status = ca_pend_io( timeoutToPendIO );
|
||||
SEVCHK ( status, "channel connect failed" );
|
||||
|
||||
status = ca_get ( DBR_DOUBLE, chan, & resp );
|
||||
SEVCHK ( status, "channel get failed" );
|
||||
|
||||
status = ca_pend_io ( timeoutToPendIO );
|
||||
SEVCHK ( status, "get, pend io failed" );
|
||||
|
||||
verify ( stim == resp );
|
||||
|
||||
status = ca_clear_channel ( chan );
|
||||
SEVCHK ( status, NULL );
|
||||
}
|
||||
ca_context_destroy ();
|
||||
}
|
||||
|
||||
@@ -3028,6 +3223,13 @@ void verifyContextRundownChanStillExist (
|
||||
|
||||
for ( i = 0; i < NELEMENTS ( chan ); i++ ) {
|
||||
status = ca_create_channel ( pName, 0, 0, 0, & chan[i] );
|
||||
/*
|
||||
* currently in-memory channels cant be used with this test
|
||||
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
|
||||
*/
|
||||
if ( status == ECA_UNAVAILINSERV ) {
|
||||
break;
|
||||
}
|
||||
SEVCHK ( status, NULL );
|
||||
}
|
||||
|
||||
@@ -3123,6 +3325,7 @@ int acctst ( const char * pName, unsigned interestLevel, unsigned channelCount,
|
||||
verifyHighThroughputReadCallback ( chan, interestLevel );
|
||||
verifyHighThroughputWriteCallback ( chan, interestLevel );
|
||||
verifyBadString ( chan, interestLevel );
|
||||
verifyMultithreadSubscr ( pName, interestLevel );
|
||||
if ( select != ca_enable_preemptive_callback ) {
|
||||
fdManagerVerify ( pName, interestLevel );
|
||||
}
|
||||
|
||||
69
src/ca/acctstRegister.cpp
Normal file
69
src/ca/acctstRegister.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
/*************************************************************************\
|
||||
* 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 is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
* CA client library diagnostics IOC shell registration
|
||||
* Authors:
|
||||
* Jeff Hill
|
||||
*/
|
||||
|
||||
#include <iocsh.h>
|
||||
#include "caDiagnostics.h"
|
||||
|
||||
/* Information needed by iocsh */
|
||||
static const iocshArg acctstArg0 = { "channel name", iocshArgString };
|
||||
static const iocshArg acctstArg1 = { "interest level", iocshArgInt };
|
||||
static const iocshArg acctstArg2 = { "channel count", iocshArgInt };
|
||||
static const iocshArg acctstArg3 = { "repetition count", iocshArgInt };
|
||||
static const iocshArg acctstArg4 = { "preemptive callback select", iocshArgInt };
|
||||
|
||||
static const iocshArg *acctstArgs[] =
|
||||
{
|
||||
&acctstArg0,
|
||||
&acctstArg1,
|
||||
&acctstArg2,
|
||||
&acctstArg3,
|
||||
&acctstArg4
|
||||
};
|
||||
static const iocshFuncDef acctstFuncDef = {"acctst", 5, acctstArgs};
|
||||
|
||||
|
||||
/* Wrapper called by iocsh, selects the argument types that print needs */
|
||||
static void acctstCallFunc(const iocshArgBuf *args) {
|
||||
if ( args[1].ival < 0 ) {
|
||||
printf ( "negative interest level not allowed\n" );
|
||||
return;
|
||||
}
|
||||
if ( args[2].ival < 0 ) {
|
||||
printf ( "negative channel count not allowed\n" );
|
||||
return;
|
||||
}
|
||||
if ( args[3].ival < 0 ) {
|
||||
printf ( "negative repetition count not allowed\n" );
|
||||
return;
|
||||
}
|
||||
acctst (
|
||||
args[0].sval, /* channel name */
|
||||
( unsigned ) args[1].ival, /* interest level */
|
||||
( unsigned ) args[2].ival, /* channel count */
|
||||
( unsigned ) args[3].ival, /* repetition count */
|
||||
( ca_preemptive_callback_select ) args[4].ival ); /* preemptive callback select */
|
||||
}
|
||||
|
||||
struct AutoInit {
|
||||
AutoInit ();
|
||||
};
|
||||
|
||||
AutoInit :: AutoInit ()
|
||||
{
|
||||
iocshRegister ( &acctstFuncDef, acctstCallFunc );
|
||||
}
|
||||
|
||||
AutoInit autoInit;
|
||||
|
||||
@@ -266,8 +266,8 @@ private:
|
||||
// **** lock hierarchy ****
|
||||
// 1) callback lock must always be acquired before
|
||||
// the primary mutex if both locks are needed
|
||||
mutable epicsMutex & mutex;
|
||||
mutable epicsMutex & cbMutex;
|
||||
epicsMutex & mutex;
|
||||
epicsMutex & cbMutex;
|
||||
epicsEvent iiuUninstall;
|
||||
ipAddrToAsciiEngine & ipToAEngine;
|
||||
epicsTimerQueueActive & timerQueue;
|
||||
|
||||
@@ -185,7 +185,8 @@ epicsShareFunc enum channel_state epicsShareAPI ca_state (chid chan);
|
||||
epicsShareFunc int epicsShareAPI ca_task_initialize (void);
|
||||
enum ca_preemptive_callback_select
|
||||
{ ca_disable_preemptive_callback, ca_enable_preemptive_callback };
|
||||
epicsShareFunc int epicsShareAPI ca_context_create (enum ca_preemptive_callback_select select);
|
||||
epicsShareFunc int epicsShareAPI
|
||||
ca_context_create (enum ca_preemptive_callback_select select);
|
||||
epicsShareFunc void epicsShareAPI ca_detach_context ();
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
@@ -1866,10 +1866,14 @@ void tcpiiu::unlinkAllChannels (
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
|
||||
while ( nciu * pChan = this->createReqPend.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
pChan->serviceShutdownNotify ( cbGuard, guard );
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->createRespPend.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
// we dont yet know the server's id so we cant
|
||||
// send a channel delete request and will instead
|
||||
// trust that the server can do the proper cleanup
|
||||
@@ -1878,12 +1882,16 @@ void tcpiiu::unlinkAllChannels (
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->v42ConnCallbackPend.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
this->clearChannelRequest ( guard,
|
||||
pChan->getSID(guard), pChan->getCID(guard) );
|
||||
pChan->serviceShutdownNotify ( cbGuard, guard );
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->subscripReqPend.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
pChan->disconnectAllIO ( cbGuard, guard );
|
||||
this->clearChannelRequest ( guard,
|
||||
pChan->getSID(guard), pChan->getCID(guard) );
|
||||
@@ -1891,6 +1899,8 @@ void tcpiiu::unlinkAllChannels (
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->connectedList.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
pChan->disconnectAllIO ( cbGuard, guard );
|
||||
this->clearChannelRequest ( guard,
|
||||
pChan->getSID(guard), pChan->getCID(guard) );
|
||||
@@ -1898,6 +1908,8 @@ void tcpiiu::unlinkAllChannels (
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->unrespCircuit.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
pChan->disconnectAllIO ( cbGuard, guard );
|
||||
// if we know that the circuit is unresponsive
|
||||
// then we dont send a channel delete request and
|
||||
@@ -1907,6 +1919,8 @@ void tcpiiu::unlinkAllChannels (
|
||||
}
|
||||
|
||||
while ( nciu * pChan = this->subscripUpdateReqPend.get () ) {
|
||||
pChan->channelNode::listMember =
|
||||
channelNode::cs_none;
|
||||
pChan->disconnectAllIO ( cbGuard, guard );
|
||||
this->clearChannelRequest ( guard,
|
||||
pChan->getSID(guard), pChan->getCID(guard) );
|
||||
|
||||
@@ -81,8 +81,9 @@ udpiiu::udpiiu (
|
||||
cac::lowestPriorityLevelAbove (
|
||||
cac::lowestPriorityLevelAbove (
|
||||
cac.getInitializingThreadsPriority () ) ) ),
|
||||
m_repeaterTimerNotify ( *this ),
|
||||
repeaterSubscribeTmr (
|
||||
*this, timerQueue, cbMutexIn, ctxNotifyIn ),
|
||||
m_repeaterTimerNotify, timerQueue, cbMutexIn, ctxNotifyIn ),
|
||||
govTmr ( *this, timerQueue, cacMutexIn ),
|
||||
maxPeriod ( maxSearchPeriodDefault ),
|
||||
rtteMean ( minRoundTripEstimate ),
|
||||
@@ -397,14 +398,14 @@ void udpRecvThread::run ()
|
||||
}
|
||||
|
||||
/*
|
||||
* udpiiu::repeaterRegistrationMessage ()
|
||||
* udpiiu::M_repeaterTimerNotify::repeaterRegistrationMessage ()
|
||||
*
|
||||
* register with the repeater
|
||||
*/
|
||||
void udpiiu::repeaterRegistrationMessage ( unsigned attemptNumber )
|
||||
void udpiiu :: M_repeaterTimerNotify :: repeaterRegistrationMessage ( unsigned attemptNumber )
|
||||
{
|
||||
epicsGuard < epicsMutex > cbGuard ( this->cacMutex );
|
||||
caRepeaterRegistrationMessage ( this->sock, this->repeaterPort, attemptNumber );
|
||||
epicsGuard < epicsMutex > cbGuard ( m_udpiiu.cacMutex );
|
||||
caRepeaterRegistrationMessage ( m_udpiiu.sock, m_udpiiu.repeaterPort, attemptNumber );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1233,16 +1234,16 @@ void udpiiu::govExpireNotify (
|
||||
this->ppSearchTmr[0]->installChannel ( guard, chan );
|
||||
}
|
||||
|
||||
int udpiiu :: printFormated (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
const char * pformat, ... )
|
||||
int udpiiu :: M_repeaterTimerNotify :: printFormated (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
const char * pformat, ... )
|
||||
{
|
||||
va_list theArgs;
|
||||
int status;
|
||||
|
||||
va_start ( theArgs, pformat );
|
||||
|
||||
status = this->cacRef.varArgsPrintFormated ( cbGuard, pformat, theArgs );
|
||||
status = m_udpiiu.cacRef.varArgsPrintFormated ( cbGuard, pformat, theArgs );
|
||||
|
||||
va_end ( theArgs );
|
||||
|
||||
|
||||
@@ -88,8 +88,7 @@ static const double beaconAnomalySearchPeriod = 5.0; // seconds
|
||||
class udpiiu :
|
||||
private netiiu,
|
||||
private searchTimerNotify,
|
||||
private disconnectGovernorNotify,
|
||||
private repeaterTimerNotify {
|
||||
private disconnectGovernorNotify {
|
||||
public:
|
||||
udpiiu (
|
||||
epicsGuard < epicsMutex > & cacGuard,
|
||||
@@ -139,9 +138,24 @@ private:
|
||||
private:
|
||||
udpiiu & _udpiiu;
|
||||
};
|
||||
class M_repeaterTimerNotify :
|
||||
public repeaterTimerNotify {
|
||||
public:
|
||||
M_repeaterTimerNotify ( udpiiu & iiu ) :
|
||||
m_udpiiu ( iiu ) {}
|
||||
// repeaterTimerNotify
|
||||
void repeaterRegistrationMessage (
|
||||
unsigned attemptNumber );
|
||||
int printFormated (
|
||||
epicsGuard < epicsMutex > & callbackControl,
|
||||
const char * pformat, ... );
|
||||
private:
|
||||
udpiiu & m_udpiiu;
|
||||
};
|
||||
char xmitBuf [MAX_UDP_SEND];
|
||||
char recvBuf [MAX_UDP_RECV];
|
||||
udpRecvThread recvThread;
|
||||
M_repeaterTimerNotify m_repeaterTimerNotify;
|
||||
repeaterSubscribeTimer repeaterSubscribeTmr;
|
||||
disconnectGovernorTimer govTmr;
|
||||
tsDLList < SearchDest > _searchDestList;
|
||||
@@ -149,8 +163,8 @@ private:
|
||||
double rtteMean;
|
||||
double rtteMeanDev;
|
||||
cac & cacRef;
|
||||
mutable epicsMutex & cbMutex;
|
||||
mutable epicsMutex & cacMutex;
|
||||
epicsMutex & cbMutex;
|
||||
epicsMutex & cacMutex;
|
||||
epics_auto_ptr < epics_auto_ptr < class searchTimer >, eapt_array > ppSearchTmr;
|
||||
unsigned nBytesInXmitBuf;
|
||||
unsigned nTimers;
|
||||
@@ -278,14 +292,6 @@ private:
|
||||
void govExpireNotify (
|
||||
epicsGuard < epicsMutex > &, nciu & );
|
||||
|
||||
// repeaterTimerNotify
|
||||
void repeaterRegistrationMessage (
|
||||
unsigned attemptNumber );
|
||||
|
||||
int printFormated (
|
||||
epicsGuard < epicsMutex > & callbackControl,
|
||||
const char * pformat, ... );
|
||||
|
||||
udpiiu ( const udpiiu & );
|
||||
udpiiu & operator = ( const udpiiu & );
|
||||
|
||||
@@ -294,6 +300,7 @@ private:
|
||||
// These are needed for the vxWorks 5.5 compiler:
|
||||
friend class udpiiu::SearchDestUDP;
|
||||
friend class udpiiu::SearchRespCallback;
|
||||
friend class udpiiu::M_repeaterTimerNotify;
|
||||
};
|
||||
|
||||
#endif // udpiiuh
|
||||
|
||||
@@ -33,6 +33,12 @@ ifeq ($(findstring $(OS_CLASS),WIN32 cygwin32),)
|
||||
PERL_SCRIPTS += camonitor.pl
|
||||
|
||||
PERL_MODULES += CA.pm
|
||||
|
||||
ifeq ($(findstring Host,$(VALID_BUILDS)),Host)
|
||||
# Can only create docs in Host build
|
||||
HTMLS_DIR = .
|
||||
HTMLS = CA.html
|
||||
endif
|
||||
endif
|
||||
|
||||
Cap5_SRCS = Cap5.xs
|
||||
@@ -40,12 +46,6 @@ Cap5_LIBS = ca Com
|
||||
Cap5_INCLUDES = -I$(shell $(PERL) ../perlConfig.pl archlib)/CORE
|
||||
Cap5_CFLAGS = $(shell $(PERL) ../perlConfig.pl ccflags)
|
||||
|
||||
ifeq ($(findstring Host,$(VALID_BUILDS)),Host)
|
||||
# Can only create docs in Host build
|
||||
HTMLS_DIR = .
|
||||
HTMLS = CA.html
|
||||
endif
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
ifdef T_A
|
||||
|
||||
@@ -23,8 +23,8 @@ PROD_LIBS := cas ca gdd Com
|
||||
#
|
||||
PROD_SYS_LIBS_WIN32 := ws2_32 advapi32 user32
|
||||
|
||||
SRCS += main.cc
|
||||
SRCS += directoryServer.cc
|
||||
caDirServ_SRCS += main.cc
|
||||
caDirServ_SRCS += directoryServer.cc
|
||||
|
||||
PROD_HOST = caDirServ
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@ inline void casStreamOS::disarmRecv ()
|
||||
//
|
||||
// casStreamOS::armSend()
|
||||
//
|
||||
inline void casStreamOS::armSend()
|
||||
void casStreamOS::armSend()
|
||||
{
|
||||
if ( this->outBufBytesPending() == 0u ) {
|
||||
return;
|
||||
|
||||
@@ -87,7 +87,7 @@ static void usage (void)
|
||||
" -e <nr>: Use %%e format, with a precision of <nr> digits\n"
|
||||
" -f <nr>: Use %%f format, with a precision of <nr> digits\n"
|
||||
" -g <nr>: Use %%g format, with a precision of <nr> digits\n"
|
||||
" -s: Get value as string (may honour server-side precision)\n"
|
||||
" -s: Get value as string (honors server-side precision)\n"
|
||||
" -lx: Round to long integer and print as hex number\n"
|
||||
" -lo: Round to long integer and print as octal number\n"
|
||||
" -lb: Round to long integer and print as binary number\n"
|
||||
@@ -126,7 +126,6 @@ static void event_handler (evargs args)
|
||||
ppv->dbrType = args.type;
|
||||
ppv->value = calloc(1, dbr_size_n(args.type, args.count));
|
||||
memcpy(ppv->value, args.dbr, dbr_size_n(args.type, args.count));
|
||||
ppv->onceConnected = 1;
|
||||
ppv->nElems = args.count;
|
||||
nRead++;
|
||||
}
|
||||
@@ -159,12 +158,13 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
|
||||
int n, result;
|
||||
|
||||
for (n = 0; n < nPvs; n++) {
|
||||
unsigned long nElems;
|
||||
|
||||
/* Set up pvs structure */
|
||||
/* -------------------- */
|
||||
|
||||
/* Get natural type and array count */
|
||||
pvs[n].nElems = ca_element_count(pvs[n].chid);
|
||||
nElems = ca_element_count(pvs[n].chid);
|
||||
pvs[n].dbfType = ca_field_type(pvs[n].chid);
|
||||
pvs[n].dbrType = dbrType;
|
||||
|
||||
@@ -183,10 +183,6 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
|
||||
pvs[n].dbrType = DBR_TIME_STRING;
|
||||
}
|
||||
}
|
||||
/* Adjust array count */
|
||||
if (reqElems > pvs[n].nElems)
|
||||
reqElems = pvs[n].nElems;
|
||||
pvs[n].reqElems = reqElems;
|
||||
|
||||
/* Issue CA request */
|
||||
/* ---------------- */
|
||||
@@ -196,17 +192,20 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
|
||||
nConn++;
|
||||
pvs[n].onceConnected = 1;
|
||||
if (request == callback)
|
||||
{ /* Event handler will allocate value */
|
||||
{
|
||||
/* Event handler will allocate value and set nElems */
|
||||
pvs[n].reqElems = reqElems > nElems ? nElems : reqElems;
|
||||
result = ca_array_get_callback(pvs[n].dbrType,
|
||||
pvs[n].reqElems,
|
||||
pvs[n].chid,
|
||||
event_handler,
|
||||
(void*)&pvs[n]);
|
||||
} else {
|
||||
/* Allocate value structure */
|
||||
/* We allocate value structure and set nElems */
|
||||
pvs[n].nElems = reqElems && reqElems < nElems ? reqElems : nElems;
|
||||
pvs[n].value = calloc(1, dbr_size_n(pvs[n].dbrType, pvs[n].nElems));
|
||||
if(!pvs[n].value) {
|
||||
fprintf(stderr,"Allocation failed\n");
|
||||
if (!pvs[n].value) {
|
||||
fprintf(stderr,"Memory allocation failed\n");
|
||||
return 1;
|
||||
}
|
||||
result = ca_array_get(pvs[n].dbrType,
|
||||
@@ -252,9 +251,6 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
|
||||
/* -------------- */
|
||||
|
||||
for (n = 0; n < nPvs; n++) {
|
||||
/* Truncate the data printed to what was requested. */
|
||||
if (pvs[n].reqElems != 0 && pvs[n].nElems > pvs[n].reqElems)
|
||||
pvs[n].nElems = pvs[n].reqElems;
|
||||
|
||||
switch (format) {
|
||||
case plain: /* Emulate old caget behaviour */
|
||||
@@ -377,7 +373,7 @@ static void complainIfNotPlainAndSet (OutputT *current, const OutputT requested)
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int n = 0;
|
||||
int n;
|
||||
int result; /* CA result */
|
||||
OutputT format = plain; /* User specified format */
|
||||
RequestT request = get; /* User specified request type */
|
||||
@@ -389,9 +385,9 @@ int main (int argc, char *argv[])
|
||||
int digits = 0; /* getopt() no. of float digits */
|
||||
|
||||
int nPvs; /* Number of PVs */
|
||||
pv* pvs = 0; /* Array of PV structures */
|
||||
pv* pvs; /* Array of PV structures */
|
||||
|
||||
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */
|
||||
LINE_BUFFER(stdout); /* Configure stdout buffering */
|
||||
|
||||
while ((opt = getopt(argc, argv, ":taicnhsSe:f:g:l:#:d:0:w:p:F:")) != -1) {
|
||||
switch (opt) {
|
||||
@@ -529,7 +525,7 @@ int main (int argc, char *argv[])
|
||||
result = ca_context_create(ca_disable_preemptive_callback);
|
||||
if (result != ECA_NORMAL) {
|
||||
fprintf(stderr, "CA error %s occurred while trying "
|
||||
"to start channel access '%s'.\n", ca_message(result), pvs[n].name);
|
||||
"to start channel access.\n", ca_message(result));
|
||||
return 1;
|
||||
}
|
||||
/* Allocate PV structure array */
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* Copyright (c) 2002 Berliner Elektronenspeicherringgesellschaft fuer
|
||||
* Synchrotronstrahlung.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
@@ -128,15 +127,15 @@ int cainfo (pv *pvs, int nPvs)
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int n = 0;
|
||||
int n;
|
||||
int result; /* CA result */
|
||||
|
||||
int opt; /* getopt() current option */
|
||||
|
||||
int nPvs; /* Number of PVs */
|
||||
pv* pvs = 0; /* Array of PV structures */
|
||||
pv* pvs; /* Array of PV structures */
|
||||
|
||||
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */
|
||||
LINE_BUFFER(stdout); /* Configure stdout buffering */
|
||||
|
||||
while ((opt = getopt(argc, argv, ":nhw:s:p:")) != -1) {
|
||||
switch (opt) {
|
||||
@@ -196,7 +195,7 @@ int main (int argc, char *argv[])
|
||||
result = ca_context_create(ca_disable_preemptive_callback);
|
||||
if (result != ECA_NORMAL) {
|
||||
fprintf(stderr, "CA error %s occurred while trying "
|
||||
"to start channel access '%s'.\n", ca_message(result), pvs[n].name);
|
||||
"to start channel access.\n", ca_message(result));
|
||||
return 1;
|
||||
}
|
||||
/* Allocate PV structure array */
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* Copyright (c) 2002 Berliner Elektronenspeicherringgesellschaft fuer
|
||||
* Synchrotronstrahlung.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
@@ -70,7 +69,7 @@ void usage (void)
|
||||
" -e <nr>: Use %%e format, with a precision of <nr> digits\n"
|
||||
" -f <nr>: Use %%f format, with a precision of <nr> digits\n"
|
||||
" -g <nr>: Use %%g format, with a precision of <nr> digits\n"
|
||||
" -s: Get value as string (may honour server-side precision)\n"
|
||||
" -s: Get value as string (honors server-side precision)\n"
|
||||
" -lx: Round to long integer and print as hex number\n"
|
||||
" -lo: Round to long integer and print as octal number\n"
|
||||
" -lb: Round to long integer and print as binary number\n"
|
||||
@@ -93,7 +92,7 @@ void usage (void)
|
||||
* Function: event_handler
|
||||
*
|
||||
* Description: CA event_handler for request type callback
|
||||
* Allocates the dbr structure and copies the data
|
||||
* Prints the event data
|
||||
*
|
||||
* Arg(s) In: args - event handler args (see CA manual)
|
||||
*
|
||||
@@ -108,10 +107,12 @@ static void event_handler (evargs args)
|
||||
{
|
||||
pv->dbrType = args.type;
|
||||
pv->nElems = args.count;
|
||||
memcpy(pv->value, args.dbr, dbr_size_n(args.type, args.count));
|
||||
pv->value = (void *) args.dbr; /* casting away const */
|
||||
|
||||
print_time_val_sts(pv, reqElems);
|
||||
fflush(stdout);
|
||||
|
||||
pv->value = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,51 +131,39 @@ static void connection_handler ( struct connection_handler_args args )
|
||||
{
|
||||
pv *ppv = ( pv * ) ca_puser ( args.chid );
|
||||
if ( args.op == CA_OP_CONN_UP ) {
|
||||
nConn++;
|
||||
if (!ppv->onceConnected) {
|
||||
ppv->onceConnected = 1;
|
||||
/* Set up pv structure */
|
||||
/* ------------------- */
|
||||
|
||||
/* Get natural type and array count */
|
||||
ppv->nElems = ca_element_count(ppv->chid);
|
||||
ppv->dbfType = ca_field_type(ppv->chid);
|
||||
ppv->dbfType = ca_field_type(ppv->chid);
|
||||
ppv->dbrType = dbf_type_to_DBR_TIME(ppv->dbfType); /* Use native type */
|
||||
if (dbr_type_is_ENUM(ppv->dbrType)) /* Enums honour -n option */
|
||||
{
|
||||
if (enumAsNr) ppv->dbrType = DBR_TIME_INT;
|
||||
else ppv->dbrType = DBR_TIME_STRING;
|
||||
}
|
||||
else if (floatAsString &&
|
||||
(dbr_type_is_FLOAT(ppv->dbrType) || dbr_type_is_DOUBLE(ppv->dbrType)))
|
||||
{
|
||||
ppv->dbrType = DBR_TIME_STRING;
|
||||
}
|
||||
/* Set request count */
|
||||
ppv->nElems = ca_element_count(ppv->chid);
|
||||
ppv->reqElems = reqElems > ppv->nElems ? ppv->nElems : reqElems;
|
||||
|
||||
/* Set up value structures */
|
||||
ppv->dbrType = dbf_type_to_DBR_TIME(ppv->dbfType); /* Use native type */
|
||||
if (dbr_type_is_ENUM(ppv->dbrType)) /* Enums honour -n option */
|
||||
{
|
||||
if (enumAsNr) ppv->dbrType = DBR_TIME_INT;
|
||||
else ppv->dbrType = DBR_TIME_STRING;
|
||||
}
|
||||
|
||||
else if (floatAsString &&
|
||||
(dbr_type_is_FLOAT(ppv->dbrType) || dbr_type_is_DOUBLE(ppv->dbrType)))
|
||||
{
|
||||
ppv->dbrType = DBR_TIME_STRING;
|
||||
}
|
||||
/* Adjust array count */
|
||||
if (reqElems > ppv->nElems)
|
||||
reqElems = ppv->nElems;
|
||||
ppv->reqElems = reqElems;
|
||||
|
||||
ppv->onceConnected = 1;
|
||||
nConn++;
|
||||
/* Issue CA request */
|
||||
/* ---------------- */
|
||||
/* install monitor once with first connect */
|
||||
if ( ! ppv->value ) {
|
||||
/* Allocate value structure */
|
||||
ppv->value = calloc(1, dbr_size_n(ppv->dbrType, ppv->nElems));
|
||||
if ( ppv->value ) {
|
||||
ppv->status = ca_create_subscription(ppv->dbrType,
|
||||
/* install monitor once with first connect */
|
||||
ppv->status = ca_create_subscription(ppv->dbrType,
|
||||
ppv->reqElems,
|
||||
ppv->chid,
|
||||
eventMask,
|
||||
event_handler,
|
||||
(void*)ppv,
|
||||
NULL);
|
||||
if ( ppv->status != ECA_NORMAL ) {
|
||||
free ( ppv->value );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( args.op == CA_OP_CONN_DOWN ) {
|
||||
@@ -204,7 +193,7 @@ static void connection_handler ( struct connection_handler_args args )
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int returncode = 0;
|
||||
int n = 0;
|
||||
int n;
|
||||
int result; /* CA result */
|
||||
IntFormatT outType; /* Output type */
|
||||
|
||||
@@ -212,9 +201,9 @@ int main (int argc, char *argv[])
|
||||
int digits = 0; /* getopt() no. of float digits */
|
||||
|
||||
int nPvs; /* Number of PVs */
|
||||
pv* pvs = 0; /* Array of PV structures */
|
||||
pv* pvs; /* Array of PV structures */
|
||||
|
||||
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */
|
||||
LINE_BUFFER(stdout); /* Configure stdout buffering */
|
||||
|
||||
while ((opt = getopt(argc, argv, ":nhm:sSe:f:g:l:#:0:w:t:p:F:")) != -1) {
|
||||
switch (opt) {
|
||||
@@ -357,7 +346,7 @@ int main (int argc, char *argv[])
|
||||
result = ca_context_create(ca_disable_preemptive_callback);
|
||||
if (result != ECA_NORMAL) {
|
||||
fprintf(stderr, "CA error %s occurred while trying "
|
||||
"to start channel access '%s'.\n", ca_message(result), pvs[n].name);
|
||||
"to start channel access.\n", ca_message(result));
|
||||
return 1;
|
||||
}
|
||||
/* Allocate PV structure array */
|
||||
|
||||
@@ -251,7 +251,6 @@ int caget (pv *pvs, int nPvs, OutputT format,
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int n = 0;
|
||||
int i;
|
||||
int result; /* CA result */
|
||||
OutputT format = plain; /* User specified format */
|
||||
@@ -273,10 +272,10 @@ int main (int argc, char *argv[])
|
||||
struct dbr_gr_enum bufGrEnum;
|
||||
|
||||
int nPvs; /* Number of PVs */
|
||||
pv* pvs = 0; /* Array of PV structures */
|
||||
pv* pvs; /* Array of PV structures */
|
||||
|
||||
setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */
|
||||
putenv("POSIXLY_CORRECT="); /* Behave correct on GNU getopt systems */
|
||||
LINE_BUFFER(stdout); /* Configure stdout buffering */
|
||||
putenv("POSIXLY_CORRECT="); /* Behave correct on GNU getopt systems */
|
||||
|
||||
while ((opt = getopt(argc, argv, ":cnlhatsS#:w:p:F:")) != -1) {
|
||||
switch (opt) {
|
||||
@@ -372,7 +371,7 @@ int main (int argc, char *argv[])
|
||||
result = ca_context_create(ca_enable_preemptive_callback);
|
||||
if (result != ECA_NORMAL) {
|
||||
fprintf(stderr, "CA error %s occurred while trying "
|
||||
"to start channel access '%s'.\n", ca_message(result), pvs[n].name);
|
||||
"to start channel access.\n", ca_message(result));
|
||||
return 1;
|
||||
}
|
||||
/* Allocate PV structure array */
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* Copyright (c) 2002 Berliner Elektronenspeicherringgesellschaft fuer
|
||||
* Synchrotronstrahlung.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
@@ -50,6 +49,13 @@
|
||||
#define DEFAULT_CA_PRIORITY 0 /* Default CA priority */
|
||||
#define DEFAULT_TIMEOUT 1.0 /* Default CA timeout */
|
||||
|
||||
#ifndef _WIN32
|
||||
# define LINE_BUFFER(stream) setvbuf(stream, NULL, _IOLBF, BUFSIZ)
|
||||
#else
|
||||
/* Windows doesn't support line mode, turn buffering off completely */
|
||||
# define LINE_BUFFER(stream) setvbuf(stream, NULL, _IONBF, 0)
|
||||
#endif
|
||||
|
||||
|
||||
/* Type of timestamp */
|
||||
typedef enum { absolute, relative, incremental, incrementalByChan } TimeT;
|
||||
|
||||
@@ -196,8 +196,8 @@ private:
|
||||
dbContextReadNotifyCache readNotifyCache;
|
||||
dbEventCtx ctx;
|
||||
unsigned long stateNotifyCacheSize;
|
||||
mutable epicsMutex & mutex;
|
||||
mutable epicsMutex & cbMutex;
|
||||
epicsMutex & mutex;
|
||||
epicsMutex & cbMutex;
|
||||
cacContextNotify & notify;
|
||||
epics_auto_ptr < cacContext > pNetContext;
|
||||
char * pStateNotifyCache;
|
||||
|
||||
194
src/db/dbEvent.c
194
src/db/dbEvent.c
@@ -203,35 +203,44 @@ int epicsShareAPI dbel ( const char *pname, unsigned level )
|
||||
}
|
||||
|
||||
if ( level > 1 ) {
|
||||
unsigned nEntriesFree = ringSpace ( pevent->ev_que );
|
||||
unsigned nEntriesFree;
|
||||
const void * taskId;
|
||||
LOCKEVQUE(pevent->ev_que);
|
||||
nEntriesFree = ringSpace ( pevent->ev_que );
|
||||
taskId = ( void * ) pevent->ev_que->evUser->taskid;
|
||||
UNLOCKEVQUE(pevent->ev_que);
|
||||
if ( nEntriesFree == 0u ) {
|
||||
printf ( ", thread=%p, queue full",
|
||||
(void *) pevent->ev_que->evUser->taskid );
|
||||
(void *) taskId );
|
||||
}
|
||||
else if ( nEntriesFree == EVENTQUESIZE ) {
|
||||
printf ( ", thread=%p, queue empty",
|
||||
(void *) pevent->ev_que->evUser->taskid );
|
||||
(void *) taskId );
|
||||
}
|
||||
else {
|
||||
printf ( ", thread=%p, unused entries=%u",
|
||||
(void *) pevent->ev_que->evUser->taskid, nEntriesFree );
|
||||
(void *) taskId, nEntriesFree );
|
||||
}
|
||||
}
|
||||
|
||||
if ( level > 2 ) {
|
||||
unsigned nDuplicates;
|
||||
unsigned nCanceled;
|
||||
if ( pevent->nreplace ) {
|
||||
printf (", discarded by replacement=%ld", pevent->nreplace);
|
||||
}
|
||||
if ( ! pevent->valque ) {
|
||||
printf (", queueing disabled" );
|
||||
}
|
||||
if ( pevent->ev_que->nDuplicates ) {
|
||||
printf (", duplicate count =%u\n",
|
||||
pevent->ev_que->nDuplicates );
|
||||
LOCKEVQUE(pevent->ev_que);
|
||||
nDuplicates = pevent->ev_que->nDuplicates;
|
||||
nCanceled = pevent->ev_que->nCanceled;
|
||||
UNLOCKEVQUE(pevent->ev_que);
|
||||
if ( nDuplicates ) {
|
||||
printf (", duplicate count =%u\n", nDuplicates );
|
||||
}
|
||||
if ( pevent->ev_que->nCanceled ) {
|
||||
printf (", canceled count =%u\n",
|
||||
pevent->ev_que->nCanceled );
|
||||
if ( nCanceled ) {
|
||||
printf (", canceled count =%u\n", nCanceled );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,7 +273,7 @@ int epicsShareAPI dbel ( const char *pname, unsigned level )
|
||||
*/
|
||||
dbEventCtx epicsShareAPI db_init_events (void)
|
||||
{
|
||||
struct event_user *evUser;
|
||||
struct event_user * evUser;
|
||||
|
||||
if (!dbevEventUserFreeList) {
|
||||
freeListInitPvt(&dbevEventUserFreeList,
|
||||
@@ -326,7 +335,7 @@ dbEventCtx epicsShareAPI db_init_events (void)
|
||||
*/
|
||||
void epicsShareAPI db_close_events (dbEventCtx ctx)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
/*
|
||||
* Exit not forced on event blocks for now - this is left to channel
|
||||
@@ -336,13 +345,32 @@ void epicsShareAPI db_close_events (dbEventCtx ctx)
|
||||
* NOTE: not deleting events before calling this routine could be
|
||||
* hazardous to the system's health.
|
||||
*/
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
evUser->pendexit = TRUE;
|
||||
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
/* notify the waiting task */
|
||||
epicsEventSignal(evUser->ppendsem);
|
||||
}
|
||||
|
||||
/*
|
||||
* create_ev_que()
|
||||
*/
|
||||
static struct event_que * create_ev_que ( struct event_user * const evUser )
|
||||
{
|
||||
struct event_que * const ev_que = (struct event_que *)
|
||||
freeListCalloc ( dbevEventQueueFreeList );
|
||||
if ( ! ev_que ) {
|
||||
return NULL;
|
||||
}
|
||||
ev_que->writelock = epicsMutexCreate();
|
||||
if ( ! ev_que->writelock ) {
|
||||
freeListFree ( dbevEventQueueFreeList, ev_que );
|
||||
return NULL;
|
||||
}
|
||||
ev_que->evUser = evUser;
|
||||
return ev_que;
|
||||
}
|
||||
|
||||
/*
|
||||
* DB_ADD_EVENT()
|
||||
*/
|
||||
@@ -350,13 +378,9 @@ dbEventSubscription epicsShareAPI db_add_event (
|
||||
dbEventCtx ctx, struct dbAddr *paddr,
|
||||
EVENTFUNC *user_sub, void *user_arg, unsigned select)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct dbCommon *precord;
|
||||
struct event_que *ev_que;
|
||||
struct event_que *tmp_que;
|
||||
struct evSubscrip *pevent;
|
||||
|
||||
precord = paddr->precord;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
struct event_que * ev_que;
|
||||
struct evSubscrip * pevent;
|
||||
|
||||
/*
|
||||
* Don't add events which will not be triggered
|
||||
@@ -365,38 +389,42 @@ dbEventSubscription epicsShareAPI db_add_event (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pevent = freeListCalloc (dbevEventBlockFreeList);
|
||||
if (!pevent) {
|
||||
pevent = freeListCalloc ( dbevEventBlockFreeList );
|
||||
if ( ! pevent ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* find an event que block with enough quota */
|
||||
/* otherwise add a new one to the list */
|
||||
ev_que = &evUser->firstque;
|
||||
while (TRUE) {
|
||||
if (ev_que->quota + ev_que->nCanceled < EVENTQUESIZE - EVENTENTRIES) {
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
ev_que = & evUser->firstque;
|
||||
while ( TRUE ) {
|
||||
int success = 0;
|
||||
LOCKEVQUE ( ev_que );
|
||||
success = ( ev_que->quota + ev_que->nCanceled <
|
||||
EVENTQUESIZE - EVENTENTRIES );
|
||||
if ( success ) {
|
||||
ev_que->quota += EVENTENTRIES;
|
||||
}
|
||||
UNLOCKEVQUE ( ev_que );
|
||||
if ( success ) {
|
||||
break;
|
||||
}
|
||||
if (!ev_que->nextque) {
|
||||
tmp_que = (struct event_que *)
|
||||
freeListCalloc(dbevEventQueueFreeList);
|
||||
if (!tmp_que) {
|
||||
freeListFree (dbevEventBlockFreeList, pevent);
|
||||
return NULL;
|
||||
if ( ! ev_que->nextque ) {
|
||||
ev_que->nextque = create_ev_que ( evUser );
|
||||
if ( ! ev_que->nextque ) {
|
||||
ev_que = NULL;
|
||||
break;
|
||||
}
|
||||
tmp_que->evUser = evUser;
|
||||
tmp_que->writelock = epicsMutexCreate();
|
||||
if (!tmp_que->writelock) {
|
||||
freeListFree (dbevEventBlockFreeList, pevent);
|
||||
freeListFree (dbevEventQueueFreeList, tmp_que);
|
||||
return NULL;
|
||||
}
|
||||
ev_que->nextque = tmp_que;
|
||||
ev_que = tmp_que;
|
||||
break;
|
||||
}
|
||||
ev_que = ev_que->nextque;
|
||||
}
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
|
||||
if ( ! ev_que ) {
|
||||
freeListFree ( dbevEventBlockFreeList, pevent );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pevent->npend = 0ul;
|
||||
pevent->nreplace = 0ul;
|
||||
@@ -409,10 +437,6 @@ dbEventSubscription epicsShareAPI db_add_event (
|
||||
pevent->enabled = FALSE;
|
||||
pevent->ev_que = ev_que;
|
||||
|
||||
LOCKEVQUE(ev_que);
|
||||
ev_que->quota += EVENTENTRIES;
|
||||
UNLOCKEVQUE(ev_que);
|
||||
|
||||
/*
|
||||
* Simple types values queued up for reliable interprocess
|
||||
* communication (for other types they get whatever happens to be
|
||||
@@ -434,10 +458,9 @@ dbEventSubscription epicsShareAPI db_add_event (
|
||||
*/
|
||||
void epicsShareAPI db_event_enable (dbEventSubscription es)
|
||||
{
|
||||
struct evSubscrip *pevent = (struct evSubscrip *) es;
|
||||
struct dbCommon *precord;
|
||||
|
||||
precord = (struct dbCommon *) pevent->paddr->precord;
|
||||
struct evSubscrip * const pevent = (struct evSubscrip *) es;
|
||||
struct dbCommon * const precord =
|
||||
(struct dbCommon *) pevent->paddr->precord;
|
||||
|
||||
LOCKREC(precord);
|
||||
if ( ! pevent->enabled ) {
|
||||
@@ -452,10 +475,9 @@ void epicsShareAPI db_event_enable (dbEventSubscription es)
|
||||
*/
|
||||
void epicsShareAPI db_event_disable (dbEventSubscription es)
|
||||
{
|
||||
struct evSubscrip *pevent = (struct evSubscrip *) es;
|
||||
struct dbCommon *precord;
|
||||
|
||||
precord = (struct dbCommon *) pevent->paddr->precord;
|
||||
struct evSubscrip * const pevent = (struct evSubscrip *) es;
|
||||
struct dbCommon * const precord =
|
||||
(struct dbCommon *) pevent->paddr->precord;
|
||||
|
||||
LOCKREC(precord);
|
||||
if ( pevent->enabled ) {
|
||||
@@ -472,7 +494,7 @@ void epicsShareAPI db_event_disable (dbEventSubscription es)
|
||||
static void event_remove ( struct event_que *ev_que,
|
||||
unsigned short index, struct evSubscrip *placeHolder )
|
||||
{
|
||||
struct evSubscrip *pEvent = ev_que->evque[index];
|
||||
struct evSubscrip * const pEvent = ev_que->evque[index];
|
||||
|
||||
ev_que->evque[index] = placeHolder;
|
||||
if ( pEvent->npend == 1u ) {
|
||||
@@ -495,12 +517,9 @@ static void event_remove ( struct event_que *ev_que,
|
||||
*/
|
||||
void epicsShareAPI db_cancel_event (dbEventSubscription es)
|
||||
{
|
||||
struct evSubscrip * pevent = ( struct evSubscrip * ) es;
|
||||
struct dbCommon * precord;
|
||||
struct evSubscrip * const pevent = ( struct evSubscrip * ) es;
|
||||
unsigned short getix;
|
||||
|
||||
precord = ( struct dbCommon * ) pevent->paddr->precord;
|
||||
|
||||
db_event_disable ( es );
|
||||
|
||||
/*
|
||||
@@ -564,12 +583,12 @@ void epicsShareAPI db_cancel_event (dbEventSubscription es)
|
||||
*/
|
||||
void epicsShareAPI db_flush_extra_labor_event (dbEventCtx ctx)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
while ( evUser->extraLaborBusy ) {
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
epicsThreadSleep(1.0);
|
||||
epicsThreadSleep(0.1);
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
}
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
@@ -585,7 +604,7 @@ void epicsShareAPI db_flush_extra_labor_event (dbEventCtx ctx)
|
||||
int epicsShareAPI db_add_extra_labor_event (
|
||||
dbEventCtx ctx, EXTRALABORFUNC *func, void *arg)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
evUser->extralabor_sub = func;
|
||||
@@ -600,7 +619,7 @@ int epicsShareAPI db_add_extra_labor_event (
|
||||
*/
|
||||
int epicsShareAPI db_post_extra_labor (dbEventCtx ctx)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
int doit;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
@@ -627,12 +646,10 @@ int epicsShareAPI db_post_extra_labor (dbEventCtx ctx)
|
||||
*/
|
||||
static void db_post_single_event_private (struct evSubscrip *event)
|
||||
{
|
||||
struct event_que *ev_que;
|
||||
db_field_log *pLog;
|
||||
int firstEventFlag;
|
||||
unsigned rngSpace;
|
||||
|
||||
ev_que = event->ev_que;
|
||||
struct event_que * const ev_que = event->ev_que;
|
||||
db_field_log * pLog;
|
||||
int firstEventFlag;
|
||||
unsigned rngSpace;
|
||||
|
||||
/*
|
||||
* evUser ring buffer must be locked for the multiple
|
||||
@@ -747,10 +764,10 @@ void *pField,
|
||||
unsigned int caEventMask
|
||||
)
|
||||
{
|
||||
struct dbCommon *pdbc = (struct dbCommon *)pRecord;
|
||||
struct evSubscrip *event;
|
||||
struct dbCommon * const pdbc = (struct dbCommon *)pRecord;
|
||||
struct evSubscrip * event;
|
||||
|
||||
if (pdbc->mlis.count == 0) return DB_EVENT_OK; /* no monitors set */
|
||||
if (pdbc->mlis.count == 0) return DB_EVENT_OK; /* no monitors set */
|
||||
|
||||
LOCKREC(pdbc);
|
||||
|
||||
@@ -762,8 +779,7 @@ unsigned int caEventMask
|
||||
* changed or pval==NULL and waiting on alarms and alarms changed
|
||||
*/
|
||||
if ( (event->paddr->pfield == (void *)pField || pField==NULL) &&
|
||||
(caEventMask & event->select)) {
|
||||
|
||||
(caEventMask & event->select) ) {
|
||||
db_post_single_event_private (event);
|
||||
}
|
||||
}
|
||||
@@ -778,8 +794,8 @@ unsigned int caEventMask
|
||||
*/
|
||||
void epicsShareAPI db_post_single_event (dbEventSubscription es)
|
||||
{
|
||||
struct evSubscrip *event = (struct evSubscrip *) es;
|
||||
struct dbCommon *precord = event->paddr->precord;
|
||||
struct evSubscrip * const event = (struct evSubscrip *) es;
|
||||
struct dbCommon * const precord = event->paddr->precord;
|
||||
|
||||
dbScanLock (precord);
|
||||
db_post_single_event_private (event);
|
||||
@@ -898,8 +914,8 @@ static int event_read ( struct event_que *ev_que )
|
||||
*/
|
||||
static void event_task (void *pParm)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) pParm;
|
||||
struct event_que *ev_que;
|
||||
struct event_user * const evUser = (struct event_user *) pParm;
|
||||
struct event_que * ev_que;
|
||||
|
||||
/* init hook */
|
||||
if (evUser->init_func) {
|
||||
@@ -934,12 +950,14 @@ static void event_task (void *pParm)
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
}
|
||||
evUser->extraLaborBusy = FALSE;
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
|
||||
for ( ev_que = &evUser->firstque; ev_que;
|
||||
ev_que = ev_que->nextque ) {
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
event_read (ev_que);
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
}
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
|
||||
} while( ! evUser->pendexit );
|
||||
|
||||
@@ -975,7 +993,7 @@ int epicsShareAPI db_start_events (
|
||||
dbEventCtx ctx,const char *taskname, void (*init_func)(void *),
|
||||
void *init_func_arg, unsigned osiPriority )
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
|
||||
@@ -995,7 +1013,8 @@ int epicsShareAPI db_start_events (
|
||||
taskname = EVENT_PEND_NAME;
|
||||
}
|
||||
evUser->taskid = epicsThreadCreate (
|
||||
taskname, osiPriority, epicsThreadGetStackSize(epicsThreadStackMedium),
|
||||
taskname, osiPriority,
|
||||
epicsThreadGetStackSize(epicsThreadStackMedium),
|
||||
event_task, (void *)evUser);
|
||||
if (!evUser->taskid) {
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
@@ -1008,9 +1027,10 @@ int epicsShareAPI db_start_events (
|
||||
/*
|
||||
* db_event_change_priority()
|
||||
*/
|
||||
void epicsShareAPI db_event_change_priority ( dbEventCtx ctx, unsigned epicsPriority )
|
||||
void epicsShareAPI db_event_change_priority ( dbEventCtx ctx,
|
||||
unsigned epicsPriority )
|
||||
{
|
||||
struct event_user * evUser = ( struct event_user * ) ctx;
|
||||
struct event_user * const evUser = ( struct event_user * ) ctx;
|
||||
epicsThreadSetPriority ( evUser->taskid, epicsPriority );
|
||||
}
|
||||
|
||||
@@ -1019,9 +1039,11 @@ void epicsShareAPI db_event_change_priority ( dbEventCtx ctx, unsigned epicsPrio
|
||||
*/
|
||||
void epicsShareAPI db_event_flow_ctrl_mode_on (dbEventCtx ctx)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
evUser->flowCtrlMode = TRUE;
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
/*
|
||||
* notify the event handler task
|
||||
*/
|
||||
@@ -1036,9 +1058,11 @@ void epicsShareAPI db_event_flow_ctrl_mode_on (dbEventCtx ctx)
|
||||
*/
|
||||
void epicsShareAPI db_event_flow_ctrl_mode_off (dbEventCtx ctx)
|
||||
{
|
||||
struct event_user *evUser = (struct event_user *) ctx;
|
||||
struct event_user * const evUser = (struct event_user *) ctx;
|
||||
|
||||
epicsMutexMustLock ( evUser->lock );
|
||||
evUser->flowCtrlMode = FALSE;
|
||||
epicsMutexUnlock ( evUser->lock );
|
||||
/*
|
||||
* notify the event handler task
|
||||
*/
|
||||
|
||||
@@ -74,7 +74,7 @@ void dbPutNotifyBlocker::cancel (
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
if ( this->pn.paddr ) {
|
||||
if ( this->pNotify ) {
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
dbNotifyCancel ( &this->pn );
|
||||
}
|
||||
@@ -100,26 +100,31 @@ void dbPutNotifyBlocker::expandValueBuf (
|
||||
|
||||
extern "C" void putNotifyCompletion ( putNotify *ppn )
|
||||
{
|
||||
dbPutNotifyBlocker * pBlocker = static_cast < dbPutNotifyBlocker * > ( ppn->usrPvt );
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( pBlocker->mutex );
|
||||
if ( pBlocker->pNotify ) {
|
||||
if ( pBlocker->pn.status != putNotifyOK) {
|
||||
pBlocker->pNotify->exception (
|
||||
guard, ECA_PUTFAIL, "put notify unsuccessful",
|
||||
static_cast <unsigned> (pBlocker->pn.dbrType),
|
||||
static_cast <unsigned> (pBlocker->pn.nRequest) );
|
||||
}
|
||||
else {
|
||||
pBlocker->pNotify->completion ( guard );
|
||||
}
|
||||
dbPutNotifyBlocker * const pBlocker =
|
||||
static_cast < dbPutNotifyBlocker * > ( ppn->usrPvt );
|
||||
epicsGuard < epicsMutex > guard ( pBlocker->mutex );
|
||||
cacWriteNotify * const pNtfy = pBlocker->pNotify;
|
||||
if ( pNtfy ) {
|
||||
pBlocker->pNotify = 0;
|
||||
// Its necessary to signal the initiators now before we call
|
||||
// the user callback. This is less efficent, and potentially
|
||||
// causes more thread context switching, but its probably
|
||||
// unavoidable because its possible that the use callback
|
||||
// might destroy this object.
|
||||
pBlocker->block.signal ();
|
||||
if ( pBlocker->pn.status != putNotifyOK ) {
|
||||
pNtfy->exception (
|
||||
guard, ECA_PUTFAIL, "put notify unsuccessful",
|
||||
static_cast < unsigned > (pBlocker->pn.dbrType),
|
||||
static_cast < unsigned > (pBlocker->pn.nRequest) );
|
||||
}
|
||||
else {
|
||||
errlogPrintf ( "put notify completion with nill pNotify?\n" );
|
||||
pNtfy->completion ( guard );
|
||||
}
|
||||
pBlocker->pNotify = 0;
|
||||
}
|
||||
pBlocker->block.signal ();
|
||||
else {
|
||||
errlogPrintf ( "put notify completion with nill pNotify?\n" );
|
||||
}
|
||||
}
|
||||
|
||||
void dbPutNotifyBlocker::initiatePutNotify (
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
@@ -19,7 +19,7 @@ SRC_DIRS += $(TOP)/src/makeBaseApp/top/caServerApp
|
||||
#
|
||||
# Added ws2_32 winmm user32 for the non-dll build
|
||||
#
|
||||
SYS_PROD_LIBS_WIN32 += ws2_32 advapi32 user32
|
||||
PROD_SYS_LIBS_WIN32 += ws2_32 advapi32 user32
|
||||
|
||||
|
||||
PROD_HOST = excas
|
||||
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
void * pInstance () const;
|
||||
private:
|
||||
void * _pInstance;
|
||||
size_t _refCount;
|
||||
std :: size_t _refCount;
|
||||
SingletonUntyped ( const SingletonUntyped & );
|
||||
SingletonUntyped & operator = ( const SingletonUntyped & );
|
||||
};
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
/*Declare storage for errVerbose */
|
||||
epicsShareDef int errVerbose = 0;
|
||||
|
||||
static void errlogCleanup(void);
|
||||
static void exitHandler(void *);
|
||||
static void errlogThread(void);
|
||||
|
||||
@@ -119,10 +118,11 @@ epicsShareFunc int errlogPrintf(const char *pFormat, ...)
|
||||
errlogInit(0);
|
||||
if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
|
||||
va_start(pvar, pFormat);
|
||||
vfprintf(stderr, pFormat, pvar);
|
||||
nchar = vfprintf(stderr, pFormat, pvar);
|
||||
va_end (pvar);
|
||||
fflush(stderr);
|
||||
}
|
||||
if (pvtData.atExit) return nchar;
|
||||
pbuffer = msgbufGetFree(isOkToBlock);
|
||||
if (!pbuffer) return 0;
|
||||
va_start(pvar, pFormat);
|
||||
@@ -390,8 +390,15 @@ static void exitHandler(void *pvt)
|
||||
pvtData.atExit = 1;
|
||||
epicsEventSignal(pvtData.waitForWork);
|
||||
epicsEventMustWait(pvtData.waitForExit);
|
||||
|
||||
free(pvtData.pbuffer);
|
||||
epicsMutexDestroy(pvtData.flushLock);
|
||||
epicsEventDestroy(pvtData.flush);
|
||||
epicsEventDestroy(pvtData.waitForFlush);
|
||||
epicsMutexDestroy(pvtData.listenerLock);
|
||||
epicsMutexDestroy(pvtData.msgQueueLock);
|
||||
epicsEventDestroy(pvtData.waitForWork);
|
||||
epicsEventDestroy(pvtData.waitForExit);
|
||||
return;
|
||||
}
|
||||
|
||||
struct initArgs {
|
||||
@@ -431,18 +438,6 @@ static void errlogInitPvt(void *arg)
|
||||
pvtData.errlogInitFailed = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void errlogCleanup(void)
|
||||
{
|
||||
free(pvtData.pbuffer);
|
||||
epicsMutexDestroy(pvtData.flushLock);
|
||||
epicsEventDestroy(pvtData.flush);
|
||||
epicsEventDestroy(pvtData.waitForFlush);
|
||||
epicsMutexDestroy(pvtData.listenerLock);
|
||||
epicsMutexDestroy(pvtData.msgQueueLock);
|
||||
epicsEventDestroy(pvtData.waitForWork);
|
||||
/*Note that exitHandler must destroy waitForExit*/
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI errlogInit2(int bufsize, int maxMsgSize)
|
||||
{
|
||||
@@ -494,9 +489,7 @@ static void errlogThread(void)
|
||||
epicsAtExit(exitHandler,0);
|
||||
while (TRUE) {
|
||||
epicsEventMustWait(pvtData.waitForWork);
|
||||
if (pvtData.atExit) break;
|
||||
while ((pmessage = msgbufGetSend(&noConsoleMessage))) {
|
||||
if (pvtData.atExit) break;
|
||||
epicsMutexMustLock(pvtData.listenerLock);
|
||||
if (pvtData.toConsole && !noConsoleMessage) {
|
||||
fprintf(stderr,"%s",pmessage);
|
||||
@@ -515,7 +508,6 @@ static void errlogThread(void)
|
||||
epicsThreadSleep(.2); /*just wait an extra .2 seconds*/
|
||||
epicsEventSignal(pvtData.waitForFlush);
|
||||
}
|
||||
errlogCleanup();
|
||||
epicsEventSignal(pvtData.waitForExit);
|
||||
}
|
||||
|
||||
@@ -533,8 +525,10 @@ static msgNode *msgbufGetNode(void)
|
||||
char *plimit = pbuffer + pvtData.buffersize;
|
||||
|
||||
pnextFree = plast->message + adjustToWorstCaseAlignment(plast->length);
|
||||
if (pfirst <= plast &&
|
||||
pnextFree + pvtData.msgNeeded > plimit) {
|
||||
if (pfirst > plast) {
|
||||
plimit = (char *)pfirst;
|
||||
}
|
||||
else if (pnextFree + pvtData.msgNeeded > plimit) {
|
||||
pnextFree = pbuffer; /* Hit end, wrap to start */
|
||||
plimit = (char *)pfirst;
|
||||
}
|
||||
@@ -552,7 +546,9 @@ static char *msgbufGetFree(int noConsoleMessage)
|
||||
{
|
||||
msgNode *pnextSend;
|
||||
|
||||
epicsMutexMustLock(pvtData.msgQueueLock);
|
||||
if (epicsMutexLock(pvtData.msgQueueLock) != epicsMutexLockOK)
|
||||
return 0;
|
||||
|
||||
if ((ellCount(&pvtData.msgQueue) == 0) && pvtData.missedMessages) {
|
||||
int nchar;
|
||||
|
||||
|
||||
@@ -798,6 +798,8 @@ iocshBody (const char *pathname, const char *commandLine)
|
||||
int epicsShareAPI
|
||||
iocsh (const char *pathname)
|
||||
{
|
||||
if (pathname)
|
||||
epicsEnvSet("IOCSH_STARTUP_SCRIPT", pathname);
|
||||
return iocshBody(pathname, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
/*
|
||||
* Deprecation marker
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
#if defined( __GNUC__ ) && (__GNUC__ > 2)
|
||||
# define EPICS_DEPRECATED __attribute__((deprecated))
|
||||
#else
|
||||
# define EPICS_DEPRECATED
|
||||
|
||||
@@ -169,6 +169,8 @@ bool epicsThread::exitWait ( const double delay ) throw ()
|
||||
"epicsThread::exitWait()\n" );
|
||||
epicsThreadSleep ( epicsMin ( delay, 5.0 ) );
|
||||
}
|
||||
// the event mechanism is used for other purposes
|
||||
this->event.signal ();
|
||||
return this->terminated;
|
||||
}
|
||||
|
||||
|
||||
@@ -74,8 +74,6 @@ public:
|
||||
bool useDiffTimeOptimization;
|
||||
};
|
||||
|
||||
static const epicsTimeLoadTimeInit lti;
|
||||
|
||||
//
|
||||
// epicsTimeLoadTimeInit ()
|
||||
//
|
||||
@@ -125,6 +123,9 @@ inline void epicsTime::addNanoSec (long nSecAdj)
|
||||
//
|
||||
epicsTime::epicsTime ( const time_t_wrapper & ansiTimeTicks )
|
||||
{
|
||||
// avoid c++ static initialization order issues
|
||||
static epicsTimeLoadTimeInit & lti = * new epicsTimeLoadTimeInit ();
|
||||
|
||||
//
|
||||
// try to directly map time_t into an unsigned long integer because this is
|
||||
// faster on systems w/o hardware floating point and a simple integer type time_t.
|
||||
@@ -212,6 +213,8 @@ epicsTime epicsTime::getEvent (const epicsTimeEvent &event)
|
||||
//
|
||||
epicsTime::operator time_t_wrapper () const
|
||||
{
|
||||
// avoid c++ static initialization order issues
|
||||
static epicsTimeLoadTimeInit & lti = * new epicsTimeLoadTimeInit ();
|
||||
time_t_wrapper wrap;
|
||||
|
||||
if ( lti.useDiffTimeOptimization ) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Saskatchewan
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
@@ -13,10 +12,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -24,8 +19,6 @@ extern "C" {
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
/*#include <sys/filio.h>
|
||||
#include <sys/sockio.h>*/
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
@@ -34,10 +27,6 @@ extern "C" {
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef int SOCKET;
|
||||
#define INVALID_SOCKET (-1)
|
||||
#define SOCKERRNO errno
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
@@ -26,10 +25,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -37,8 +32,6 @@ extern "C" {
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
/*#include <sys/filio.h>
|
||||
#include <sys/sockio.h>*/
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
@@ -47,10 +40,6 @@ extern "C" {
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef int SOCKET;
|
||||
#define INVALID_SOCKET (-1)
|
||||
#define SOCKERRNO errno
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Saskatchewan
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
@@ -14,10 +13,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -32,6 +27,10 @@ extern "C" {
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <rtems/rtems_bsdnet_internal.h>
|
||||
#include "epicsTime.h"
|
||||
#include "osdTime.h"
|
||||
#include "osiNTPTime.h"
|
||||
@@ -117,17 +118,21 @@ double rtemsTicksPerSecond_double, rtemsTicksPerTwoSeconds_double;
|
||||
* explicitly calls osdTimeRegister() at the appropriate time.
|
||||
* However if we are loaded dynamically we *do* register our
|
||||
* standard time providers at static constructor time; in this
|
||||
* case the tick rate will have been set already.
|
||||
* case the network is available already.
|
||||
*/
|
||||
static int staticTimeRegister(void)
|
||||
{
|
||||
if (rtemsTicksPerSecond != 0)
|
||||
osdTimeRegister();
|
||||
|
||||
rtems_clock_get (RTEMS_CLOCK_GET_TICKS_PER_SECOND, &rtemsTicksPerSecond);
|
||||
rtemsTicksPerSecond_double = rtemsTicksPerSecond;
|
||||
rtemsTicksPerTwoSeconds_double = rtemsTicksPerSecond_double * 2.0;
|
||||
|
||||
/* If networking is already up at the time static constructors
|
||||
* are executed then we are probably run-time loaded and it's
|
||||
* OK to osdTimeRegister() at this point.
|
||||
*/
|
||||
if (rtems_bsdnet_ticks_per_second != 0)
|
||||
osdTimeRegister();
|
||||
|
||||
return 1;
|
||||
}
|
||||
static int done = staticTimeRegister();
|
||||
|
||||
@@ -3,15 +3,12 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
@@ -25,9 +22,6 @@ extern "C" {
|
||||
#endif
|
||||
#include <winsock2.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define SOCKERRNO WSAGetLastError()
|
||||
|
||||
@@ -79,3 +73,4 @@ typedef int osiSocklen_t;
|
||||
|
||||
epicsShareFunc unsigned epicsShareAPI wsaMajorVersion ();
|
||||
|
||||
#endif /*osdSockH*/
|
||||
|
||||
@@ -124,7 +124,7 @@ BOOL WINAPI DllMain (
|
||||
#if _WIN32_WINNT >= 0x0501
|
||||
/*
|
||||
* Only in WXP
|
||||
* Thats a shame becaus ethis is probably much faster
|
||||
* Thats a shame because this is probably much faster
|
||||
*/
|
||||
success = GetModuleHandleEx (
|
||||
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
|
||||
@@ -268,13 +268,10 @@ static void threadCleanupWIN32 ( void )
|
||||
return;
|
||||
}
|
||||
|
||||
while ( ( pParm = ( win32ThreadParam * ) ellFirst ( & pGbl->threadList ) ) ) {
|
||||
while ( ( pParm = ( win32ThreadParam * )
|
||||
ellFirst ( & pGbl->threadList ) ) ) {
|
||||
epicsParmCleanupWIN32 ( pParm );
|
||||
}
|
||||
|
||||
TlsFree ( pGbl->tlsIndexThreadLibraryEPICS );
|
||||
|
||||
DeleteCriticalSection ( & pGbl->mutex );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -446,7 +443,8 @@ epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadHighestPriority
|
||||
/*
|
||||
* epicsThreadGetStackSize ()
|
||||
*/
|
||||
epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize ( epicsThreadStackSizeClass stackSizeClass )
|
||||
epicsShareFunc unsigned int epicsShareAPI
|
||||
epicsThreadGetStackSize ( epicsThreadStackSizeClass stackSizeClass )
|
||||
{
|
||||
static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000, 6000, 11000};
|
||||
|
||||
@@ -628,18 +626,21 @@ epicsShareFunc epicsThreadId epicsShareAPI epicsThreadCreate (const char *pName,
|
||||
free ( pParmWIN32 );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EnterCriticalSection ( & pGbl->mutex );
|
||||
ellAdd ( & pGbl->threadList, & pParmWIN32->node );
|
||||
LeaveCriticalSection ( & pGbl->mutex );
|
||||
|
||||
wstat = ResumeThread ( pParmWIN32->handle );
|
||||
if (wstat==0xFFFFFFFF) {
|
||||
EnterCriticalSection ( & pGbl->mutex );
|
||||
ellDelete ( & pGbl->threadList, & pParmWIN32->node );
|
||||
LeaveCriticalSection ( & pGbl->mutex );
|
||||
CloseHandle ( pParmWIN32->handle );
|
||||
free ( pParmWIN32 );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EnterCriticalSection ( & pGbl->mutex );
|
||||
ellAdd ( & pGbl->threadList, & pParmWIN32->node );
|
||||
LeaveCriticalSection ( & pGbl->mutex );
|
||||
|
||||
return ( epicsThreadId ) pParmWIN32;
|
||||
}
|
||||
|
||||
@@ -955,10 +956,17 @@ static void epicsThreadShowPrivate ( epicsThreadId id, unsigned level )
|
||||
(void *) pParm, idForFormat, pParm->epicsPriority,
|
||||
epics_GetThreadPriorityAsString ( pParm->handle ),
|
||||
epicsThreadIsSuspended ( id ) ? "suspend" : "ok" );
|
||||
if ( level ) {
|
||||
fprintf (epicsGetStdout(), " %-8p %-8p ",
|
||||
(void *) pParm->handle, (void *) pParm->parm );
|
||||
}
|
||||
}
|
||||
else {
|
||||
fprintf (epicsGetStdout(),
|
||||
"NAME EPICS-ID WIN32-ID EPICS-PRI WIN32-PRI STATE " );
|
||||
if ( level ) {
|
||||
fprintf (epicsGetStdout(), " HANDLE FUNCTION PARAMETER" );
|
||||
}
|
||||
}
|
||||
fprintf (epicsGetStdout(),"\n" );
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ static int osdTimeGetCurrent ( epicsTimeStamp *pDest );
|
||||
// for mingw
|
||||
#if !defined ( MAXLONGLONG )
|
||||
#define MAXLONGLONG LL_CONSTANT(0x7fffffffffffffff)
|
||||
#define MINLONGLONG LL_CONSTANT(~0x7fffffffffffffff)
|
||||
#endif
|
||||
|
||||
static const LONGLONG epicsEpochInFileTime = LL_CONSTANT(0x01b41e2a18d64000);
|
||||
@@ -81,7 +82,7 @@ private:
|
||||
epicsTimerQueueActive * pTimerQueue;
|
||||
epicsTimer * pTimer;
|
||||
bool perfCtrPresent;
|
||||
|
||||
static const int pllDelay; /* integer seconds */
|
||||
epicsTimerNotify::expireStatus expire ( const epicsTime & );
|
||||
};
|
||||
|
||||
@@ -91,6 +92,8 @@ static const LONGLONG EPICS_TIME_TICKS_PER_SEC = 1000000000;
|
||||
static const LONGLONG ET_TICKS_PER_FT_TICK =
|
||||
EPICS_TIME_TICKS_PER_SEC / FILE_TIME_TICKS_PER_SEC;
|
||||
|
||||
const int currentTime :: pllDelay = 5;
|
||||
|
||||
//
|
||||
// Start and register time provider
|
||||
//
|
||||
@@ -302,8 +305,8 @@ currentTime::currentTime () :
|
||||
}
|
||||
else {
|
||||
errlogPrintf (
|
||||
"win32 osdTime.cpp detected questionable "
|
||||
"system date prior to EPICS epoch\n" );
|
||||
"win32 osdTime.cpp init detected questionable "
|
||||
"system date prior to EPICS epoch, epics time will not advance\n" );
|
||||
this->epicsTimeLast = 0;
|
||||
}
|
||||
|
||||
@@ -346,7 +349,7 @@ void currentTime::getCurrentTime ( epicsTimeStamp & dest )
|
||||
// counter resolution will more than likely improve over time.
|
||||
//
|
||||
offset = ( MAXLONGLONG - this->lastPerfCounter )
|
||||
+ ( curPerfCounter.QuadPart + MAXLONGLONG );
|
||||
+ ( curPerfCounter.QuadPart - MINLONGLONG ) + 1;
|
||||
}
|
||||
if ( offset < MAXLONGLONG / EPICS_TIME_TICKS_PER_SEC ) {
|
||||
offset *= EPICS_TIME_TICKS_PER_SEC;
|
||||
@@ -392,6 +395,8 @@ void currentTime::getCurrentTime ( epicsTimeStamp & dest )
|
||||
//
|
||||
epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
{
|
||||
EnterCriticalSection ( & this->mutex );
|
||||
|
||||
// avoid interruptions by briefly becoming a time critical thread
|
||||
LARGE_INTEGER curFileTime;
|
||||
LARGE_INTEGER curPerfCounter;
|
||||
@@ -407,10 +412,8 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
curFileTime.HighPart = ft.dwHighDateTime;
|
||||
}
|
||||
|
||||
EnterCriticalSection ( & this->mutex );
|
||||
|
||||
LONGLONG perfCounterDiff = curPerfCounter.QuadPart - this->lastPerfCounterPLL;
|
||||
if ( curPerfCounter.QuadPart >= this->lastPerfCounter ) {
|
||||
LONGLONG perfCounterDiff;
|
||||
if ( curPerfCounter.QuadPart >= this->lastPerfCounterPLL ) {
|
||||
perfCounterDiff = curPerfCounter.QuadPart - this->lastPerfCounterPLL;
|
||||
}
|
||||
else {
|
||||
@@ -424,7 +427,7 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
// counter resolution will more than likely improve over time.
|
||||
//
|
||||
perfCounterDiff = ( MAXLONGLONG - this->lastPerfCounterPLL )
|
||||
+ ( curPerfCounter.QuadPart + MAXLONGLONG );
|
||||
+ ( curPerfCounter.QuadPart - MINLONGLONG ) + 1;
|
||||
}
|
||||
this->lastPerfCounterPLL = curPerfCounter.QuadPart;
|
||||
|
||||
@@ -432,10 +435,10 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
this->lastFileTimePLL = curFileTime.QuadPart;
|
||||
|
||||
// discard glitches
|
||||
if ( fileTimeDiff == 0 ) {
|
||||
if ( fileTimeDiff <= 0 ) {
|
||||
LeaveCriticalSection( & this->mutex );
|
||||
debugPrintf ( ( "currentTime: file time difference in PLL was zero\n" ) );
|
||||
return expireStatus ( restart, 1.0 /* sec */ );
|
||||
debugPrintf ( ( "currentTime: file time difference in PLL was less than zero\n" ) );
|
||||
return expireStatus ( restart, pllDelay /* sec */ );
|
||||
}
|
||||
|
||||
LONGLONG freq = ( FILE_TIME_TICKS_PER_SEC * perfCounterDiff ) / fileTimeDiff;
|
||||
@@ -449,7 +452,7 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
static_cast < int > ( -bound ),
|
||||
static_cast < int > ( delta ),
|
||||
static_cast < int > ( bound ) ) );
|
||||
return expireStatus ( restart, 1.0 /* sec */ );
|
||||
return expireStatus ( restart, pllDelay /* sec */ );
|
||||
}
|
||||
|
||||
// update feedback loop estimating the performance counter's frequency
|
||||
@@ -473,7 +476,21 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
//
|
||||
perfCounterDiffSinceLastFetch =
|
||||
( MAXLONGLONG - this->lastPerfCounter )
|
||||
+ ( curPerfCounter.QuadPart + MAXLONGLONG );
|
||||
+ ( curPerfCounter.QuadPart - MINLONGLONG ) + 1;
|
||||
}
|
||||
|
||||
// discard performance counter delay measurement glitches
|
||||
{
|
||||
const LONGLONG expectedDly = this->perfCounterFreq * pllDelay;
|
||||
const LONGLONG bnd = expectedDly / 4;
|
||||
if ( perfCounterDiffSinceLastFetch <= 0 ||
|
||||
perfCounterDiffSinceLastFetch >= expectedDly + bnd ) {
|
||||
LeaveCriticalSection( & this->mutex );
|
||||
debugPrintf ( ( "perf ctr measured delay out of bounds m=%d max=%d\n",
|
||||
static_cast < int > ( perfCounterDiffSinceLastFetch ),
|
||||
static_cast < int > ( expectedDly + bnd ) ) );
|
||||
return expireStatus ( restart, pllDelay /* sec */ );
|
||||
}
|
||||
}
|
||||
|
||||
// Update the current estimated time.
|
||||
@@ -482,9 +499,32 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
/ this->perfCounterFreq;
|
||||
this->lastPerfCounter = curPerfCounter.QuadPart;
|
||||
|
||||
LONGLONG epicsTimeFromCurrentFileTime =
|
||||
( curFileTime.QuadPart - epicsEpochInFileTime ) *
|
||||
ET_TICKS_PER_FT_TICK;
|
||||
LONGLONG epicsTimeFromCurrentFileTime;
|
||||
|
||||
{
|
||||
static bool firstMessageWasSent = false;
|
||||
if ( curFileTime.QuadPart >= epicsEpochInFileTime ) {
|
||||
epicsTimeFromCurrentFileTime =
|
||||
( curFileTime.QuadPart - epicsEpochInFileTime ) *
|
||||
ET_TICKS_PER_FT_TICK;
|
||||
firstMessageWasSent = false;
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* if the system time jumps to before the EPICS epoch
|
||||
* then latch to the EPICS epoch printing only one
|
||||
* warning message the first time that the issue is
|
||||
* detected
|
||||
*/
|
||||
if ( ! firstMessageWasSent ) {
|
||||
errlogPrintf (
|
||||
"win32 osdTime.cpp time PLL update detected questionable "
|
||||
"system date prior to EPICS epoch, epics time will not advance\n" );
|
||||
firstMessageWasSent = true;
|
||||
}
|
||||
epicsTimeFromCurrentFileTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
delta = epicsTimeFromCurrentFileTime - this->epicsTimeLast;
|
||||
if ( delta > EPICS_TIME_TICKS_PER_SEC || delta < -EPICS_TIME_TICKS_PER_SEC ) {
|
||||
@@ -537,7 +577,7 @@ epicsTimerNotify::expireStatus currentTime::expire ( const epicsTime & )
|
||||
|
||||
LeaveCriticalSection ( & this->mutex );
|
||||
|
||||
return expireStatus ( restart, 1.0 /* sec */ );
|
||||
return expireStatus ( restart, pllDelay /* sec */ );
|
||||
}
|
||||
|
||||
void currentTime::startPLL ()
|
||||
@@ -546,7 +586,7 @@ void currentTime::startPLL ()
|
||||
if ( this->perfCtrPresent && ! this->pTimerQueue ) {
|
||||
this->pTimerQueue = & epicsTimerQueueActive::allocate ( true );
|
||||
this->pTimer = & this->pTimerQueue->createTimer ();
|
||||
this->pTimer->start ( *this, 1.0 );
|
||||
this->pTimer->start ( *this, pllDelay );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
@@ -15,10 +14,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -31,10 +26,7 @@ extern "C" {
|
||||
#include <netdb.h>
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
typedef int SOCKET;
|
||||
#define INVALID_SOCKET (-1)
|
||||
#define SOCKERRNO errno
|
||||
|
||||
@@ -10,10 +10,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -29,10 +25,6 @@ extern "C" {
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef IPPORT_USERRESERVED
|
||||
#define IPPORT_USERRESERVED 5000
|
||||
#endif
|
||||
@@ -77,7 +69,11 @@ typedef socklen_t osiSocklen_t;
|
||||
# define SHUT_RDWR 2
|
||||
#endif
|
||||
|
||||
#define ifreq_size(pifreq) (sizeof(pifreq->ifr_name))
|
||||
#if BSD4_4
|
||||
# define ifreq_size(pifreq) (pifreq->ifr_addr.sa_len + sizeof(pifreq->ifr_name))
|
||||
#else
|
||||
# define ifreq_size(pifreq) sizeof(*pifreq)
|
||||
#endif
|
||||
|
||||
#endif /*osdSockH*/
|
||||
|
||||
|
||||
@@ -13,10 +13,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -24,8 +20,6 @@ extern "C" {
|
||||
#include <sys/time.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
/*#include <sys/filio.h>
|
||||
#include <sys/sockio.h>*/
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
@@ -34,10 +28,6 @@ extern "C" {
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef int SOCKET;
|
||||
#define INVALID_SOCKET (-1)
|
||||
#define SOCKERRNO errno
|
||||
|
||||
@@ -75,6 +75,13 @@ typedef struct epicsThreadOSD {
|
||||
char *name;
|
||||
} epicsThreadOSD;
|
||||
|
||||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
|
||||
typedef struct {
|
||||
int min_pri, max_pri;
|
||||
int policy;
|
||||
} priAvailable;
|
||||
#endif
|
||||
|
||||
static pthread_key_t getpthreadInfo;
|
||||
static pthread_mutex_t onceLock;
|
||||
static pthread_mutex_t listLock;
|
||||
@@ -201,6 +208,101 @@ static void free_threadInfo(epicsThreadOSD *pthreadInfo)
|
||||
free(pthreadInfo);
|
||||
}
|
||||
|
||||
#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING)
|
||||
/*
|
||||
* The actually available range priority range (at least under linux)
|
||||
* may be restricted by resource limitations (but that is ignored
|
||||
* by sched_get_priority_max()). See bug #835138 which is fixed by
|
||||
* this code.
|
||||
*/
|
||||
|
||||
static int try_pri(int pri, int policy)
|
||||
{
|
||||
struct sched_param schedp;
|
||||
|
||||
schedp.sched_priority = pri;
|
||||
return pthread_setschedparam(pthread_self(), policy, &schedp);
|
||||
}
|
||||
|
||||
static void*
|
||||
find_pri_range(void *arg)
|
||||
{
|
||||
priAvailable *prm = arg;
|
||||
int min = sched_get_priority_min(prm->policy);
|
||||
int max = sched_get_priority_max(prm->policy);
|
||||
int low, try;
|
||||
|
||||
if ( -1 == min || -1 == max ) {
|
||||
/* something is very wrong; maintain old behavior
|
||||
* (warning message if sched_get_priority_xxx() fails
|
||||
* and use default policy's sched_priority [even if
|
||||
* that is likely to cause epicsThreadCreate to fail
|
||||
* because that priority is not suitable for SCHED_FIFO]).
|
||||
*/
|
||||
prm->min_pri = prm->max_pri = -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if ( try_pri(min, prm->policy) ) {
|
||||
/* cannot create thread at minimum priority;
|
||||
* probably no permission to use SCHED_FIFO
|
||||
* at all. However, we still must return
|
||||
* a priority range accepted by the SCHED_FIFO
|
||||
* policy. Otherwise, epicsThreadCreate() cannot
|
||||
* detect the unsufficient permission (EPERM)
|
||||
* and fall back to a non-RT thread (because
|
||||
* pthread_attr_setschedparam would fail with
|
||||
* EINVAL due to the bad priority).
|
||||
*/
|
||||
prm->min_pri = prm->max_pri = min;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Binary search through available priorities.
|
||||
* The actually available range may be restricted
|
||||
* by resource limitations (but that is ignored
|
||||
* by sched_get_priority_max() [linux]).
|
||||
*/
|
||||
low = min;
|
||||
|
||||
while ( low < max ) {
|
||||
try = (max+low)/2;
|
||||
if ( try_pri(try, prm->policy) ) {
|
||||
max = try;
|
||||
} else {
|
||||
low = try + 1;
|
||||
}
|
||||
}
|
||||
|
||||
prm->min_pri = min;
|
||||
prm->max_pri = try_pri(max, prm->policy) ? max-1 : max;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void findPriorityRange(commonAttr *a_p)
|
||||
{
|
||||
priAvailable arg;
|
||||
pthread_t id;
|
||||
void *dummy;
|
||||
int status;
|
||||
|
||||
arg.policy = a_p->schedPolicy;
|
||||
|
||||
status = pthread_create(&id, 0, find_pri_range, &arg);
|
||||
checkStatusQuit(status, "pthread_create","epicsThreadInit");
|
||||
|
||||
status = pthread_join(id, &dummy);
|
||||
checkStatusQuit(status, "pthread_join","epicsThreadInit");
|
||||
|
||||
a_p->minPriority = arg.min_pri;
|
||||
a_p->maxPriority = arg.max_pri;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void once(void)
|
||||
{
|
||||
epicsThreadOSD *pthreadInfo;
|
||||
@@ -230,13 +332,14 @@ static void once(void)
|
||||
status = pthread_attr_getschedparam(
|
||||
&pcommonAttr->attr,&pcommonAttr->schedParam);
|
||||
checkStatusOnce(status,"pthread_attr_getschedparam");
|
||||
pcommonAttr->maxPriority = sched_get_priority_max(pcommonAttr->schedPolicy);
|
||||
|
||||
findPriorityRange(pcommonAttr);
|
||||
|
||||
if(pcommonAttr->maxPriority == -1) {
|
||||
pcommonAttr->maxPriority = pcommonAttr->schedParam.sched_priority;
|
||||
fprintf(stderr,"sched_get_priority_max failed set to %d\n",
|
||||
pcommonAttr->maxPriority);
|
||||
}
|
||||
pcommonAttr->minPriority = sched_get_priority_min(pcommonAttr->schedPolicy);
|
||||
if(pcommonAttr->minPriority == -1) {
|
||||
pcommonAttr->minPriority = pcommonAttr->schedParam.sched_priority;
|
||||
fprintf(stderr,"sched_get_priority_min failed set to %d\n",
|
||||
@@ -422,7 +525,7 @@ static epicsThreadOSD *createImplicit(void)
|
||||
int status;
|
||||
|
||||
tid = pthread_self();
|
||||
sprintf(name, "non-EPICS_%d", (int)tid);
|
||||
sprintf(name, "non-EPICS_%ld", (long)tid);
|
||||
pthreadInfo = create_threadInfo(name);
|
||||
pthreadInfo->tid = tid;
|
||||
pthreadInfo->osiPriority = 0;
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
@@ -15,10 +14,6 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -35,10 +30,7 @@ extern "C" {
|
||||
#include <netdb.h>
|
||||
#include <unistd.h> /* close() and others */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
typedef int SOCKET;
|
||||
#define INVALID_SOCKET (-1)
|
||||
#define SOCKERRNO errno
|
||||
|
||||
@@ -50,9 +50,9 @@ static myISR *isrFetch(unsigned vectorNumber);
|
||||
|
||||
/*
|
||||
* this routine needs to be in the symbol table
|
||||
* for this code to work correctly
|
||||
* (i.e. not static) for this code to work correctly
|
||||
*/
|
||||
static void unsolicitedHandlerEPICS(int vectorNumber);
|
||||
void unsolicitedHandlerEPICS(int vectorNumber);
|
||||
|
||||
/*
|
||||
* this is in veclist.c
|
||||
@@ -412,8 +412,10 @@ static int vxDevInterruptInUseVME (unsigned vectorNumber)
|
||||
* interrupt and an interrupt arrives on the
|
||||
* disconnected vector
|
||||
*
|
||||
* This routine needs to be in the symbol table
|
||||
* (i.e. not static) for this code to work correctly
|
||||
*/
|
||||
static void unsolicitedHandlerEPICS(int vectorNumber)
|
||||
void unsolicitedHandlerEPICS(int vectorNumber)
|
||||
{
|
||||
/*
|
||||
* call logMsg() and not errMessage()
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
@@ -14,12 +13,10 @@
|
||||
#ifndef osdSockH
|
||||
#define osdSockH
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* This is needed for vxWorks 6.8 to prevent an obnoxious compiler warning */
|
||||
#ifndef _VSB_CONFIG_FILE
|
||||
#define _VSB_CONFIG_FILE <../lib/h/config/vsbConfig.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
@@ -36,6 +33,11 @@ extern "C" {
|
||||
#include <ioLib.h>
|
||||
#include <hostLib.h>
|
||||
#include <selectLib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*This following is not defined in any vxWorks header files*/
|
||||
int sysClkRateGet(void);
|
||||
|
||||
|
||||
@@ -224,6 +224,14 @@ static inline double MIN(double a, double b, double c, double d, double e,
|
||||
return MIN(MIN(a,b,c,d,e,f,g,h,i,j,k),l);
|
||||
}
|
||||
|
||||
/* The test code below generates lots of spurious warnings because
|
||||
* it's making sure that our operator priorities match those of C.
|
||||
* Disable them to quieten the compilation process where possible.
|
||||
*/
|
||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
|
||||
# pragma GCC diagnostic ignored "-Wparentheses"
|
||||
#endif
|
||||
|
||||
MAIN(epicsCalcTest)
|
||||
{
|
||||
int repeat;
|
||||
|
||||
@@ -143,7 +143,7 @@ MAIN(epicsErrlogTest)
|
||||
pvt.expect = "Testing";
|
||||
pvt.checkLen = strlen(pvt.expect);
|
||||
|
||||
errlogPrintfNoConsole(pvt.expect);
|
||||
errlogPrintfNoConsole("%s", pvt.expect);
|
||||
errlogFlush();
|
||||
|
||||
testOk1(pvt.count == 1);
|
||||
@@ -153,7 +153,7 @@ MAIN(epicsErrlogTest)
|
||||
pvt2.expect = pvt.expect = "Testing2";
|
||||
pvt2.checkLen = pvt.checkLen = strlen(pvt.expect);
|
||||
|
||||
errlogPrintfNoConsole(pvt.expect);
|
||||
errlogPrintfNoConsole("%s", pvt.expect);
|
||||
errlogFlush();
|
||||
|
||||
testOk1(pvt.count == 2);
|
||||
@@ -165,7 +165,7 @@ MAIN(epicsErrlogTest)
|
||||
pvt2.expect = "Testing3";
|
||||
pvt2.checkLen = strlen(pvt2.expect);
|
||||
|
||||
errlogPrintfNoConsole(pvt2.expect);
|
||||
errlogPrintfNoConsole("%s", pvt2.expect);
|
||||
errlogFlush();
|
||||
|
||||
testOk1(pvt.count == 2);
|
||||
@@ -188,7 +188,7 @@ MAIN(epicsErrlogTest)
|
||||
pvt.expect = truncmsg;
|
||||
pvt.checkLen = 255;
|
||||
|
||||
errlogPrintfNoConsole(longmsg);
|
||||
errlogPrintfNoConsole("%s", longmsg);
|
||||
errlogFlush();
|
||||
|
||||
testOk1(pvt.count == 3);
|
||||
@@ -201,7 +201,7 @@ MAIN(epicsErrlogTest)
|
||||
*/
|
||||
pvt.jam = 1;
|
||||
|
||||
errlogPrintfNoConsole(longmsg);
|
||||
errlogPrintfNoConsole("%s", longmsg);
|
||||
epicsThreadSleep(0.1);
|
||||
|
||||
testOk1(pvt.count == 3);
|
||||
@@ -227,7 +227,7 @@ MAIN(epicsErrlogTest)
|
||||
pvt.jam = 1;
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
errlogPrintfNoConsole(msg);
|
||||
errlogPrintfNoConsole("%s", msg);
|
||||
}
|
||||
|
||||
epicsEventSignal(pvt.jammer);
|
||||
@@ -258,31 +258,33 @@ MAIN(epicsErrlogTest)
|
||||
testDiag("Filling with %d messages of size %d", (int) N, (int) mlen);
|
||||
|
||||
for (i = 0; i < N; i++) {
|
||||
errlogPrintfNoConsole(msg);
|
||||
errlogPrintfNoConsole("%s", msg);
|
||||
}
|
||||
epicsThreadSleep(0.1); /* should really be a second Event */
|
||||
|
||||
testOk1(pvt.count == 0);
|
||||
|
||||
epicsThreadSleep(0.1); /* should really be a second Event */
|
||||
|
||||
pvt.jam = -2; /* Block before #th message */
|
||||
/* Extract the first 2 messages, 2*(sizeof(msgNode) + 128) bytes */
|
||||
pvt.jam = -2;
|
||||
epicsEventSignal(pvt.jammer);
|
||||
epicsThreadSleep(0.1);
|
||||
|
||||
testDiag("Drain %u messages", pvt.count);
|
||||
testDiag("Drained %u messages", pvt.count);
|
||||
testOk1(pvt.count == 2);
|
||||
|
||||
testDiag("Add two more (%d total)", (int) N+2);
|
||||
errlogPrintfNoConsole(msg);
|
||||
errlogPrintfNoConsole(msg);
|
||||
/* The buffer has space for 1 more message: sizeof(msgNode) + 256 bytes */
|
||||
errlogPrintfNoConsole("%s", msg); /* Use up that space */
|
||||
|
||||
testDiag("Overflow the buffer");
|
||||
errlogPrintfNoConsole("%s", msg);
|
||||
|
||||
testOk1(pvt.count == 2);
|
||||
|
||||
epicsEventSignal(pvt.jammer);
|
||||
epicsEventSignal(pvt.jammer); /* Empty */
|
||||
errlogFlush();
|
||||
testDiag("Logged %u messages", pvt.count);
|
||||
|
||||
testOk1(pvt.count == N+2);
|
||||
testDiag("Logged %u messages", pvt.count);
|
||||
testOk1(pvt.count == N+1);
|
||||
|
||||
/* Clean up */
|
||||
errlogRemoveListener(&logClient);
|
||||
|
||||
@@ -55,6 +55,7 @@ class exThread : public epicsThreadRunable {
|
||||
public:
|
||||
exThread ();
|
||||
void waitForCompletion ();
|
||||
~exThread() {};
|
||||
private:
|
||||
epicsThread thread;
|
||||
bool done;
|
||||
|
||||
@@ -42,7 +42,7 @@ static void check(const char *str, const char *expect)
|
||||
testDiag("Got \"%s\", expected \"%s\".\n", got, expect);
|
||||
pass = 0;
|
||||
}
|
||||
testOk(pass, str);
|
||||
testOk(pass, "%s", str);
|
||||
}
|
||||
|
||||
MAIN(macEnvExpandTest)
|
||||
|
||||
@@ -58,20 +58,21 @@ epicsTimerQueueActiveForC & timerQueueActiveMgr ::
|
||||
void timerQueueActiveMgr ::
|
||||
release ( epicsTimerQueueActiveForC & queue )
|
||||
{
|
||||
timerQueueActiveMgrPrivate * pPriv = & queue;
|
||||
{
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
assert ( queue.timerQueueActiveMgrPrivate::referenceCount > 0u );
|
||||
queue.timerQueueActiveMgrPrivate::referenceCount--;
|
||||
if ( queue.timerQueueActiveMgrPrivate::referenceCount == 0u ) {
|
||||
if ( queue.sharingOK () ) {
|
||||
this->sharedQueueList.remove ( queue );
|
||||
}
|
||||
if ( queue.timerQueueActiveMgrPrivate::referenceCount > 0u ) {
|
||||
return;
|
||||
}
|
||||
else if ( queue.sharingOK () ) {
|
||||
this->sharedQueueList.remove ( queue );
|
||||
}
|
||||
}
|
||||
// delete only after we release the guard in case the embedded
|
||||
// reference is the last one and this object is destroyed
|
||||
// as a side effect
|
||||
timerQueueActiveMgrPrivate * pPriv = & queue;
|
||||
delete pPriv;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,10 +4,15 @@ eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
# Authors: Ralph Lange, Marty Kraimer, Andrew Johnson and Janet Anderson
|
||||
# $Revision-Id$
|
||||
|
||||
use FindBin qw($Bin);
|
||||
use lib ("$Bin/../../lib/perl", $Bin);
|
||||
|
||||
use Cwd;
|
||||
use Getopt::Std;
|
||||
use File::Find;
|
||||
use File::Path;
|
||||
use File::Path 'mkpath';
|
||||
use EPICS::Path;
|
||||
use EPICS::Release;
|
||||
|
||||
$app_top = cwd();
|
||||
|
||||
@@ -17,10 +22,8 @@ $app_top = cwd();
|
||||
$bad_ident_chars = '[^0-9A-Za-z_]';
|
||||
|
||||
&GetUser; # Ensure we know who's in charge
|
||||
&readRelease("configure/RELEASE", \%release, \@apps) if (-r "configure/RELEASE");
|
||||
&readRelease("configure/RELEASE.$ENV{EPICS_HOST_ARCH}", \%release, \@apps)
|
||||
if (-r "configure/RELEASE.$ENV{EPICS_HOST_ARCH}");
|
||||
&expandRelease(\%release, \@apps);
|
||||
&readReleaseFiles("configure/RELEASE", \%release, \@apps);
|
||||
&expandRelease(\%release);
|
||||
&get_commandline_opts; # Check command-line options
|
||||
|
||||
#
|
||||
@@ -297,57 +300,6 @@ sub get_commandline_opts { #no args
|
||||
. "EPICS-Base: $epics_base\n\n" if $opt_d;
|
||||
}
|
||||
|
||||
#
|
||||
# Parse a configure/RELEASE file.
|
||||
#
|
||||
# NB: This subroutine also appears in base/configure/tools/convertRelease.pl
|
||||
# If you make changes here, they will be needed there as well.
|
||||
#
|
||||
sub readRelease {
|
||||
my ($file, $Rmacros, $Rapps) = @_;
|
||||
# $Rmacros is a reference to a hash, $Rapps a ref to an array
|
||||
my ($pre, $var, $post, $macro, $path);
|
||||
local *IN;
|
||||
open(IN, $file) or die "Can't open $file: $!\n";
|
||||
while (<IN>) {
|
||||
chomp;
|
||||
s/\r$//; # Shouldn't need this, but sometimes...
|
||||
s/\s*#.*$//; # Remove trailing comments
|
||||
next if /^\s*$/; # Skip blank lines
|
||||
|
||||
# Expand all already-defined macros in the line:
|
||||
while (($pre,$var,$post) = /(.*)\$\((\w+)\)(.*)/) {
|
||||
last unless (exists $Rmacros->{$var});
|
||||
$_ = $pre . $Rmacros->{$var} . $post;
|
||||
}
|
||||
|
||||
# Handle "<macro> = <path>"
|
||||
($macro, $path) = /^\s*(\w+)\s*=\s*(.*)/;
|
||||
if ($macro ne "") {
|
||||
$Rmacros->{$macro} = $path;
|
||||
push @$Rapps, $macro;
|
||||
next;
|
||||
}
|
||||
# Handle "include <path>" syntax
|
||||
($path) = /^\s*include\s+(.*)/;
|
||||
&readRelease($path, $Rmacros, $Rapps) if (-r $path);
|
||||
}
|
||||
close IN;
|
||||
}
|
||||
|
||||
sub expandRelease {
|
||||
my ($Rmacros, $Rapps) = @_;
|
||||
# $Rmacros is a reference to a hash, $Rapps a ref to an array
|
||||
|
||||
# Expand any (possibly nested) macros that were defined after use
|
||||
while (($macro, $path) = each %$Rmacros) {
|
||||
while (($pre,$var,$post) = $path =~ /(.*)\$\((\w+)\)(.*)/) {
|
||||
$path = $pre . $Rmacros->{$var} . $post;
|
||||
$Rmacros->{$macro} = $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# List application types
|
||||
#
|
||||
@@ -480,29 +432,3 @@ sub GetUser {
|
||||
}
|
||||
die "No user name" unless $user;
|
||||
}
|
||||
|
||||
# Path rewriting rules for various OSs
|
||||
# These functions are duplicated in configure/convertRelease.pl
|
||||
sub UnixPath {
|
||||
my ($newpath) = @_;
|
||||
if ($^O eq 'cygwin') {
|
||||
$newpath =~ s{\\}{/}go;
|
||||
$newpath =~ s{^([a-zA-Z]):/}{/cygdrive/$1/};
|
||||
} elsif ($^O eq 'MSWin32') {
|
||||
$newpath =~ s{\\}{/}go;
|
||||
} elsif ($^O eq 'sunos') {
|
||||
$newpath =~ s{^/tmp_mnt/}{/};
|
||||
}
|
||||
return $newpath;
|
||||
}
|
||||
|
||||
sub LocalPath {
|
||||
my ($newpath) = @_;
|
||||
if ($^O eq "cygwin") {
|
||||
$newpath =~ s{^/cygdrive/([a-zA-Z])/}{$1:/};
|
||||
} elsif ($^O eq "darwin") {
|
||||
# These rules are likely to be site-specific
|
||||
$newpath =~ s{^/private/var/auto\.home/}{/home/}; # APS
|
||||
}
|
||||
return $newpath;
|
||||
}
|
||||
|
||||
@@ -17,15 +17,15 @@ PROD_LIBS += $(EPICS_BASE_HOST_LIBS)
|
||||
#
|
||||
# Added ws2_32 winmm user32 for the non-dll build
|
||||
#
|
||||
SYS_PROD_LIBS_WIN32 += ws2_32 advapi32 user32
|
||||
PROD_SYS_LIBS_WIN32 += ws2_32 advapi32 user32
|
||||
|
||||
SRCS += main.cc
|
||||
SRCS += exServer.cc
|
||||
SRCS += exPV.cc
|
||||
SRCS += exVectorPV.cc
|
||||
SRCS += exScalarPV.cc
|
||||
SRCS += exAsyncPV.cc
|
||||
SRCS += exChannel.cc
|
||||
casexample_SRCS += main.cc
|
||||
casexample_SRCS += exServer.cc
|
||||
casexample_SRCS += exPV.cc
|
||||
casexample_SRCS += exVectorPV.cc
|
||||
casexample_SRCS += exScalarPV.cc
|
||||
casexample_SRCS += exAsyncPV.cc
|
||||
casexample_SRCS += exChannel.cc
|
||||
|
||||
PROD_HOST = casexample
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include "dbLock.h"
|
||||
#include "devSup.h"
|
||||
#include "drvSup.h"
|
||||
#include "menuConvert.h"
|
||||
#include "menuPini.h"
|
||||
#include "registryRecordType.h"
|
||||
#include "registryDeviceSupport.h"
|
||||
@@ -68,6 +69,7 @@ static enum {
|
||||
} iocState = iocVirgin;
|
||||
|
||||
/* define forward references*/
|
||||
static int checkDatabase(dbBase *pdbbase);
|
||||
static void initDrvSup(void);
|
||||
static void initRecSup(void);
|
||||
static void initDevSup(void);
|
||||
@@ -98,8 +100,8 @@ int iocBuild(void)
|
||||
}
|
||||
|
||||
errlogPrintf("Starting iocInit\n");
|
||||
if (!pdbbase) {
|
||||
errlogPrintf("iocBuild: Aborting, no database loaded!\n");
|
||||
if (checkDatabase(pdbbase)) {
|
||||
errlogPrintf("iocBuild: Aborting, bad database definition (DBD)!\n");
|
||||
return -1;
|
||||
}
|
||||
epicsSignalInstallSigHupIgnore();
|
||||
@@ -203,6 +205,83 @@ int iocPause(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Database sanity checks
|
||||
*
|
||||
* This is not an attempt to sanity-check the whole .dbd file, only
|
||||
* two menus normally get modified by users: menuConvert and menuScan.
|
||||
*
|
||||
* The menuConvert checks were added to flag problems with IOCs
|
||||
* converted from 3.13.x, where the SLOPE choice didn't exist.
|
||||
*
|
||||
* The menuScan checks make sure the user didn't fiddle too much
|
||||
* when creating new periodic scan choices.
|
||||
*/
|
||||
|
||||
static int checkDatabase(dbBase *pdbbase)
|
||||
{
|
||||
const dbMenu *pMenu;
|
||||
|
||||
if (!pdbbase) {
|
||||
errlogPrintf("checkDatabase: No database definitions loaded.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pMenu = dbFindMenu(pdbbase, "menuConvert");
|
||||
if (!pMenu) {
|
||||
errlogPrintf("checkDatabase: menuConvert not defined.\n");
|
||||
return -1;
|
||||
}
|
||||
if (pMenu->nChoice <= menuConvertLINEAR) {
|
||||
errlogPrintf("checkDatabase: menuConvert has too few choices.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuConvertNO_CONVERSION],
|
||||
"menuConvertNO_CONVERSION")) {
|
||||
errlogPrintf("checkDatabase: menuConvertNO_CONVERSION doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuConvertSLOPE], "menuConvertSLOPE")) {
|
||||
errlogPrintf("checkDatabase: menuConvertSLOPE doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuConvertLINEAR], "menuConvertLINEAR")) {
|
||||
errlogPrintf("checkDatabase: menuConvertLINEAR doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pMenu = dbFindMenu(pdbbase, "menuScan");
|
||||
if (!pMenu) {
|
||||
errlogPrintf("checkDatabase: menuScan not defined.\n");
|
||||
return -1;
|
||||
}
|
||||
if (pMenu->nChoice <= menuScanI_O_Intr) {
|
||||
errlogPrintf("checkDatabase: menuScan has too few choices.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuScanPassive],
|
||||
"menuScanPassive")) {
|
||||
errlogPrintf("checkDatabase: menuScanPassive doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuScanEvent],
|
||||
"menuScanEvent")) {
|
||||
errlogPrintf("checkDatabase: menuScanEvent doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
if (strcmp(pMenu->papChoiceName[menuScanI_O_Intr],
|
||||
"menuScanI_O_Intr")) {
|
||||
errlogPrintf("checkDatabase: menuScanI_O_Intr doesn't match.\n");
|
||||
return -1;
|
||||
}
|
||||
if (pMenu->nChoice <= SCAN_1ST_PERIODIC) {
|
||||
errlogPrintf("checkDatabase: menuScan has no periodic choices.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void initDrvSup(void) /* Locate all driver support entry tables */
|
||||
{
|
||||
@@ -506,6 +585,7 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord,
|
||||
devSup *pdevSup;
|
||||
struct dsxt *pdsxt;
|
||||
int j;
|
||||
int locked = 0;
|
||||
|
||||
for (j = 0; j < pdbRecordType->no_links; j++) {
|
||||
dbFldDes *pdbFldDes =
|
||||
@@ -513,7 +593,12 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord,
|
||||
DBLINK *plink = (DBLINK *)((char *)precord + pdbFldDes->offset);
|
||||
|
||||
if (plink->type == CA_LINK) {
|
||||
if (!locked) {
|
||||
dbScanLock(precord);
|
||||
locked = 1;
|
||||
}
|
||||
dbCaRemoveLink(plink);
|
||||
plink->type = CONSTANT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -521,8 +606,16 @@ static void doCloseLinks(dbRecordType *pdbRecordType, dbCommon *precord,
|
||||
(pdevSup = dbDSETtoDevSup(pdbRecordType, precord->dset)) &&
|
||||
(pdsxt = pdevSup->pdsxt) &&
|
||||
pdsxt->del_record) {
|
||||
if (!locked) {
|
||||
dbScanLock(precord);
|
||||
locked = 1;
|
||||
}
|
||||
pdsxt->del_record(precord);
|
||||
}
|
||||
if (locked) {
|
||||
precord->pact = TRUE;
|
||||
dbScanUnlock(precord);
|
||||
}
|
||||
}
|
||||
|
||||
static void exitDatabase(void *dummy)
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
TOP=../..
|
||||
|
||||
@@ -159,12 +159,13 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val) {
|
||||
*pprecision = prec->prec;
|
||||
} else {
|
||||
*pprecision = prec->prec;
|
||||
|
||||
if (fieldIndex != calcRecordVAL)
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -374,12 +374,13 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
static long get_precision(DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
|
||||
if (paddr->pfield == (void *)&prec->val) {
|
||||
*pprecision = prec->prec;
|
||||
} else {
|
||||
*pprecision = prec->prec;
|
||||
|
||||
if (fieldIndex != calcoutRecordVAL)
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -92,12 +92,14 @@ static void reset(compressRecord *prec)
|
||||
|
||||
static void monitor(compressRecord *prec)
|
||||
{
|
||||
unsigned short monitor_mask;
|
||||
unsigned short alarm_mask = recGblResetAlarms(prec);
|
||||
unsigned short monitor_mask = alarm_mask | DBE_LOG | DBE_VALUE;
|
||||
|
||||
monitor_mask = recGblResetAlarms(prec);
|
||||
monitor_mask |= (DBE_LOG|DBE_VALUE);
|
||||
if(monitor_mask) db_post_events(prec,prec->bptr,monitor_mask);
|
||||
return;
|
||||
if (alarm_mask || prec->nuse != prec->ouse) {
|
||||
db_post_events(prec, &prec->nuse, monitor_mask);
|
||||
prec->ouse = prec->nuse;
|
||||
}
|
||||
db_post_events(prec, prec->bptr, monitor_mask);
|
||||
}
|
||||
|
||||
static void put_value(compressRecord *prec,double *psource, epicsInt32 n)
|
||||
|
||||
@@ -95,6 +95,10 @@ recordtype(compress) {
|
||||
prompt("Number Used")
|
||||
special(SPC_NOMOD)
|
||||
}
|
||||
field(OUSE,DBF_ULONG) {
|
||||
prompt("Old Number Used")
|
||||
special(SPC_NOMOD)
|
||||
}
|
||||
field(BPTR,DBF_NOACCESS) {
|
||||
prompt("Buffer Pointer")
|
||||
special(SPC_NOMOD)
|
||||
|
||||
@@ -9,6 +9,10 @@ eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
use FindBin qw($Bin);
|
||||
use lib "$Bin/../../lib/perl";
|
||||
use EPICS::Path;
|
||||
|
||||
($file, $subname, $bldTop) = @ARGV;
|
||||
$numberRecordType = 0;
|
||||
$numberDeviceSupport = 0;
|
||||
@@ -18,6 +22,10 @@ $numberDriverSupport = 0;
|
||||
$c_bad_ident_chars = '[^0-9A-Za-z_]';
|
||||
$subname =~ s/$c_bad_ident_chars/_/g;
|
||||
|
||||
# Process bldTop like convertRelease.pl does
|
||||
$bldTop = LocalPath(UnixPath($bldTop));
|
||||
$bldTop =~ s/([\\"])/\\\1/g; # escape back-slashes and double-quotes
|
||||
|
||||
open(INP,"$file") or die "$! opening file";
|
||||
while(<INP>) {
|
||||
next if m/ ^ \s* \# /x;
|
||||
|
||||
@@ -33,10 +33,6 @@
|
||||
#define epicsExportSharedSymbols
|
||||
#include "server.h"
|
||||
|
||||
/* As an optimisation, any message allocated with a large header is resized to
|
||||
* use a small header if the payload size is below this threshold. */
|
||||
#define SMALL_MESSAGE_THRESHOLD 65
|
||||
|
||||
/*
|
||||
* cas_send_bs_msg()
|
||||
*
|
||||
@@ -357,19 +353,8 @@ void cas_commit_msg ( struct client *pClient, ca_uint32_t size )
|
||||
if ( pMsg->m_postsize == htons ( 0xffff ) ) {
|
||||
ca_uint32_t * pLW = ( ca_uint32_t * ) ( pMsg + 1 );
|
||||
assert ( size <= ntohl ( *pLW ) );
|
||||
if (size < SMALL_MESSAGE_THRESHOLD) {
|
||||
/* If the message is sufficiently small it can be worth converting a
|
||||
* large message header into a small header. This saves us all of 8
|
||||
* bytes over the wire, so it's not such a big deal. */
|
||||
pMsg->m_postsize = htons((ca_uint16_t) size);
|
||||
pMsg->m_count = htons((ca_uint16_t) ntohl(pLW[1]));
|
||||
memmove(pLW, pLW + 2, size);
|
||||
size += sizeof(caHdr);
|
||||
}
|
||||
else {
|
||||
pLW[0] = htonl ( size );
|
||||
size += sizeof ( caHdr ) + 2 * sizeof ( *pLW );
|
||||
}
|
||||
pLW[0] = htonl ( size );
|
||||
size += sizeof ( caHdr ) + 2 * sizeof ( *pLW );
|
||||
}
|
||||
else {
|
||||
assert ( size <= ntohs ( pMsg->m_postsize ) );
|
||||
|
||||
@@ -64,7 +64,6 @@ put into a file. It converts paths from the Unix form that Perl understands to
|
||||
any necessary external representation, and also removes automounter prefixes to
|
||||
put the path into its canonical form.
|
||||
|
||||
On cygwin we convert cygdrive paths to their equivalent Windows drive specs.
|
||||
Before Leopard, the Mac OS X automounter inserted a verbose prefix, and in case
|
||||
anyone is still using SunOS it adds its own prefix as well.
|
||||
|
||||
@@ -72,9 +71,7 @@ anyone is still using SunOS it adds its own prefix as well.
|
||||
|
||||
sub LocalPath {
|
||||
my ($newpath) = @_;
|
||||
if ($^O eq 'cygwin') {
|
||||
$newpath =~ s{^/cygdrive/([a-zA-Z])/}{$1:/};
|
||||
} elsif ($^O eq 'darwin') {
|
||||
if ($^O eq 'darwin') {
|
||||
# Darwin automounter
|
||||
$newpath =~ s{^/private/var/auto\.}{/};
|
||||
} elsif ($^O eq 'sunos') {
|
||||
|
||||
@@ -19,7 +19,7 @@ use strict;
|
||||
use FindBin qw($Bin);
|
||||
use lib ("$Bin/../../lib/perl", $Bin);
|
||||
|
||||
use Cwd qw(cwd abs_path);
|
||||
use Cwd qw(cwd);
|
||||
use Getopt::Std;
|
||||
use EPICS::Path;
|
||||
use EPICS::Release;
|
||||
@@ -144,6 +144,7 @@ sub cdCommands {
|
||||
|
||||
my $startup = $cwd;
|
||||
$startup =~ s/^$root/$iocroot/o if ($opt_t);
|
||||
$startup =~ s/([\\"])/\\\1/g; # escape back-slashes and double-quotes
|
||||
|
||||
print OUT "startup = \"$startup\"\n";
|
||||
|
||||
@@ -156,6 +157,7 @@ sub cdCommands {
|
||||
foreach my $app (@includes) {
|
||||
my $iocpath = my $path = $macros{$app};
|
||||
$iocpath =~ s/^$root/$iocroot/o if ($opt_t);
|
||||
$iocpath =~ s/([\\"])/\\\1/g; # escape back-slashes and double-quotes
|
||||
my $app_lc = lc($app);
|
||||
print OUT "$app_lc = \"$iocpath\"\n"
|
||||
if (-d $path);
|
||||
@@ -187,6 +189,7 @@ sub envPaths {
|
||||
foreach my $app (@includes) {
|
||||
my $iocpath = my $path = $macros{$app};
|
||||
$iocpath =~ s/^$root/$iocroot/o if ($opt_t);
|
||||
$iocpath =~ s/([\\"])/\\\1/g; # escape back-slashes and double-quotes
|
||||
print OUT "epicsEnvSet(\"$app\",\"$iocpath\")\n" if (-d $path);
|
||||
}
|
||||
close OUT;
|
||||
@@ -212,7 +215,7 @@ sub checkRelease {
|
||||
|
||||
while (my ($parent, $ppath) = each %check) {
|
||||
if (exists $macros{$parent} &&
|
||||
abs_path($macros{$parent}) ne abs_path($ppath)) {
|
||||
AbsPath($macros{$parent}) ne AbsPath($ppath)) {
|
||||
print "\n" unless ($status);
|
||||
print "Definition of $parent conflicts with $app support.\n";
|
||||
print "In this application a RELEASE file defines\n";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user