Hi everybody,
Within my Asyn IOC I need sometime to modify some PV from other IOC.
I did try to do this using the .db but the task was too complex and I am now trying to setup my own CA client inside Asyn.
As I am using Asyn I have also linked all the callback from CA to the one from Asyn...
This seems to work more or less but I have some problems with the ca_put.
quick resume of what I am doing
===========================
--------------- # Part 1 (OK)
At the setup of the IOC I call:
ca_context_create (ca_enable_preemptive_callback);
...
ca_search_and_connect(pvext_write1->name,&(pvext_write1->chan_id),callback_coHaAr,NULL);
ca_search_and_connect(pvext_write2->name,&(pvext_write2->chan_id),callback_coHaAr,NULL);
...
ca_search_and_connect(pvext_writeN->name,&(pvext_writeN->chan_id),callback_coHaAr,NULL);
and at the end of the setup I call
ca_flush_io()
This work fine and after some seconds I enter callback_coHaAr() for each of the CA created.
--------------- # Part 2
Then at some point in my code, changes of value my internal PV, I modify external PV.
status=ca_put_callback (DBR_DOUBLE, pvext_write1->chan_id, &(pvext_write1->val.float64),callback_put,pvext_write1);
status=ca_put_callback (DBR_DOUBLE, pvext_write2->chan_id, &(pvext_write2->val.float64),callback_put,pvext_write2);
....
status=ca_put_callback (DBR_DOUBLE, pvext_writeN->chan_id, &(pvext_writeN->val.float64),callback_put,pvext_writeN);
And after all my writes has been put, I call
ca_flush_io()
And this is when sometime my hook callback_put() is correctly called back (Almost 90% the first time)
callback_put() > chid:0x949a3a0 usr:0x94c86a8 (status:x1)
But then if I make succesive call, the hook callback_put() might be called back some more time.. and then never
However If I shutdown the remote IOC, all my callback appears
If only one was missing, I get on my epicConsole:
callback_put() > chid:0x95074c8 usr:0x9535860 (status:xc0)
callback_coHaAr() > chid:0x95074c8 op:7 (down)
If 4 were missing:
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_put() > chid:0x98623f8 usr:0x9890790 (status:xc0)
callback_coHaAr() > chid:0x98623f8 op:7 (down)
Conclusion
===========================
I think I am missing something while mixing the epicsThread of asyn and ca, but I really don't know what to try more and I don't find any good examples of ChannelAccess client with thread.
- Where could I find a good documentation of ca client?
- Do you think I am missing something?
- Should I use ca_enable_preemptive_callback...? I am not sure that it is what I need within asyn...
- Shouid I use something more than flush_io()...?
- Should I create a thread for this operation and call ca_pend_event() ... I did try to call ca_pend_event(2) for testing but it doesn't seem to correct my problems.
Best,