reading and writing through the channel allows for put logging to occur

and other forms of application  flexibility
This commit is contained in:
Jeff Hill
2003-05-16 00:00:07 +00:00
parent 738337049b
commit fa320889e3
5 changed files with 81 additions and 10 deletions

View File

@@ -71,6 +71,25 @@ bool casChannel::confirmationRequested () const
return false;
}
caStatus casChannel::beginTransaction ()
{
return S_casApp_success;
}
void casChannel::endTransaction ()
{
}
caStatus casChannel::read ( const casCtx & ctx, gdd & prototype )
{
return ctx.getPV()->read ( ctx, prototype );
}
caStatus casChannel::write ( const casCtx & ctx, const gdd & value )
{
return ctx.getPV()->write ( ctx, value );
}
void casChannel::show ( unsigned level ) const
{
if ( level > 2u ) {

View File

@@ -79,3 +79,24 @@ caStatus casChannelI::cbFunc (
return stat;
}
caStatus casChannelI::read ( const casCtx & ctx, gdd & prototype )
{
caStatus status = this->chan.beginTransaction ();
if ( status != S_casApp_success ) {
return status;
}
status = this->chan.read ( ctx, prototype );
this->chan.endTransaction ();
return status;
}
caStatus casChannelI::write ( const casCtx & ctx, const gdd & value )
{
caStatus status = this->chan.beginTransaction ();
if ( status != S_casApp_success ) {
return status;
}
status = this->chan.write ( ctx, value );
this->chan.endTransaction ();
return status;
}

View File

@@ -52,6 +52,8 @@ public:
bool readAccess () const;
bool writeAccess () const;
bool confirmationRequested () const;
caStatus read ( const casCtx & ctx, gdd & prototype );
caStatus write ( const casCtx & ctx, const gdd & value );
void show ( unsigned level ) const;
private:
tsDLList < casAsyncIOI > ioList;

View File

@@ -815,7 +815,8 @@ caStatus casStrmClient::monitorResponse (
if ( completionStatus == S_cas_noRead ) {
return monitorFailureResponse ( guard, msg, ECA_NORDACCESS );
}
else if ( completionStatus == S_cas_noMemory ) {
else if ( completionStatus == S_cas_noMemory ||
completionStatus == S_casApp_noMemory ) {
return monitorFailureResponse ( guard, msg, ECA_ALLOCMEM );
}
else if ( completionStatus == S_cas_badType ) {
@@ -1337,7 +1338,7 @@ caStatus casStrmClient::createChanResponse (
if ( this->userStartedAsyncIO ) {
if ( status != S_casApp_asyncCompletion ) {
fprintf ( stderr,
"Application returned %d from casPV::read()"
"Application returned %d from casChannel::read()"
" - expected S_casApp_asyncCompletion\n", status);
}
status = S_cas_success;
@@ -1353,7 +1354,7 @@ caStatus casStrmClient::createChanResponse (
}
else if ( status == S_casApp_postponeAsyncIO ) {
errlogPrintf ( "The server library does not currently support postponment of " );
errlogPrintf ( "string table cache update of casPV::read()." );
errlogPrintf ( "string table cache update of casChannel::read()." );
errlogPrintf ( "To postpone this request please postpone the PC attach IO request." );
errlogPrintf ( "String table cache update did not occur." );
status = enumPostponedCreateChanResponse (
@@ -1945,7 +1946,7 @@ caStatus casStrmClient::write()
if ( this->userStartedAsyncIO ) {
if (status!=S_casApp_asyncCompletion) {
fprintf(stderr,
"Application returned %d from casPV::write() - expected S_casApp_asyncCompletion\n",
"Application returned %d from casChannel::write() - expected S_casApp_asyncCompletion\n",
status);
status = S_casApp_asyncCompletion;
}
@@ -1953,7 +1954,7 @@ caStatus casStrmClient::write()
else if ( status == S_casApp_asyncCompletion ) {
status = S_cas_badParameter;
errMessage ( status,
"- expected asynch IO creation from casPV::write()" );
"- expected asynch IO creation from casChannel::write()" );
}
return status;
@@ -2010,7 +2011,7 @@ caStatus casStrmClient::writeScalarData ()
//
// call the server tool's virtual function
//
status = this->ctx.getPV()->write ( this->ctx, *pDD );
status = this->ctx.getChannel()->write ( this->ctx, *pDD );
}
//
@@ -2099,7 +2100,7 @@ caStatus casStrmClient::writeArrayData()
//
// call the server tool's virtual function
//
status = this->ctx.getPV()->write ( this->ctx, *pDD );
status = this->ctx.getChannel()->write ( this->ctx, *pDD );
}
else {
status = S_cas_noConvert;
@@ -2134,7 +2135,7 @@ caStatus casStrmClient::read ( const gdd * & pDescRet )
//
// call the server tool's virtual function
//
status = this->ctx.getPV()->read ( this->ctx, * pDD );
status = this->ctx.getChannel()->read ( this->ctx, * pDD );
//
// prevent problems when they initiate
@@ -2144,7 +2145,7 @@ caStatus casStrmClient::read ( const gdd * & pDescRet )
if ( this->userStartedAsyncIO ) {
if ( status != S_casApp_asyncCompletion ) {
fprintf(stderr,
"Application returned %d from casPV::read() - expected S_casApp_asyncCompletion\n",
"Application returned %d from casChannel::read() - expected S_casApp_asyncCompletion\n",
status);
status = S_casApp_asyncCompletion;
}
@@ -2152,7 +2153,7 @@ caStatus casStrmClient::read ( const gdd * & pDescRet )
else if ( status == S_casApp_asyncCompletion ) {
status = S_cas_badParameter;
errMessage(status,
"- expected asynch IO creation from casPV::read()");
"- expected asynch IO creation from casChannel::read()");
}
if ( status == S_casApp_success ) {

View File

@@ -571,6 +571,34 @@ public:
// for confirmation prior writing to this PV
epicsShareFunc virtual bool confirmationRequested () const;
//
// If this function is not provided in the derived class then casPV::beginTransaction()
// is called - see casPV::beginTransaction() for additional comments.
//
epicsShareFunc virtual caStatus beginTransaction ();
//
// If this function is not provided in the derived class then casPV::endTransaction()
// is called - see casPV::endTransaction() for additional comments.
//
epicsShareFunc virtual void endTransaction ();
//
// read
//
// If this function is not provided in the derived class then casPV::read()
// is called - see casPV::read() for additional comments.
//
epicsShareFunc virtual caStatus read (const casCtx &ctx, gdd &prototype);
//
// write
//
// If this function is not provided in the derived class then casPV::write()
// is called - see casPV::write() for additional comments.
//
epicsShareFunc virtual caStatus write (const casCtx &ctx, const gdd &value);
//
// This is called for each channel in the server if
// caServer::show() is called and the level is high