Cleaned up VxWorks 6.9 symLib warnings

VxWorks 6.9 deprecated several symFindBy...() routines, which
result in warning messages at build-time. I rewrote the code
that uses these to use the newer API on VxWorks 6.9.

Also deprecated the two epicsDynLink.h symFindByNameEPICS()
and symFindByNameAndTypeEPICS() routines; epicsFindSymbol() in
epicsFindSymbol.h is now available on most platforms instead.
This commit is contained in:
Andrew Johnson
2014-11-18 17:46:41 -06:00
parent 09797ee7ca
commit a99f1d238e
4 changed files with 136 additions and 118 deletions
+6 -9
View File
@@ -12,7 +12,7 @@
#include <stdio.h>
#include "epicsDynLink.h"
#include "epicsFindSymbol.h"
#include "epicsExit.h"
extern "C" {
@@ -21,15 +21,12 @@ typedef int (*sysAtReboot_t)(void(func)(void));
void atRebootRegister(void)
{
STATUS status;
sysAtReboot_t sysAtReboot;
SYM_TYPE type;
sysAtReboot_t sysAtReboot = (sysAtReboot_t) epicsFindSymbol("_sysAtReboot");
status = symFindByNameEPICS(sysSymTbl, "_sysAtReboot",
(char **)&sysAtReboot, &type);
if (status == OK) {
status = sysAtReboot(epicsExitCallAtExits);
if (status != OK) {
if (sysAtReboot) {
STATUS status = sysAtReboot(epicsExitCallAtExits);
if (status) {
printf("atReboot: sysAtReboot returned error %d\n", status);
}
} else {
+74 -71
View File
@@ -1,92 +1,95 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* Copyright (c) 2014 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
* 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.
\*************************************************************************/
/* $Id $
*
* Comments from original version:
* On the MIPS processor, all symbols do not have the prepended underscore.
* Here we redefine symFindByName to look at the second character of the
* name string.
*
* On various RISC processors (at least MIPS and PPC), symbols do not have
* the prepended underscore. Here we redefine symFindByName so that, if the
* name lookup fails and if the first character of the name is "_", the
* lookup is repeated starting at the second character of the name string.
*
* 01a,08apr97,bdg created.
* 02a,03apr97,npr changed from mips.h into symFindByNameMips.c
* 03a,03jun98,wfl changed Mips -> EPICS and avoid architecture knowledge
* On 68K targets, all symbols have an underscore prepended to their name.
* This code permits both standards to work, as long as you're not looking
* for a symbol name that actually begins with an underscore.
*/
#include <string.h>
#include "epicsDynLink.h"
STATUS symFindByNameEPICS(
SYMTAB_ID symTblId,
char *name,
char **ppvalue,
SYM_TYPE *pType )
#if _WRS_VXWORKS_MAJOR < 6 || _WRS_VXWORKS_MINOR < 9
static int symNoUnderscore(SYMTAB_ID symTblId)
{
static int leadingUnderscore = 1;
static int init = 0;
STATUS status = ERROR;
static int init = 0;
static int noUnderscore = 0;
if (!init) {
char *pSymValue;
SYM_TYPE type;
status = symFindByName ( symTblId, "symFindByNameEPICS", &pSymValue, &type );
if (status==OK) {
leadingUnderscore = 0;
}
init = 1;
}
if (!init) {
char name[] = "symFindByNameEPICS";
char *pSymValue;
SYM_TYPE type;
if (name[0] != '_' || leadingUnderscore) {
status = symFindByName ( symTblId, name, ppvalue, pType );
}
else {
status = symFindByName ( symTblId, (name+1), ppvalue, pType );
}
return status;
if (symFindByName(symTblId, name, &pSymValue, &type) == OK)
noUnderscore = 1;
init = 1;
}
return noUnderscore;
}
STATUS symFindByNameAndTypeEPICS(
SYMTAB_ID symTblId,
char *name,
char **ppvalue,
SYM_TYPE *pType,
SYM_TYPE sType,
SYM_TYPE mask )
STATUS symFindByNameEPICS(SYMTAB_ID symTblId, char *name, char **ppvalue,
SYM_TYPE *pType)
{
static int leadingUnderscore = 1;
static int init = 0;
STATUS status = ERROR;
if (name[0] == '_' && symNoUnderscore(symTblId))
name++;
if (!init) {
char *pSymValue;
SYM_TYPE type;
status = symFindByName (symTblId, "symFindByNameAndTypeEPICS", &pSymValue, &type );
if (status==OK) {
leadingUnderscore = 0;
}
init = 1;
}
if (name[0] != '_' || leadingUnderscore) {
status = symFindByNameAndType ( symTblId, name, ppvalue, pType, sType, mask );
}
else if (leadingUnderscore) {
status = symFindByNameAndType ( symTblId, (name+1), ppvalue, pType, sType, mask );
}
return status;
return symFindByName(symTblId, name, ppvalue, pType);
}
STATUS symFindByNameAndTypeEPICS(SYMTAB_ID symTblId, char *name,
char **ppvalue, SYM_TYPE *pType, SYM_TYPE sType, SYM_TYPE mask)
{
if (name[0] == '_' && symNoUnderscore(symTblId))
name++;
return symFindByNameAndType(symTblId, name, ppvalue, pType, sType, mask);
}
#else /* VxWorks 6.9 deprecated the symFindBy routines */
STATUS symFindByNameEPICS(SYMTAB_ID symTblId, char *name, char **ppvalue,
SYM_TYPE *pType)
{
SYMBOL_DESC symDesc;
STATUS status;
memset(&symDesc, 0, sizeof(SYMBOL_DESC));
symDesc.mask = SYM_FIND_BY_NAME;
symDesc.name = name + (name[0] == '_');
status = symFind(sysSymTbl, &symDesc);
if (!status) {
*ppvalue = symDesc.value;
*pType = symDesc.type;
}
return status;
}
STATUS symFindByNameAndTypeEPICS(SYMTAB_ID symTblId, char *name,
char **ppvalue, SYM_TYPE *pType, SYM_TYPE sType, SYM_TYPE mask)
{
SYMBOL_DESC symDesc;
STATUS status;
memset(&symDesc, 0, sizeof(SYMBOL_DESC));
symDesc.mask = SYM_FIND_BY_NAME | SYM_FIND_BY_TYPE;
symDesc.name = name + (name[0] == '_');
symDesc.type = sType;
symDesc.typeMask = mask;
status = symFind(sysSymTbl, &symDesc);
if (!status) {
*ppvalue = symDesc.value;
*pType = symDesc.type;
}
return status;
}
#endif
+10 -21
View File
@@ -1,11 +1,10 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* Copyright (c) 2014 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
* 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.
\*************************************************************************/
/*
@@ -16,32 +15,22 @@
#ifndef epicsDynLinkh
#define epicsDynLinkh
#ifdef symFindByName
#undef symFindByName
#endif
#include "vxWorks.h"
#include "symLib.h"
#include "sysSymTbl.h"
#include "compilerDependencies.h"
#ifdef __cplusplus
extern "C" {
#endif
STATUS symFindByNameEPICS(
SYMTAB_ID symTblId,
char *name,
char **pvalue,
SYM_TYPE *pType);
/* Use epicsFindSymbol() instead of these */
STATUS symFindByNameAndTypeEPICS(
SYMTAB_ID symTblId,
char *name,
char **pvalue,
SYM_TYPE *pType,
SYM_TYPE sType,
SYM_TYPE mask);
STATUS symFindByNameEPICS(SYMTAB_ID symTblId, char *name, char **pvalue,
SYM_TYPE *pType) EPICS_DEPRECATED;
STATUS symFindByNameAndTypeEPICS(SYMTAB_ID symTblId, char *name, char **pvalue,
SYM_TYPE *pType, SYM_TYPE sType, SYM_TYPE mask) EPICS_DEPRECATED;
#ifdef __cplusplus
}
+46 -17
View File
@@ -56,7 +56,9 @@ epicsShareFunc void * epicsLoadLibrary(const char *name)
epicsShareFunc const char *epicsLoadError(void)
{
if (oldmsg) free(oldmsg);
if (oldmsg)
free(oldmsg);
oldmsg = errmsg;
errmsg = NULL;
return oldmsg;
@@ -65,22 +67,49 @@ epicsShareFunc const char *epicsLoadError(void)
void *epicsFindSymbol(const char *name)
{
STATUS status;
SYM_TYPE type;
#if _WRS_VXWORKS_MAJOR < 6 || _WRS_VXWORKS_MINOR < 9
char *pvalue;
status = symFindByName( sysSymTbl, (char *)name, &pvalue, &type );
if(status) {
if(name[0] == '_' ) {
status = symFindByName(sysSymTbl, (char *)(name+1), &pvalue, &type);
} else {
char *pname;
pname = dbmfMalloc(strlen(name) + 2);
strcpy(pname,"_");
strcat(pname,name);
status = symFindByName(sysSymTbl,pname, &pvalue, &type);
dbmfFree(pname);
}
SYM_TYPE type;
status = symFindByName(sysSymTbl, (char *)name, &pvalue, &type);
if (!status)
return pvalue;
if (name[0] == '_' ) {
status = symFindByName(sysSymTbl, (char *)(name+1), &pvalue, &type);
}
if(status) return(0);
return((void *)pvalue);
#if CPU_FAMILY == MC680X0
else {
char *pname = dbmfMalloc(strlen(name) + 2);
pname[0] = '_';
strcpy(pname + 1, name);
status = symFindByName(sysSymTbl, pname, &pvalue, &type);
dbmfFree(pname);
}
#endif
if (!status)
return pvalue;
#else
SYMBOL_DESC symDesc;
memset(&symDesc, 0, sizeof(SYMBOL_DESC));
symDesc.mask = SYM_FIND_BY_NAME;
symDesc.name = (char *) name;
status = symFind(sysSymTbl, &symDesc);
if (!status)
return symDesc.value;
if (name[0] == '_') {
symDesc.name++;
status = symFind(sysSymTbl, &symDesc);
if (!status)
return symDesc.value;
}
/* No need to prepend an '_'; 68K-only, no longer supported */
#endif
return 0;
}