Merge 7.0 commit 'ca9c95' into PSI-7.0

This commit is contained in:
2023-12-01 14:21:07 +01:00
35 changed files with 446 additions and 296 deletions

View File

@@ -37,7 +37,7 @@ int epicsNtpGetTime(char *ntpIp, struct timespec *now)
sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); // Create a UDP socket.
if ( sockfd < 0 ) {
perror( "epicsNtpGetTime" );
perror( "epicsNtpGetTime creating socket" );
return -1;
}
@@ -51,24 +51,29 @@ int epicsNtpGetTime(char *ntpIp, struct timespec *now)
// Call up the server using its IP address and port number.
if ( connect( sockfd, ( struct sockaddr * ) &serv_addr, sizeof( serv_addr) ) < 0 ) {
perror( "epicsNtpGetTime" );
perror( "epicsNtpGetTime connecting socket" );
close( sockfd );
return -1;
}
// Send it the NTP packet it wants. If n == -1, it failed.
n = write( sockfd, ( char* ) &packet, sizeof( ntp_packet ) );
if ( n < 0 ) {
perror( "epicsNtpGetTime" );
perror( "epicsNtpGetTime sending NTP request" );
close( sockfd );
return -1;
}
// Wait and receive the packet back from the server. If n == -1, it failed.
// Wait and receive the packet back from the server. If n == -1, it failed.
n = read( sockfd, ( char* ) &packet, sizeof( ntp_packet ) );
if ( n < 0 ) {
perror( "epicsNtpGetTime" );
perror( "epicsNtpGetTime reading NTP reply" );
close( sockfd );
return -1;
}
close( sockfd );
// These two fields contain the time-stamp seconds as the packet left the NTP server.
// The number of seconds correspond to the seconds passed since 1900.
// ntohl() converts the bit/byte order from the network's to host's "endianness".

View File

@@ -359,7 +359,6 @@ void epicsStdCall asPutMemberPvt(ASMEMBERPVT asMemberPvt,void *userPvt)
if(!asActive) return;
if(!pasgmember) return;
pasgmember->userPvt = userPvt;
return;
}
long epicsStdCall asAddClient(ASCLIENTPVT *pasClientPvt,ASMEMBERPVT asMemberPvt,

View File

@@ -25,8 +25,8 @@
namespace {
static epicsThreadOnceId epicsSigletonOnceFlag ( EPICS_THREAD_ONCE_INIT );
static epicsMutex * pEPICSSigletonMutex = 0;
epicsThreadOnceId epicsSigletonOnceFlag ( EPICS_THREAD_ONCE_INIT );
epicsMutex * pEPICSSigletonMutex = 0;
extern "C" void SingletonMutexOnce ( void * /* pParm */ )
{

View File

@@ -34,8 +34,6 @@ void ellAdd (ELLLIST *pList, ELLNODE *pNode)
pList->node.previous = pNode;
pList->count++;
return;
}
/****************************************************************************
*
@@ -65,8 +63,6 @@ void ellConcat (ELLLIST *pDstList, ELLLIST *pAddList)
pAddList->count = 0;
pAddList->node.next = NULL;
pAddList->node.previous = NULL;
return;
}
/****************************************************************************
*
@@ -86,8 +82,6 @@ void ellDelete (ELLLIST *pList, ELLNODE *pNode)
pNode->previous->next = pNode->next;
pList->count--;
return;
}
/****************************************************************************
*
@@ -136,8 +130,6 @@ void ellExtract (ELLLIST *pSrcList, ELLNODE *pStartNode, ELLNODE *pEndNode, ELLL
}
pSrcList->count -= count;
pDstList->count += count;
return;
}
/****************************************************************************
*
@@ -194,8 +186,6 @@ void ellInsert (ELLLIST *plist, ELLNODE *pPrev, ELLNODE *pNode)
pNode->next->previous = pNode;
plist->count++;
return;
}
/****************************************************************************
*

View File

@@ -271,7 +271,6 @@ void errSymTestPrint(long errNum)
if ( message[0] == '\0' ) return;
printf("module %hu number %hu message=\"%s\"\n",
modnum, errnum, message);
return;
}
/****************************************************************

View File

@@ -38,13 +38,38 @@ typedef ERRSYMTAB *ERRSYMTAB_ID;
extern "C" {
#endif
/** \brief Lookup message from error/status code.
* \param status Input code
* \param pBuf Output string buffer
* \param bufLength Length of output buffer in bytes. Must be non-zero.
*
* Handles EPICS message codes, and "errno" codes.
*
* Copies in a mesage for any status code. Unknown status codes
* are printed numerically.
*/
LIBCOM_API void errSymLookup(long status, char *pBuf, size_t bufLength);
/** \brief Lookup message from error/status code.
* \param status Input code
* \returns A statically allocated message string. Never NULL.
*
* Handles EPICS message codes, and "errno" codes.
*
* For any unknown status codes, a generic "Unknown code" message is returned.
*
* \since 3.16.1
*/
LIBCOM_API const char* errSymMsg(long status);
LIBCOM_API void errSymTest(epicsUInt16 modnum, epicsUInt16 begErrNum,
epicsUInt16 endErrNum);
LIBCOM_API void errSymTestPrint(long errNum);
LIBCOM_API int errSymBld(void);
LIBCOM_API int errSymbolAdd(long errNum, const char *name);
/** @brief Define new custom error code and associate message string.
* @param errNum New error code. Caller is reponsible for avoiding reuse of existing codes.
* @param message New message. Pointer stored. Caller must not free pointed storage.
* @return 0 on success
*/
LIBCOM_API int errSymbolAdd(long errNum, const char *message);
LIBCOM_API void errSymDump(void);
#ifdef __cplusplus

View File

@@ -206,7 +206,6 @@ LIBCOM_API void fdManager::process (double delay)
this->pTimerQueue->process(epicsTime::getCurrent());
}
this->processInProg = false;
return;
}
//

View File

@@ -38,10 +38,9 @@ public:
// exceptions
//
class noFunctionSpecified {};
class doubleDelete {};
LIBCOM_API fdRegForOldFdmgr (const SOCKET fdIn, const fdRegType type,
const bool onceOnly, fdManager &manager, pCallBackFDMgr pFunc, void *pParam);
LIBCOM_API fdRegForOldFdmgr (SOCKET fdIn, fdRegType type,
bool onceOnly, fdManager &manager, pCallBackFDMgr pFunc, void *pParam);
LIBCOM_API ~fdRegForOldFdmgr ();
private:
@@ -66,7 +65,6 @@ public:
// exceptions
//
class noFunctionSpecified {};
class doubleDelete {};
private:
epicsTimer &timer;
oldFdmgr &fdmgr;
@@ -116,11 +114,7 @@ LIBCOM_API fdRegForOldFdmgr::fdRegForOldFdmgr
}
LIBCOM_API fdRegForOldFdmgr::~fdRegForOldFdmgr ()
{
if (this->pFunc==NULL) {
throwWithLocation ( doubleDelete () );
}
}
{}
LIBCOM_API void fdRegForOldFdmgr::callBack ()
{

View File

@@ -83,7 +83,6 @@ LIBCOM_API void epicsStdCall
pfl->lock = epicsMutexMustCreate();
*ppvt = (void *)pfl;
VALGRIND_CREATE_MEMPOOL(pfl, REDZONE, 0);
return;
}
LIBCOM_API void * epicsStdCall freeListCalloc(void *pvt)

View File

@@ -56,7 +56,6 @@ void epicsStdCall gphInitPvt(gphPvt **ppvt, int size)
pgphPvt->paplist = callocMustSucceed(size, sizeof(ELLLIST *), "gphInitPvt");
pgphPvt->lock = epicsMutexMustCreate();
*ppvt = pgphPvt;
return;
}
GPHENTRY * epicsStdCall gphFindParse(gphPvt *pgphPvt, const char *name, size_t len, void *pvtid)
@@ -171,7 +170,6 @@ void epicsStdCall gphDelete(gphPvt *pgphPvt, const char *name, void *pvtid)
}
epicsMutexUnlock(pgphPvt->lock);
return;
}
void epicsStdCall gphFreeMem(gphPvt *pgphPvt)

View File

@@ -142,6 +142,7 @@ const char *initHookName(int state)
"initHookAfterInterruptAccept",
"initHookAtEnd"
};
STATIC_ASSERT(NELEMENTS(stateName)==initHookAtEnd+1);
if (state < 0 || state >= NELEMENTS(stateName)) {
return "Not an initHookState";
}

View File

@@ -8,42 +8,44 @@
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/**
* \file initHooks.h
/** @page inithooks IOC lifecycle callback hooks.
*
* \author Benjamin Franksen (BESSY)
* \author Marty Kraimer (ANL)
* initHookRegister() allows external code to be called at certains points (initHookState)
* during IOC startup and shutdown.
*
* \brief Facility to call functions during iocInit()
* The overall states (see getIocState() ) of an IOC are:
*
* The initHooks facility allows application functions to be called at various
* stages/states during IOC initialization, pausing, restart and shutdown.
*
* All registered application functions will be called whenever the IOC
* initialization, pause/resume or shutdown process reaches a new state.
* - Void
* - From process start until iocInit()
* - After iocShutdown()
* - Building
* - Transiant state during iocInit()
* - Built
* - Transiant state during iocInit()
* - Running
* - After iocInit() or iocRun()
* - Paused
* - After iocPause()
*
* The following C++ example shows how to use this facility:
*
* \code{.cpp}
* #include <initHooks.h>
* #include <epicsExport.h>
* static void myHookFunction(initHookState state)
* {
* switch (state) {
* case initHookAfterInitRecSup:
* ...
* break;
* case initHookAfterDatabaseRunning:
* ...
* break;
* default:
* break;
* if(state == initHookAfterDatabaseRunning) {
* // a good point for driver worker threads to be started.
* }
* }
*
* // A static constructor registers hook function at startup:
* static int myHookStatus = initHookRegister(myHookFunction);
* static void myRegistrar(void) {
* initHookRegister(&myHookFunction);
* }
* extern "C" {
* epicsExportRegistrar(myRegistrar);
* }
* // in some .dbd file add "registrar(myRegistrar)".
* \endcode
*
* An arbitrary number of functions can be registered.
*/
@@ -69,41 +71,73 @@ extern "C" {
* if the IOC is later paused and restarted.
*/
typedef enum {
// iocInit() begins
initHookAtIocBuild = 0, /**< Start of iocBuild() / iocInit() */
initHookAtBeginning, /**< Database sanity checks passed */
initHookAfterCallbackInit, /**< Callbacks, generalTime & taskwd init */
initHookAfterCaLinkInit, /**< CA links init */
initHookAfterInitDrvSup, /**< Driver support init */
initHookAfterInitRecSup, /**< Record support init */
initHookAfterInitDevSup, /**< Device support init pass 0 */
initHookAfterInitDatabase, /**< Records and locksets init */
initHookAfterInitDevSup, /**< Device support init pass 0 (also autosave pass 0) */
initHookAfterInitDatabase, /**< Records and locksets init (also autosave pass 1) */
initHookAfterFinishDevSup, /**< Device support init pass 1 */
initHookAfterScanInit, /**< Scan, AS, ProcessNotify init */
initHookAfterInitialProcess, /**< Records with PINI = YES processsed */
initHookAfterCaServerInit, /**< RSRV init */
initHookAfterIocBuilt, /**< End of iocBuild() */
// iocInit() continues, and iocRun() begins
initHookAtIocRun, /**< Start of iocRun() */
initHookAfterDatabaseRunning, /**< Scan tasks and CA links running */
initHookAfterCaServerRunning, /**< RSRV running */
initHookAfterIocRunning, /**< End of iocRun() / iocInit() */
// iocInit() or iocRun() ends
// iocPause() begins
initHookAtIocPause, /**< Start of iocPause() */
initHookAfterCaServerPaused, /**< RSRV paused */
initHookAfterDatabasePaused, /**< CA links and scan tasks paused */
initHookAfterIocPaused, /**< End of iocPause() */
// iocPause() ends
initHookAtShutdown, /**< Start of iocShutdown() (unit tests only) */
initHookAfterCloseLinks, /**< Links disabled/deleted */
initHookAfterStopScan, /**< Scan tasks stopped. Prior to UNRELEASED, triggered only by unittest code. */
initHookAfterStopCallback, /**< Callback tasks stopped */
initHookAfterStopLinks, /**< CA links stopped. Prior to UNRELEASED, triggered only by unittest code. */
initHookBeforeFree, /**< Resource cleanup about to happen */
initHookAfterShutdown, /**< End of iocShutdown() */
// iocShutdown() begins
/** \brief Start of iocShutdown() (unit tests only)
* \since 7.0.3.1 Added
*/
initHookAtShutdown,
/** \brief Links disabled/deleted
* \since 7.0.3.1 Added
*/
initHookAfterCloseLinks,
/** \brief Scan tasks stopped.
* \since UNRELEASED Triggered during normal IOC shutdown
* \since 7.0.3.1 Added, triggered only by unittest code.
*/
initHookAfterStopScan,
/** \brief Callback tasks stopped
* \since 7.0.3.1 Added
*/
initHookAfterStopCallback,
/** \brief CA links stopped.
* \since UNRELEASED Triggered during normal IOC shutdown
* \since 7.0.3.1 Added, triggered only by unittest code.
*/
initHookAfterStopLinks,
/** \brief Resource cleanup about to happen
* \since 7.0.3.1 Added
*/
initHookBeforeFree,
/** \brief End of iocShutdown()
* \since 7.0.3.1 Added
*/
initHookAfterShutdown,
// iocShutdown() ends
/* Deprecated states: */
initHookAfterInterruptAccept, /**< After initHookAfterDatabaseRunning */
initHookAtEnd, /**< Before initHookAfterIocRunning */
/** Only announced once. Deprecated in favor of initHookAfterDatabaseRunning */
initHookAfterInterruptAccept,
/** Only announced once. Deprecated in favor of initHookAfterIocRunning */
initHookAtEnd,
} initHookState;
/** \brief Type for application callback functions

View File

@@ -84,9 +84,10 @@ static struct iocshVariable *iocshVariableHead;
static char iocshVarID[] = "iocshVar";
extern "C" { static void varCallFunc(const iocshArgBuf *); }
static epicsMutexId iocshTableMutex;
static epicsThreadOnceId iocshOnceId = EPICS_THREAD_ONCE_INIT;
static epicsThreadPrivateId iocshContextId;
static void iocshInit (void);
/*
* I/O redirection
*/
@@ -121,20 +122,6 @@ struct iocshRedirect {
};
} // namespace
/*
* Set up module variables
*/
static void iocshOnce (void *)
{
iocshTableMutex = epicsMutexMustCreate ();
iocshContextId = epicsThreadPrivateCreate();
}
static void iocshInit (void)
{
epicsThreadOnce (&iocshOnceId, iocshOnce, NULL);
}
/*
* Lock the table mutex
*/
@@ -157,19 +144,18 @@ iocshTableUnlock (void)
/*
* Register a command
*/
void epicsStdCall iocshRegister (const iocshFuncDef *piocshFuncDef,
static
void iocshRegisterImpl (const iocshFuncDef *piocshFuncDef,
iocshCallFunc func)
{
struct iocshCommand *l, *p, *n;
int i;
iocshTableLock ();
for (l = NULL, p = iocshCommandHead ; p != NULL ; l = p, p = p->next) {
i = strcmp (piocshFuncDef->name, p->def.pFuncDef->name);
if (i == 0) {
p->def.pFuncDef = piocshFuncDef;
p->def.func = func;
iocshTableUnlock ();
return;
}
if (i < 0)
@@ -179,7 +165,6 @@ void epicsStdCall iocshRegister (const iocshFuncDef *piocshFuncDef,
"iocshRegister");
if (!registryAdd(iocshCmdID, piocshFuncDef->name, (void *)n)) {
free (n);
iocshTableUnlock ();
errlogPrintf ("iocshRegister failed to add %s\n", piocshFuncDef->name);
return;
}
@@ -193,10 +178,15 @@ void epicsStdCall iocshRegister (const iocshFuncDef *piocshFuncDef,
}
n->def.pFuncDef = piocshFuncDef;
n->def.func = func;
iocshTableUnlock ();
}
void epicsStdCall iocshRegister (const iocshFuncDef *piocshFuncDef,
iocshCallFunc func)
{
iocshTableLock ();
iocshRegisterImpl (piocshFuncDef, func);
iocshTableUnlock ();
}
/*
* Retrieves a previously registered function with the given name.
*/
@@ -1455,7 +1445,7 @@ static const iocshFuncDef onFuncDef = {"on", 1, onArgs,
" continue (default) - Ignores error and continue with next commands.\n"
" break - Return to caller without executing futher commands.\n"
" halt - Suspend process.\n"
" wait - stall process for [value] seconds, the continue.\n"};
" wait - stall process for [value] seconds, then continue.\n"};
static void onCallFunc(const iocshArgBuf *args)
{
iocshContext *context = (iocshContext *) epicsThreadPrivateGet(iocshContextId);
@@ -1527,24 +1517,25 @@ static void exitCallFunc(const iocshArgBuf *)
{
}
static void localRegister (void)
static void iocshOnce (void *)
{
iocshRegister(&commentFuncDef,commentCallFunc);
iocshRegister(&exitFuncDef,exitCallFunc);
iocshRegister(&helpFuncDef,helpCallFunc);
iocshRegister(&iocshCmdFuncDef,iocshCmdCallFunc);
iocshRegister(&iocshLoadFuncDef,iocshLoadCallFunc);
iocshRegister(&iocshRunFuncDef,iocshRunCallFunc);
iocshRegister(&onFuncDef, onCallFunc);
iocshTableMutex = epicsMutexMustCreate ();
iocshContextId = epicsThreadPrivateCreate();
epicsMutexMustLock (iocshTableMutex);
iocshRegisterImpl(&commentFuncDef,commentCallFunc);
iocshRegisterImpl(&exitFuncDef,exitCallFunc);
iocshRegisterImpl(&helpFuncDef,helpCallFunc);
iocshRegisterImpl(&iocshCmdFuncDef,iocshCmdCallFunc);
iocshRegisterImpl(&iocshLoadFuncDef,iocshLoadCallFunc);
iocshRegisterImpl(&iocshRunFuncDef,iocshRunCallFunc);
iocshRegisterImpl(&onFuncDef, onCallFunc);
iocshTableUnlock();
}
static void iocshInit (void)
{
static epicsThreadOnceId iocshOnceId = EPICS_THREAD_ONCE_INIT;
epicsThreadOnce (&iocshOnceId, iocshOnce, NULL);
}
} /* extern "C" */
/*
* Register local commands on application startup
*/
class IocshRegister {
public:
IocshRegister() { localRegister(); }
};
static IocshRegister iocshRegisterObj;

View File

@@ -191,7 +191,9 @@ static const iocshArg * const epicsEnvShowArgs[1] = {&epicsEnvShowArg0};
static const iocshFuncDef epicsEnvShowFuncDef = {"epicsEnvShow",1,epicsEnvShowArgs,
"Show environment variables on your system\n"
" (default) - show all environment variables\n"
" name - show value of specific environment variable\n"};
" name - show value of specific environment variable\n"
"Example: epicsEnvShow\n"
"Example: epicsEnvShow PATH"};
static void epicsEnvShowCallFunc(const iocshArgBuf *args)
{
epicsEnvShow (args[0].sval);
@@ -258,10 +260,11 @@ static void eltcCallFunc(const iocshArgBuf *args)
/* errlogInit */
static const iocshArg errlogInitArg0 = { "bufSize",iocshArgInt};
static const iocshArg * const errlogInitArgs[1] = {&errlogInitArg0};
static const iocshFuncDef errlogInitFuncDef =
{"errlogInit",1,errlogInitArgs,
"Initialize error log client buffer size\n"
" bufSize - size of circular buffer (default = 1280 bytes)\n"};
static const iocshFuncDef errlogInitFuncDef = {
"errlogInit",1,errlogInitArgs,
"Initialize error log client buffer size\n"
" bufSize - size of circular buffer (default = 1280 bytes)\n"
};
static void errlogInitCallFunc(const iocshArgBuf *args)
{
errlogInit(args[0].ival);
@@ -272,11 +275,12 @@ static const iocshArg errlogInit2Arg0 = { "bufSize",iocshArgInt};
static const iocshArg errlogInit2Arg1 = { "maxMsgSize",iocshArgInt};
static const iocshArg * const errlogInit2Args[] =
{&errlogInit2Arg0, &errlogInit2Arg1};
static const iocshFuncDef errlogInit2FuncDef =
{"errlogInit2", 2, errlogInit2Args,
"Initialize error log client buffer size and maximum message size\n"
" bufSize - size of circular buffer (default = 1280 bytes)\n"
" maxMsgSize - maximum size of error message (default = 256 bytes)\n"};
static const iocshFuncDef errlogInit2FuncDef = {
"errlogInit2", 2, errlogInit2Args,
"Initialize error log client buffer size and maximum message size\n"
" bufSize - size of circular buffer (default = 1280 bytes)\n"
" maxMsgSize - maximum size of error message (default = 256 bytes)\n"
};
static void errlogInit2CallFunc(const iocshArgBuf *args)
{
errlogInit2(args[0].ival, args[1].ival);
@@ -311,9 +315,8 @@ static void iocLogPrefixCallFunc(const iocshArgBuf *args)
/* epicsThreadShowAll */
static const iocshArg epicsThreadShowAllArg0 = { "level",iocshArgInt};
static const iocshArg * const epicsThreadShowAllArgs[1] = {&epicsThreadShowAllArg0};
static const iocshFuncDef epicsThreadShowAllFuncDef =
{"epicsThreadShowAll",1,epicsThreadShowAllArgs,
"Display info about all threads\n"};
static const iocshFuncDef epicsThreadShowAllFuncDef = {"epicsThreadShowAll",1,epicsThreadShowAllArgs,
"Display info about all threads\n"};
static void epicsThreadShowAllCallFunc(const iocshArgBuf *args)
{
epicsThreadShowAll(args[0].ival);
@@ -368,9 +371,8 @@ static void threadCallFunc(const iocshArgBuf *args)
/* taskwdShow */
static const iocshArg taskwdShowArg0 = { "level",iocshArgInt};
static const iocshArg * const taskwdShowArgs[1] = {&taskwdShowArg0};
static const iocshFuncDef taskwdShowFuncDef =
{"taskwdShow",1,taskwdShowArgs,
"Show number of tasks and monitors registered\n"};
static const iocshFuncDef taskwdShowFuncDef = {"taskwdShow",1,taskwdShowArgs,
"Show number of tasks and monitors registered\n"};
static void taskwdShowCallFunc(const iocshArgBuf *args)
{
taskwdShow(args[0].ival);
@@ -381,11 +383,12 @@ static const iocshArg epicsMutexShowAllArg0 = { "onlyLocked",iocshArgInt};
static const iocshArg epicsMutexShowAllArg1 = { "level",iocshArgInt};
static const iocshArg * const epicsMutexShowAllArgs[2] =
{&epicsMutexShowAllArg0,&epicsMutexShowAllArg1};
static const iocshFuncDef epicsMutexShowAllFuncDef =
{"epicsMutexShowAll",2,epicsMutexShowAllArgs,
"Display information about all epicsMutex semaphores\n"
" onlyLocked - non-zero to show only locked semaphores\n"
" level - desired information level to report\n"};
static const iocshFuncDef epicsMutexShowAllFuncDef = {
"epicsMutexShowAll",2,epicsMutexShowAllArgs,
"Display information about all epicsMutex semaphores\n"
" onlyLocked - non-zero to show only locked semaphores\n"
" level - desired information level to report\n"
};
static void epicsMutexShowAllCallFunc(const iocshArgBuf *args)
{
epicsMutexShowAll(args[0].ival,args[1].ival);
@@ -394,9 +397,8 @@ static void epicsMutexShowAllCallFunc(const iocshArgBuf *args)
/* epicsThreadSleep */
static const iocshArg epicsThreadSleepArg0 = { "seconds",iocshArgDouble};
static const iocshArg * const epicsThreadSleepArgs[1] = {&epicsThreadSleepArg0};
static const iocshFuncDef epicsThreadSleepFuncDef =
{"epicsThreadSleep",1,epicsThreadSleepArgs,
"Pause execution of IOC shell for <seconds> seconds\n"};
static const iocshFuncDef epicsThreadSleepFuncDef = {"epicsThreadSleep",1,epicsThreadSleepArgs,
"Pause execution of IOC shell for <seconds> seconds\n"};
static void epicsThreadSleepCallFunc(const iocshArgBuf *args)
{
epicsThreadSleep(args[0].dval);
@@ -451,18 +453,18 @@ static void epicsThreadResumeCallFunc(const iocshArgBuf *args)
static const iocshArg generalTimeReportArg0 = { "interest_level", iocshArgInt};
static const iocshArg * const generalTimeReportArgs[1] = { &generalTimeReportArg0 };
static const iocshFuncDef generalTimeReportFuncDef = {"generalTimeReport",1,generalTimeReportArgs,
"Display time providers and their priority levels"
" for current and event times\n"};
"Display time providers information for given interest level.\n"
"interest level 0 - List providers and their priorities.\n"
" 1 - Additionally show current time obtained from each provider.\n"};
static void generalTimeReportCallFunc(const iocshArgBuf *args)
{
generalTimeReport(args[0].ival);
}
/* installLastResortEventProvider */
static const iocshFuncDef installLastResortEventProviderFuncDef = {"installLastResortEventProvider", 0, NULL,
"Installs the optional Last Resort event provider"
" at priority 999,\nwhich returns the current time"
" for every event number\n"};
static const iocshFuncDef installLastResortEventProviderFuncDef = {"installLastResortEventProvider",0,NULL,
"Installs the optional Last Resort event provider at priority 999,\n"
"which returns the current time for every event number\n"};
static void installLastResortEventProviderCallFunc(const iocshArgBuf *args)
{
installLastResortEventProvider();

View File

@@ -711,8 +711,6 @@ static void freeLogClient(struct iocLogClient *pclient)
epicsSocketDestroy ( pclient->insock );
free (pclient);
return;
}

View File

@@ -559,7 +559,7 @@ void epicsStdCall iocLogPrefix(const char * prefix)
if (logClientPrefix) {
/* No error message if the new prefix is identical to the old one */
if (strcmp(logClientPrefix, prefix))
if (strcmp(logClientPrefix, prefix)!=0)
printf (ERL_WARNING " iocLogPrefix: The prefix was already set to "
"\"%s\" and can't be changed.\n", logClientPrefix);
return;

View File

@@ -72,7 +72,7 @@ static void trans ( MAC_HANDLE *handle, MAC_ENTRY *entry, int level,
static void refer ( MAC_HANDLE *handle, MAC_ENTRY *entry, int level,
const char **rawval, char **value, char *valend );
static void cpy2val( const char *src, char **value, char *valend );
static void cpy2val( const char *src, char **value, const char *valend );
static char *Strdup( const char *string );
@@ -948,8 +948,6 @@ static void trans( MAC_HANDLE *handle, MAC_ENTRY *entry, int level,
still there to be seen) */
*rawval = ( *r == '\0' ) ? r - 1 : r;
*value = v;
return;
}
/*
@@ -1110,14 +1108,13 @@ cleanup:
*rawval = r;
*value = v;
return;
}
/*
* Copy a string, honoring the 'end of destination string' pointer
* Returns with **value pointing to the '\0' terminator
*/
static void cpy2val(const char *src, char **value, char *valend)
static void cpy2val(const char *src, char **value, const char *valend)
{
char *v = *value;
while ((v < valend) && (*v = *src++)) { v++; }

View File

@@ -15,13 +15,10 @@
#include <stdio.h>
#include <string.h>
#include "dbDefs.h"
#include "epicsTypes.h"
#include "osiSock.h"
#ifndef NELEMENTS
#define NELEMENTS(A) (sizeof(A)/sizeof(A[0]))
#endif /*NELEMENTS*/
/*
* addrArrayToUL ()
*/

View File

@@ -503,7 +503,7 @@ long devUnregisterAddress(
return S_dev_addressNotFound;
}
if (strcmp(pOwnerName,pRange->pOwnerName)) {
if (strcmp(pOwnerName,pRange->pOwnerName)!=0) {
s = S_dev_addressOverlap;
errPrintf (
s,

View File

@@ -275,18 +275,12 @@ void epicsThread::setPriority (unsigned int priority) throw ()
bool epicsThread::priorityIsEqual (const epicsThread &otherThread) const throw ()
{
if ( epicsThreadIsEqual (this->id, otherThread.id) ) {
return true;
}
return false;
return epicsThreadIsEqual (this->id, otherThread.id)!=0;
}
bool epicsThread::isSuspended () const throw ()
{
if ( epicsThreadIsSuspended (this->id) ) {
return true;
}
return false;
return epicsThreadIsSuspended (this->id)!=0;
}
bool epicsThread::operator == (const epicsThread &rhs) const throw ()

View File

@@ -44,8 +44,9 @@ void epicsTime::throwError(int code)
}
epicsTime::epicsTime ( const epicsTimeStamp & replace ) {
ts = replace;
epicsTime::epicsTime ( const epicsTimeStamp & replace )
:ts(replace)
{
if(ts.nsec >= nSecPerSec)
throw std::logic_error("epicsTimeStamp has overflow in nano-seconds field");
}

View File

@@ -58,7 +58,7 @@ static void thread_hook(epicsThreadId pthreadInfo)
/* Set the name of the thread's process. Limited to 16 characters. */
char comm[16];
if (strcmp(pthreadInfo->name, "_main_")) {
if (strcmp(pthreadInfo->name, "_main_") != 0) {
snprintf(comm, sizeof(comm), "%s", pthreadInfo->name);
prctl(PR_SET_NAME, comm, 0l, 0l, 0l);
}

View File

@@ -25,7 +25,7 @@
#define nDigitsDottedIP 4u
#define chunkSize 8u
#define makeMask(NBITS) ( ( 1u << ( (unsigned) NBITS) ) - 1u )
#define makeMask(NBITS) ( ( 1u << ( (unsigned) (NBITS)) ) - 1u )
/*
* sockAddrAreIdentical()

View File

@@ -210,7 +210,7 @@ extern "C" epicsTimerQueueId epicsStdCall
epicsSingleton < timerQueueActiveMgr > :: reference ref =
timerQueueMgrEPICS.getReference ();
epicsTimerQueueActiveForC & tmr =
ref->allocate ( ref, okToShare ? true : false, threadPriority );
ref->allocate ( ref, okToShare != 0, threadPriority );
return &tmr;
}
catch ( ... ) {

View File

@@ -24,6 +24,11 @@
#include "epicsTimer.h"
#include "compilerDependencies.h"
#if __cplusplus<201103L
# define final
# define override
#endif
#ifdef DEBUG
# define debugPrintf(ARGSINPAREN) printf ARGSINPAREN
#else
@@ -34,12 +39,12 @@ template < class T > class epicsGuard;
class timer : public epicsTimer, public tsDLNode < timer > {
public:
void destroy ();
void start ( class epicsTimerNotify &, const epicsTime & );
void start ( class epicsTimerNotify &, double delaySeconds );
void cancel ();
expireInfo getExpireInfo () const;
void show ( unsigned int level ) const;
void destroy () override;
void start ( class epicsTimerNotify &, const epicsTime & ) override final;
void start ( class epicsTimerNotify &, double delaySeconds ) override final;
void cancel () override final;
expireInfo getExpireInfo () const override final;
void show ( unsigned int level ) const override final;
void * operator new ( size_t size, tsFreeList < timer, 0x20 > & );
epicsPlacementDeleteOperator (( void *, tsFreeList < timer, 0x20 > & ))
protected:
@@ -62,9 +67,9 @@ private:
friend class timerQueue;
};
struct epicsTimerForC : public epicsTimerNotify, public timer {
struct epicsTimerForC final : public epicsTimerNotify, public timer {
public:
void destroy ();
void destroy () override final;
protected:
epicsTimerForC ( timerQueue &, epicsTimerCallback, void *pPrivateIn );
~epicsTimerForC ();
@@ -73,7 +78,7 @@ protected:
private:
epicsTimerCallback pCallBack;
void * pPrivate;
expireStatus expire ( const epicsTime & currentTime );
expireStatus expire ( const epicsTime & currentTime ) override final;
epicsTimerForC & operator = ( const epicsTimerForC & );
// Visual C++ .net appears to require operator delete if
// placement operator delete is defined? I smell a ms rat
@@ -90,10 +95,10 @@ class timerQueue : public epicsTimerQueue {
public:
timerQueue ( epicsTimerQueueNotify &notify );
virtual ~timerQueue ();
epicsTimer & createTimer ();
epicsTimer & createTimer () override final;
epicsTimerForC & createTimerForC ( epicsTimerCallback pCallback, void *pArg );
double process ( const epicsTime & currentTime );
void show ( unsigned int level ) const;
void show ( unsigned int level ) const override final;
private:
tsFreeList < timer, 0x20 > timerFreeList;
tsFreeList < epicsTimerForC, 0x20 > timerForCFreeList;
@@ -133,9 +138,9 @@ public:
typedef epicsSingleton < timerQueueActiveMgr > :: reference RefMgr;
timerQueueActive ( RefMgr &, bool okToShare, unsigned priority );
void start ();
epicsTimer & createTimer ();
epicsTimer & createTimer () override final;
epicsTimerForC & createTimerForC ( epicsTimerCallback pCallback, void *pArg );
void show ( unsigned int level ) const;
void show ( unsigned int level ) const override final;
bool sharingOK () const;
unsigned threadPriority () const;
protected:
@@ -150,9 +155,9 @@ private:
bool okToShare;
int exitFlag; // use atomic ops
bool terminateFlag;
void run ();
void reschedule ();
double quantum ();
void run () override final;
void reschedule () override final;
double quantum () override final;
void _printLastChanceExceptionMessage (
const char * pExceptionTypeName,
const char * pExceptionContext );
@@ -161,7 +166,7 @@ private:
timerQueueActive & operator = ( const timerQueueActive & );
};
class timerQueueActiveMgr {
class timerQueueActiveMgr final {
public:
typedef epicsSingleton < timerQueueActiveMgr > :: reference RefThis;
timerQueueActiveMgr ();
@@ -181,10 +186,10 @@ extern epicsSingleton < timerQueueActiveMgr > timerQueueMgrEPICS;
class timerQueuePassive : public epicsTimerQueuePassive {
public:
timerQueuePassive ( epicsTimerQueueNotify & );
epicsTimer & createTimer ();
epicsTimer & createTimer () override final;
epicsTimerForC & createTimerForC ( epicsTimerCallback pCallback, void *pArg );
void show ( unsigned int level ) const;
double process ( const epicsTime & currentTime );
void show ( unsigned int level ) const override final;
double process ( const epicsTime & currentTime ) override final;
protected:
timerQueue queue;
~timerQueuePassive ();
@@ -193,7 +198,7 @@ protected:
timerQueuePassive & operator = ( const timerQueuePassive & );
};
struct epicsTimerQueuePassiveForC :
struct epicsTimerQueuePassiveForC final :
public epicsTimerQueueNotify, public timerQueuePassive {
public:
epicsTimerQueuePassiveForC (
@@ -208,15 +213,15 @@ private:
epicsTimerQueueNotifyQuantum pSleepQuantumCallback;
void * pPrivate;
static epicsSingleton < tsFreeList < epicsTimerQueuePassiveForC, 0x10 > > pFreeList;
void reschedule ();
double quantum ();
void reschedule () override final;
double quantum () override final;
};
struct epicsTimerQueueActiveForC : public timerQueueActive,
struct epicsTimerQueueActiveForC final : public timerQueueActive,
public tsDLNode < epicsTimerQueueActiveForC > {
public:
epicsTimerQueueActiveForC ( RefMgr &, bool okToShare, unsigned priority );
void release ();
void release () override final;
void * operator new ( size_t );
void operator delete ( void * );
protected:

View File

@@ -14,6 +14,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include "epicsUnitTest.h"
#include "epicsString.h"
@@ -198,10 +199,22 @@ void testStrTok(void)
static
void testEpicsStrPrintEscaped(void)
{
const char *filename = "testEpicsStrPrintEscaped";
const char *filename;
FILE *testFile;
FILE *readOnly;
#ifdef __rtems__
/* ensure there is a writable area */
mkdir( "/tmp", S_IRWXU );
filename = "/tmp/testEpicsStrPrintEscaped";
#else
filename = "testEpicsStrPrintEscaped";
#endif
// Avoid printing to stdout by redirecting everything to a file
FILE *testFile = fopen(filename, "a");
FILE *readOnly = fopen(filename, "r");
testFile = fopen(filename, "a");
readOnly = fopen(filename, "r");
testDiag("testEpicsStrPrintEscaped()");