Merge changes from 3.15 branch, to revno 12701

This commit is contained in:
Andrew Johnson
2015-08-20 11:24:07 -05:00
5 changed files with 64 additions and 48 deletions

View File

@@ -1255,20 +1255,20 @@ long dbPut(DBADDR *paddr, short dbrType,
status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer,
nRequest, no_elements, offset);
}
if (status) goto done;
/* update array info */
if (paddr->pfldDes->special == SPC_DBADDR &&
if (!status &&
paddr->pfldDes->special == SPC_DBADDR &&
prset && prset->put_array_info) {
status = prset->put_array_info(paddr, nRequest);
}
if (status) goto done;
/* check if special processing is required */
/* Always do special processing if needed */
if (special) {
status = dbPutSpecial(paddr,1);
if (status) goto done;
long status2 = dbPutSpecial(paddr, 1);
if (status2) goto done;
}
if (status) goto done;
/* Propagate monitor events for this field, */
/* unless the field is VAL and PP is true. */

View File

@@ -334,7 +334,6 @@ long dbpf(const char *pname,const char *pvalue)
{
DBADDR addr;
long status;
epicsUInt16 value;
short dbrType;
size_t n = 1;
@@ -346,16 +345,7 @@ long dbpf(const char *pname,const char *pvalue)
if (nameToAddr(pname, &addr))
return -1;
/* For enumerated types must allow for ENUM rather than string */
/* If entire field is digits then use DBR_ENUM else DBR_STRING */
if (addr.dbr_field_type == DBR_ENUM && *pvalue &&
strspn(pvalue,"0123456789") == strlen(pvalue)) {
sscanf(pvalue, "%hu", &value);
pvalue = (char *) &value;
dbrType = DBR_ENUM;
}
else if (addr.no_elements > 1 &&
if (addr.no_elements > 1 &&
(addr.dbr_field_type == DBR_CHAR || addr.dbr_field_type == DBR_UCHAR)) {
dbrType = addr.dbr_field_type;
n = strlen(pvalue) + 1;

View File

@@ -1099,14 +1099,19 @@ long dbGetAttributePart(DBENTRY *pdbentry, const char **ppname)
const char *pname = *ppname;
dbRecordAttribute *pattribute;
if (!precordType) return S_dbLib_recordTypeNotFound;
if (!precordType)
return S_dbLib_recordTypeNotFound;
pattribute = (dbRecordAttribute *)ellFirst(&precordType->attributeList);
while (pattribute) {
size_t nameLen = strlen(pattribute->name);
int compare = strncmp(pattribute->name, pname, nameLen);
int ch = pname[nameLen];
if (compare == 0) {
if (!(ch == '_' || isalnum(ch))) {
int ch = pname[nameLen];
if (ch != '_' && !isalnum(ch)) {
/* Any other character can't be in the attribute name */
pdbentry->pflddes = pattribute->pdbFldDes;
pdbentry->pfield = pattribute->value;
*ppname = &pname[nameLen];

View File

@@ -120,10 +120,12 @@ epicsShareFunc int errlogPrintf(const char *pFormat, ...)
isOkToBlock = epicsThreadIsOkToBlock();
if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
FILE *console = pvtData.console ? pvtData.console : stderr;
va_start(pvar, pFormat);
nchar = vfprintf(pvtData.console, pFormat, pvar);
nchar = vfprintf(console, pFormat, pvar);
va_end (pvar);
fflush(pvtData.console);
fflush(console);
}
if (pvtData.atExit)
@@ -146,6 +148,7 @@ epicsShareFunc int errlogVprintf(
int nchar;
char *pbuffer;
int isOkToBlock;
FILE *console;
if (epicsInterruptIsInterruptContext()) {
epicsInterruptContextMessage
@@ -160,15 +163,17 @@ epicsShareFunc int errlogVprintf(
pbuffer = msgbufGetFree(isOkToBlock);
if (!pbuffer) {
vfprintf(pvtData.console, pFormat, pvar);
fflush(pvtData.console);
console = pvtData.console ? pvtData.console : stderr;
vfprintf(console, pFormat, pvar);
fflush(console);
return 0;
}
nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar);
if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
fprintf(pvtData.console, "%s", pbuffer);
fflush(pvtData.console);
console = pvtData.console ? pvtData.console : stderr;
fprintf(console, "%s", pbuffer);
fflush(console);
}
msgbufSetSize(nchar);
return nchar;
@@ -243,11 +248,13 @@ epicsShareFunc int errlogSevPrintf(
isOkToBlock = epicsThreadIsOkToBlock();
if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
fprintf(pvtData.console, "sevr=%s ", errlogGetSevEnumString(severity));
FILE *console = pvtData.console ? pvtData.console : stderr;
fprintf(console, "sevr=%s ", errlogGetSevEnumString(severity));
va_start(pvar, pFormat);
vfprintf(pvtData.console, pFormat, pvar);
vfprintf(console, pFormat, pvar);
va_end(pvar);
fflush(pvtData.console);
fflush(console);
}
va_start(pvar, pFormat);
@@ -359,7 +366,9 @@ epicsShareFunc int epicsShareAPI errlogRemoveListeners(
epicsMutexUnlock(pvtData.listenerLock);
if (count == 0) {
fprintf(pvtData.console,
FILE *console = pvtData.console ? pvtData.console : stderr;
fprintf(console,
"errlogRemoveListeners: No listeners found\n");
}
return count;
@@ -376,7 +385,7 @@ epicsShareFunc int epicsShareAPI eltc(int yesno)
epicsShareFunc int errlogSetConsole(FILE *stream)
{
errlogInit(0);
pvtData.console = stream ? stream : stderr;
pvtData.console = stream;
return 0;
}
@@ -405,17 +414,19 @@ epicsShareFunc void errPrintf(long status, const char *pFileName,
}
if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
FILE *console = pvtData.console ? pvtData.console : stderr;
if (pFileName)
fprintf(pvtData.console, "filename=\"%s\" line number=%d\n",
fprintf(console, "filename=\"%s\" line number=%d\n",
pFileName, lineno);
if (status > 0)
fprintf(pvtData.console, "%s ", name);
fprintf(console, "%s ", name);
va_start(pvar, pformat);
vfprintf(pvtData.console, pformat, pvar);
vfprintf(console, pformat, pvar);
va_end(pvar);
fputc('\n', pvtData.console);
fflush(pvtData.console);
fputc('\n', console);
fflush(console);
}
if (pvtData.atExit)
@@ -473,7 +484,7 @@ static void errlogInitPvt(void *arg)
ellInit(&pvtData.listenerList);
ellInit(&pvtData.msgQueue);
pvtData.toConsole = TRUE;
pvtData.console = stderr;
pvtData.console = NULL;
pvtData.waitForWork = epicsEventMustCreate(epicsEventEmpty);
pvtData.listenerLock = epicsMutexMustCreate();
pvtData.msgQueueLock = epicsMutexMustCreate();
@@ -559,8 +570,10 @@ static void errlogThread(void)
while ((pmessage = msgbufGetSend(&noConsoleMessage))) {
epicsMutexMustLock(pvtData.listenerLock);
if (pvtData.toConsole && !noConsoleMessage) {
fprintf(pvtData.console,"%s",pmessage);
fflush(pvtData.console);
FILE *console = pvtData.console ? pvtData.console : stderr;
fprintf(console, "%s", pmessage);
fflush(console);
}
plistenerNode = (listenerNode *)ellFirst(&pvtData.listenerList);
@@ -680,7 +693,9 @@ static void msgbufFreeSend(void)
epicsMutexMustLock(pvtData.msgQueueLock);
pnextSend = (msgNode *)ellFirst(&pvtData.msgQueue);
if (!pnextSend) {
fprintf(pvtData.console, "errlog: msgbufFreeSend logic error\n");
FILE *console = pvtData.console ? pvtData.console : stderr;
fprintf(console, "errlog: msgbufFreeSend logic error\n");
epicsThreadSuspendSelf();
}
ellDelete(&pvtData.msgQueue, &pnextSend->node);

View File

@@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -14,15 +13,22 @@
* Author: Jeff Hill
*/
#ifndef osdTimeh
#define osdTimeh
#ifndef INC_osdTime_H
#define INC_osdTime_H
#if ! defined(_MINGW) || ! defined(_TIMESPEC_DEFINED)
# if _MSC_VER >= 1900
# include <time.h>
# else
#define _TIMESPEC_DEFINED 1
struct timespec {
time_t tv_sec; /* seconds since some epoch */
long tv_nsec; /* nanoseconds within the second */
time_t tv_sec; /* seconds since some epoch */
long tv_nsec; /* nanoseconds within the second */
};
# endif /* _MSC_VER */
#endif /* ! defined(_MINGW) || ! defined(_TIMESPEC_DEFINED) */
#endif /* ifndef osdTimeh */
#endif /* ifndef INC_osdTime_H */