Skip to content
Snippets Groups Projects
Commit 270218d1 authored by benjamin.franksen's avatar benjamin.franksen
Browse files

pv: report CA failure status via msg member of pvVar or pvSys

parent d3c5e5dc
No related branches found
No related tags found
No related merge requests found
...@@ -7,10 +7,11 @@ ...@@ -7,10 +7,11 @@
#define epicsExportSharedSymbols #define epicsExportSharedSymbols
#include "pv.h" #include "pv.h"
#define INVOKE(expr) \ #define INVOKE(x, expr) \
{\ {\
int _status = expr;\ int _status = expr;\
if (!(_status & CA_M_SUCCESS)) {\ if (!(_status & CA_M_SUCCESS)) {\
(x)->msg = ca_message(_status);\
errlogSevPrintf(sevrFromCA(_status), "%s: %s", #expr, ca_message(_status));\ errlogSevPrintf(sevrFromCA(_status), "%s: %s", #expr, ca_message(_status));\
return statFromCA(_status);\ return statFromCA(_status);\
}\ }\
...@@ -29,21 +30,21 @@ epicsShareFunc pvStat pvSysCreate(pvSystem *pSys) ...@@ -29,21 +30,21 @@ epicsShareFunc pvStat pvSysCreate(pvSystem *pSys)
{ {
assert(pSys); assert(pSys);
assert(!ca_current_context()); assert(!ca_current_context());
INVOKE(ca_context_create(ca_enable_preemptive_callback)); INVOKE(pSys, ca_context_create(ca_enable_preemptive_callback));
pSys->id = ca_current_context(); pSys->id = ca_current_context();
return pvStatOK; return pvStatOK;
} }
epicsShareFunc pvStat pvSysFlush(pvSystem sys) epicsShareFunc pvStat pvSysFlush(pvSystem sys)
{ {
INVOKE(ca_flush_io()); INVOKE(&sys, ca_flush_io());
return pvStatOK; return pvStatOK;
} }
epicsShareFunc pvStat pvSysAttach(pvSystem sys) epicsShareFunc pvStat pvSysAttach(pvSystem sys)
{ {
if (!ca_current_context()) if (!ca_current_context())
INVOKE(ca_attach_context(sys.id)); INVOKE(&sys, ca_attach_context(sys.id));
return pvStatOK; return pvStatOK;
} }
...@@ -60,14 +61,14 @@ epicsShareFunc pvStat pvVarCreate(pvSystem sys, const char *name, ...@@ -60,14 +61,14 @@ epicsShareFunc pvStat pvVarCreate(pvSystem sys, const char *name,
var->conn_handler = conn_func; var->conn_handler = conn_func;
var->event_handler = event_func; var->event_handler = event_func;
var->arg = arg; var->arg = arg;
INVOKE(ca_create_channel(name, pvCaConnectionHandler, var, CA_PRIORITY_DEFAULT, &var->chid)); INVOKE(var, ca_create_channel(name, pvCaConnectionHandler, var, CA_PRIORITY_DEFAULT, &var->chid));
return pvStatOK; return pvStatOK;
} }
epicsShareFunc pvStat pvVarDestroy(pvVar *var) epicsShareFunc pvStat pvVarDestroy(pvVar *var)
{ {
assert(var); assert(var);
INVOKE(ca_clear_channel(var->chid)); INVOKE(var, ca_clear_channel(var->chid));
*var = nullPvVar; *var = nullPvVar;
return pvStatOK; return pvStatOK;
} }
...@@ -78,6 +79,7 @@ static void pvCaEventHandler(struct event_handler_args args, pvEventType evt) ...@@ -78,6 +79,7 @@ static void pvCaEventHandler(struct event_handler_args args, pvEventType evt)
unsigned count = (unsigned)args.count; unsigned count = (unsigned)args.count;
assert(args.count >= 0); assert(args.count >= 0);
assert((long)count == args.count); assert((long)count == args.count);
var->msg = ca_message(args.status);
var->event_handler(evt, args.usr, typeFromCA(args.type), count, (pvValue*)args.dbr, statFromCA(args.status)); var->event_handler(evt, args.usr, typeFromCA(args.type), count, (pvValue*)args.dbr, statFromCA(args.status));
} }
...@@ -100,7 +102,7 @@ epicsShareFunc pvStat pvVarGetCallback(pvVar *var, pvType type, unsigned count, ...@@ -100,7 +102,7 @@ epicsShareFunc pvStat pvVarGetCallback(pvVar *var, pvType type, unsigned count,
{ {
assert(var); assert(var);
assert(pv_is_valid_type(type)); assert(pv_is_valid_type(type));
INVOKE(ca_array_get_callback( INVOKE(var, ca_array_get_callback(
typeToCA(type), count, var->chid, pvCaGetHandler, arg)); typeToCA(type), count, var->chid, pvCaGetHandler, arg));
return pvStatOK; return pvStatOK;
} }
...@@ -109,7 +111,7 @@ epicsShareFunc pvStat pvVarPutNoBlock(pvVar *var, pvType type, unsigned count, p ...@@ -109,7 +111,7 @@ epicsShareFunc pvStat pvVarPutNoBlock(pvVar *var, pvType type, unsigned count, p
{ {
assert(var); assert(var);
assert(pv_is_simple_type(type)); assert(pv_is_simple_type(type));
INVOKE(ca_array_put(typeToCA(type), count, var->chid, value)); INVOKE(var, ca_array_put(typeToCA(type), count, var->chid, value));
return pvStatOK; return pvStatOK;
} }
...@@ -117,7 +119,7 @@ epicsShareFunc pvStat pvVarPutCallback(pvVar *var, pvType type, unsigned count, ...@@ -117,7 +119,7 @@ epicsShareFunc pvStat pvVarPutCallback(pvVar *var, pvType type, unsigned count,
{ {
assert(var); assert(var);
assert(pv_is_simple_type(type)); assert(pv_is_simple_type(type));
INVOKE(ca_array_put_callback( INVOKE(var, ca_array_put_callback(
typeToCA(type), count, var->chid, value, pvCaPutHandler, arg)); typeToCA(type), count, var->chid, value, pvCaPutHandler, arg));
return pvStatOK; return pvStatOK;
} }
...@@ -127,7 +129,7 @@ epicsShareFunc pvStat pvVarMonitorOn(pvVar *var, pvType type, unsigned count, vo ...@@ -127,7 +129,7 @@ epicsShareFunc pvStat pvVarMonitorOn(pvVar *var, pvType type, unsigned count, vo
assert(var); assert(var);
assert(pv_is_valid_type(type)); assert(pv_is_valid_type(type));
if (var->monid == NULL) { if (var->monid == NULL) {
INVOKE(ca_create_subscription(typeToCA(type), count, var->chid, INVOKE(var, ca_create_subscription(typeToCA(type), count, var->chid,
DBE_VALUE | DBE_ALARM, pvCaMonitorHandler, arg, &var->monid)); DBE_VALUE | DBE_ALARM, pvCaMonitorHandler, arg, &var->monid));
} }
return pvStatOK; return pvStatOK;
...@@ -137,7 +139,7 @@ epicsShareFunc pvStat pvVarMonitorOff(pvVar *var) ...@@ -137,7 +139,7 @@ epicsShareFunc pvStat pvVarMonitorOff(pvVar *var)
{ {
assert(var); assert(var);
if (var->monid != NULL) { if (var->monid != NULL) {
INVOKE(ca_clear_event(var->monid)); INVOKE(var, ca_clear_event(var->monid));
var->monid = NULL; var->monid = NULL;
} }
return pvStatOK; return pvStatOK;
......
...@@ -42,6 +42,7 @@ typedef void pvEventFunc(pvEventType evt, void *arg, pvType type, unsigned count ...@@ -42,6 +42,7 @@ typedef void pvEventFunc(pvEventType evt, void *arg, pvType type, unsigned count
struct pvSystem { struct pvSystem {
struct ca_client_context *id; struct ca_client_context *id;
const char *msg;
}; };
struct pvVar { struct pvVar {
...@@ -78,6 +79,7 @@ epicsShareFunc unsigned pvVarGetCount(pvVar *var); ...@@ -78,6 +79,7 @@ epicsShareFunc unsigned pvVarGetCount(pvVar *var);
#define pvVarGetPrivate(var) (var).arg #define pvVarGetPrivate(var) (var).arg
#define pvVarGetMess(var) (var).msg #define pvVarGetMess(var) (var).msg
#define pvSysGetMess(sys) (sys).msg
epicsShareFunc pvStat pvTimeGetCurrentDouble(double *pTime); epicsShareFunc pvStat pvTimeGetCurrentDouble(double *pTime);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment