19 #include "dbAccessDefs.h" 32 #define IFDEBUG(n) if (lnkDebug_debug >= (n)) 48 static void delegate_free(
jlink *pjlink)
55 printf(
"Link trace: Calling %s::free_jlink(%p)\n",
58 pif->free_jlink(pjlink);
63 printf(
"Link trace: %s::free_jlink(%p) returned\n",
67 static jlif_result delegate_null(
jlink *pjlink)
74 printf(
"Link trace: Calling %s::parse_null(%p)\n",
77 res = pif->parse_null(pjlink);
80 printf(
"Link trace: %s::parse_null(%p) returned %s\n",
81 pif->name, pjlink, jlif_result_name[res]);
86 static jlif_result delegate_boolean(
jlink *pjlink,
int val)
93 printf(
"Link trace: Calling %s::parse_boolean(%p, %d)\n",
94 pif->name, pjlink, val);
96 res = pif->parse_boolean(pjlink, val);
99 printf(
"Link trace: %s::parse_boolean(%p) returned %s\n",
100 pif->name, pjlink, jlif_result_name[res]);
105 static jlif_result delegate_integer(
jlink *pjlink,
long long num)
112 printf(
"Link trace: Calling %s::parse_integer(%p, %lld)\n",
113 pif->name, pjlink, num);
115 res = pif->parse_integer(pjlink, num);
118 printf(
"Link trace: %s::parse_integer(%p) returned %s\n",
119 pif->name, pjlink, jlif_result_name[res]);
124 static jlif_result delegate_double(
jlink *pjlink,
double num)
131 printf(
"Link trace: Calling %s::parse_double(%p, %g)\n",
132 pif->name, pjlink, num);
134 res = pif->parse_double(pjlink, num);
137 printf(
"Link trace: %s::parse_double(%p) returned %s\n",
138 pif->name, pjlink, jlif_result_name[res]);
143 static jlif_result delegate_string(
jlink *pjlink,
const char *val,
size_t len)
150 printf(
"Link trace: Calling %s::parse_string(%p, \"%.*s\")\n",
151 pif->name, pjlink, (
int) len, val);
153 res = pif->parse_string(pjlink, val, len);
156 printf(
"Link trace: %s::parse_string(%p) returned %s\n",
157 pif->name, pjlink, jlif_result_name[res]);
162 static jlif_key_result delegate_start_map(
jlink *pjlink)
169 printf(
"Link trace: Calling %s::parse_start_map(%p)\n",
172 res = pif->parse_start_map(pjlink);
175 printf(
"Link trace: %s::parse_start_map(%p) returned %s\n",
176 pif->name, pjlink, jlif_key_result_name[res]);
181 static jlif_result delegate_map_key(
jlink *pjlink,
const char *key,
size_t len)
188 printf(
"Link trace: Calling %s::parse_map_key(%p, \"%.*s\")\n",
189 pif->name, pjlink, (
int) len, key);
191 res = pif->parse_map_key(pjlink, key, len);
194 printf(
"Link trace: %s::parse_map_key(%p) returned %s\n",
195 pif->name, pjlink, jlif_result_name[res]);
200 static jlif_result delegate_end_map(
jlink *pjlink)
207 printf(
"Link trace: Calling %s::parse_end_map(%p)\n",
210 res = pif->parse_end_map(pjlink);
213 printf(
"Link trace: %s::parse_end_map(%p) returned %s\n",
214 pif->name, pjlink, jlif_result_name[res]);
219 static jlif_result delegate_start_array(
jlink *pjlink)
226 printf(
"Link trace: Calling %s::parse_(%p)\n",
229 res = pif->parse_start_array(pjlink);
232 printf(
"Link trace: %s::parse_start_array(%p) returned %s\n",
233 pif->name, pjlink, jlif_result_name[res]);
238 static jlif_result delegate_end_array(
jlink *pjlink)
245 printf(
"Link trace: Calling %s::parse_end_array(%p)\n",
248 res = pif->parse_end_array(pjlink);
251 printf(
"Link trace: %s::parse_end_array(%p) returned %s\n",
252 pif->name, pjlink, jlif_result_name[res]);
257 static void delegate_start_child(
jlink *pjlink,
jlink *child)
263 printf(
"Link trace: Calling %s::start_child(%p, %p)\n",
264 pif->name, pjlink, child);
266 pif->start_child(pjlink, child);
269 printf(
"Link trace: %s::start_child(%p) returned\n",
273 static void delegate_end_child(
jlink *pjlink,
jlink *child)
279 printf(
"Link trace: Calling %s::end_child(%p, %p)\n",
280 pif->name, pjlink, child);
282 pif->end_child(pjlink, child);
285 printf(
"Link trace: %s::end_child(%p) returned\n",
289 static struct lset* delegate_get_lset(
const jlink *pjlink)
294 printf(
"Link trace: NOT calling %s::get_lset(%p)\n",
300 static void delegate_report(
const jlink *pjlink,
int level,
int indent)
306 printf(
"Link trace: Calling %s::report(%p, %d, %d)\n",
307 pif->name, pjlink, level, indent);
309 pif->report(pjlink, level, indent);
312 printf(
"Link trace: %s::report(%p) returned\n",
316 static long delegate_map_children(
jlink *pjlink, jlink_map_fn rtn,
void *ctx)
323 printf(
"Link trace: Calling %s::map_children(%p, %p, %p)\n",
324 pif->name, pjlink, rtn, ctx);
326 res = pif->map_children(pjlink, rtn, ctx);
329 printf(
"Link trace: %s::map_children(%p) returned %ld\n",
330 pif->name, pjlink, res);
338 static void delegate_openLink(
struct link *plink)
346 printf(
"Link trace: Calling %s::openLink(%p = jlink %p)\n",
350 clset->openLink(clink);
353 printf(
"Link trace: %s::openLink(%p) returned\n",
357 static void delegate_removeLink(
struct dbLocker *locker,
struct link *plink)
365 printf(
"Link trace: Calling %s::removeLink(%p, %p)\n",
368 clset->removeLink(locker, clink);
371 printf(
"Link trace: %s::removeLink(%p) returned\n",
375 static long delegate_loadScalar(
struct link *plink,
short dbrType,
void *
pbuffer)
384 printf(
"Link trace: Calling %s::loadScalar(%p, %s, %p)\n",
388 res = clset->loadScalar(clink, dbrType, pbuffer);
391 printf(
"Link trace: %s::loadScalar(%p) returned %ld (0x%lx)\n",
397 static long delegate_loadLS(
struct link *plink,
char *pbuffer,
epicsUInt32 size,
407 printf(
"Link trace: Calling %s::loadLS(%p, %p, %u)\n",
408 dlink->
child_jlif->name, clink, pbuffer, size);
410 res = clset->loadLS(clink, pbuffer, size, plen);
413 printf(
"Link trace: %s::loadLS(%p) returned %ld (0x%lx)\n",
416 printf(
" Loaded: %u byte(s) \"%s\"\n", *plen, pbuffer);
422 static long delegate_loadArray(
struct link *plink,
short dbrType,
void *pbuffer,
432 printf(
"Link trace: Calling %s::loadArray(%p, %s, %p, %ld)\n",
436 res = clset->loadArray(clink, dbrType, pbuffer, pnRequest);
439 printf(
"Link trace: %s::loadArray(%p) returned %ld (0x%lx)\n",
442 printf(
" Loaded: %ld element(s)\n", pnRequest ? *pnRequest : 1l);
448 static int delegate_isConnected(
const struct link *plink)
457 printf(
"Link trace: Calling %s::isConnected(%p)\n",
460 res = clset->isConnected(clink);
463 printf(
"Link trace: %s::isConnected(%p) returned %d (%s)\n",
465 res == 0 ?
"No" : res == 1 ?
"Yes" :
"Bad value");
470 static int delegate_getDBFtype(
const struct link *plink)
479 printf(
"Link trace: Calling %s::getDBFtype(%p)\n",
482 res = clset->getDBFtype(clink);
485 printf(
"Link trace: %s::getDBFtype(%p) returned %d (%s)\n",
492 static long delegate_getElements(
const struct link *plink,
long *pnElements)
501 printf(
"Link trace: Calling %s::getElements(%p)\n",
504 res = clset->getElements(clink, pnElements);
507 printf(
"Link trace: %s::getElements(%p) returned %ld (0x%lx)\n",
510 printf(
" Result: %ld element(s)\n", *pnElements);
516 static long delegate_getValue(
struct link *plink,
short dbrType,
void *pbuffer,
526 printf(
"Link trace: Calling %s::getValue(%p, %s, %p, %ld)\n",
530 res = clset->getValue(clink, dbrType, pbuffer, pnRequest);
533 printf(
"Link trace: %s::getValue(%p) returned %ld (0x%lx)\n",
536 printf(
" Got: %ld element(s)\n", pnRequest ? *pnRequest : 1l);
542 static long delegate_getControlLimits(
const struct link *plink,
543 double *lo,
double *hi)
552 printf(
"Link trace: Calling %s::getControlLimits(%p)\n",
555 res = clset->getControlLimits(clink, lo, hi);
558 printf(
"Link trace: %s::getControlLimits(%p) returned %ld (0x%lx)\n",
561 printf(
" Got: Lo = %g, Hi = %g\n", *lo, *hi);
567 static long delegate_getGraphicLimits(
const struct link *plink,
568 double *lo,
double *hi)
577 printf(
"Link trace: Calling %s::getGraphicLimits(%p)\n",
580 res = clset->getGraphicLimits(clink, lo, hi);
583 printf(
"Link trace: %s::getGraphicLimits(%p) returned %ld (0x%lx)\n",
586 printf(
" Got: Lo = %g, Hi = %g\n", *lo, *hi);
592 static long delegate_getAlarmLimits(
const struct link *plink,
593 double *lolo,
double *lo,
double *hi,
double *hihi)
602 printf(
"Link trace: Calling %s::getAlarmLimits(%p)\n",
605 res = clset->getAlarmLimits(clink, lolo, lo, hi, hihi);
608 printf(
"Link trace: %s::getAlarmLimits(%p) returned %ld (0x%lx)\n",
611 printf(
" Got: Lolo = %g, Lo = %g, Hi = %g, Hihi = %g\n",
612 *lolo, *lo, *hi, *hihi);
618 static long delegate_getPrecision(
const struct link *plink,
short *precision)
627 printf(
"Link trace: Calling %s::getPrecision(%p)\n",
630 res = clset->getPrecision(clink, precision);
633 printf(
"Link trace: %s::getPrecision(%p) returned %ld (0x%lx)\n",
636 printf(
" Got: prec = %d\n", *precision);
642 static long delegate_getUnits(
const struct link *plink,
char *units,
int unitsSize)
651 printf(
"Link trace: Calling %s::getUnits(%p)\n",
654 res = clset->getUnits(clink, units, unitsSize);
657 printf(
"Link trace: %s::getUnits(%p) returned %ld (0x%lx)\n",
660 printf(
" Got: Units = '%s'\n", units);
666 static long delegate_getAlarm(
const struct link *plink,
epicsEnum16 *stat,
676 printf(
"Link trace: Calling %s::getAlarm(%p)\n",
679 res = clset->getAlarm(clink, stat, sevr);
682 printf(
"Link trace: %s::getAlarm(%p) returned %ld (0x%lx)\n",
686 stat ?
" Status = " :
"",
689 sevr ?
" Severity = " :
"",
707 printf(
"Link trace: Calling %s::getTimeStamp(%p)\n",
710 res = clset->getTimeStamp(clink, pstamp);
713 printf(
"Link trace: %s::getTimeStamp(%p) returned %ld (0x%lx)\n",
719 "%Y-%m-%d %H:%M:%S.%09f", pstamp);
720 printf(
" Got: Timestamp = '%s'\n", timeStr);
727 static long delegate_putValue(
struct link *plink,
short dbrType,
728 const void *pbuffer,
long nRequest)
737 printf(
"Link trace: Calling %s::putValue(%p, %s, %p, %ld)\n",
741 res = clset->putValue(clink, dbrType, pbuffer, nRequest);
744 printf(
"Link trace: %s::putValue(%p) returned %ld (0x%lx)\n",
750 static long delegate_putAsync(
struct link *plink,
short dbrType,
751 const void *pbuffer,
long nRequest)
760 printf(
"Link trace: Calling %s::putAsync(%p, %s, %p, %ld)\n",
764 res = clset->putAsync(clink, dbrType, pbuffer, nRequest);
767 printf(
"Link trace: %s::putAsync(%p) returned %ld (0x%lx)\n",
773 static void delegate_scanForward(
struct link *plink)
781 printf(
"Link trace: Calling %s::scanForward(%p)\n",
784 clset->scanForward(clink);
787 printf(
"Link trace: %s::scanForward(%p) returned\n",
791 static long delegate_doLocked(
struct link *plink, dbLinkUserCallback rtn,
void *priv)
800 printf(
"Link trace: Calling %s::doLocked(%p, %p, %p)\n",
803 res = clset->doLocked(clink, rtn, priv);
806 printf(
"Link trace: %s::doLocked(%p) returned %ld (0x%lx)\n",
831 printf("lnkDebug_alloc -> debug@%p\n", dlink);
833 return &dlink->
jlink;
836 static jlink* lnkTrace_alloc(
short dbfType)
853 printf("lnkTrace_alloc -> debug@%p\n", dlink);
855 return &dlink->jlink;
858 static void lnkDebug_free(jlink *pjlink)
863 printf("lnkDebug_free(debug@%p)\n", dlink);
870 static jlif_key_result lnkDebug_start_map(jlink *pjlink)
875 printf("lnkDebug_start_map(debug@%p)\n", dlink);
877 switch (dlink->dbfType) {
879 return jlif_key_child_inlink;
881 return jlif_key_child_outlink;
883 return jlif_key_child_outlink;
885 return jlif_key_stop;
888 static jlif_result lnkDebug_end_map(jlink *pjlink)
893 printf("lnkDebug_end_map(debug@%p)\n", dlink);
895 return jlif_continue;
898 static void lnkDebug_start_child(jlink *parent, jlink *child)
901 const jlif *pif = child->pif;
902 const jlif delegate_jlif = {
906 pif->parse_null ? delegate_null :
NULL,
907 pif->parse_boolean ? delegate_boolean :
NULL,
908 pif->parse_integer ? delegate_integer :
NULL,
909 pif->parse_double ? delegate_double :
NULL,
910 pif->parse_string ? delegate_string :
NULL,
911 pif->parse_start_map ? delegate_start_map :
NULL,
912 pif->parse_map_key ? delegate_map_key :
NULL,
913 pif->parse_end_map ? delegate_end_map :
NULL,
914 pif->parse_start_array ? delegate_start_array :
NULL,
915 pif->parse_end_array ? delegate_end_array :
NULL,
916 pif->end_child ? delegate_end_child :
NULL,
918 pif->report ? delegate_report :
NULL,
919 pif->map_children ? delegate_map_children :
NULL,
920 pif->start_child ? delegate_start_child :
NULL 924 printf("lnkDebug_start_child(debug@%p, %s@%p)\n", dlink,
925 child->pif->name, child);
928 memcpy(&dlink->
jlif, &delegate_jlif, sizeof(jlif));
931 child->pif = &dlink->jlif;
934 printf("lnkDebug_start_child: pif %p => %p\n", pif, child->pif);
937 printf("Link
trace: %s::alloc_jlink(%s) returned %p\n",
941 static void lnkDebug_end_child(jlink *parent, jlink *child)
946 lset delegate_lset = {
949 plset->openLink ? delegate_openLink :
NULL,
950 plset->removeLink ? delegate_removeLink :
NULL,
951 plset->loadScalar ? delegate_loadScalar :
NULL,
952 plset->loadLS ? delegate_loadLS :
NULL,
953 plset->loadArray ? delegate_loadArray :
NULL,
954 plset->isConnected ? delegate_isConnected :
NULL,
955 plset->getDBFtype ? delegate_getDBFtype :
NULL,
956 plset->getElements ? delegate_getElements :
NULL,
957 plset->getValue ? delegate_getValue :
NULL,
958 plset->getControlLimits ? delegate_getControlLimits :
NULL,
959 plset->getGraphicLimits ? delegate_getGraphicLimits :
NULL,
960 plset->getAlarmLimits ? delegate_getAlarmLimits :
NULL,
961 plset->getPrecision ? delegate_getPrecision :
NULL,
962 plset->getUnits ? delegate_getUnits :
NULL,
963 plset->getAlarm ? delegate_getAlarm :
NULL,
964 plset->getTimeStamp ? delegate_getTimeStamp :
NULL,
965 plset->putValue ? delegate_putValue :
NULL,
966 plset->putAsync ? delegate_putAsync :
NULL,
967 plset->scanForward ? delegate_scanForward :
NULL,
968 plset->doLocked ? delegate_doLocked :
NULL 972 printf("lnkDebug_end_child(debug@%p, %s@%p)\n", dlink,
973 child->pif->name, child);
977 plink->
value.json.jlink = child;
980 memcpy(&dlink->
lset, &delegate_lset, sizeof(lset));
983 printf("lnkDebug_end_child: lset %p => %p\n", plset, &dlink->lset);
986 static struct lset* lnkDebug_get_lset(const jlink *pjlink)
991 printf("lnkDebug_get_lset(debug@%p)\n", pjlink);
996 static void lnkDebug_report(const jlink *pjlink,
int level,
int indent)
1001 printf("lnkDebug_report(debug@%p)\n", dlink);
1006 printf("%*s'debug':\n", indent, "");
1009 dbJLinkReport(dlink->child_link.value.json.jlink, level, indent + 2);
1018 printf(
"lnkDebug_map_children(debug@%p)\n", dlink);
1021 return dbJLinkMapChildren(&dlink->
child_link, rtn, ctx);
1029 static jlif lnkDebugIf = {
1030 "debug", lnkDebug_alloc, lnkDebug_free,
1032 lnkDebug_start_map,
NULL, lnkDebug_end_map,
1033 NULL,
NULL, lnkDebug_end_child, lnkDebug_get_lset,
1038 static jlif lnkTraceIf = {
1039 "trace", lnkTrace_alloc, lnkDebug_free,
1041 lnkDebug_start_map,
NULL, lnkDebug_end_map,
1042 NULL,
NULL, lnkDebug_end_child, lnkDebug_get_lset,
struct debug_link debug_link
struct dbCommon * precord
#define CONTAINER(ptr, structure, member)
Find parent object from a member pointer.
pvd::StructureConstPtr type
Miscellaneous macro definitions.
LIBCOM_API const char * epicsAlarmSeverityStrings[ALARM_NSEV]
How to convert an alarm severity into a string.
LIBCOM_API size_t epicsStdCall epicsTimeToStrftime(char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS)
Convert epicsTimeStamp to string. See epicsTime::strftime()
int errlogPrintf(const char *pFormat,...)
EPICS time stamp, for use from C code.
long lnkDebug_map_children(jlink *pjlink, jlink_map_fn rtn, void *ctx)
const char * dbGetFieldTypeString(int dbfType)
epicsExportAddress(int, lnkDebug_debug)
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...
LIBCOM_API const char * epicsAlarmConditionStrings[ALARM_NSTATUS]
How to convert an alarm condition/status into a string.