fixed wrong client id in asynchronous access control response

This commit is contained in:
Jeff Hill
2002-08-07 18:07:50 +00:00
parent de60b1f5d7
commit 5ba7ce818c
5 changed files with 45 additions and 32 deletions
+18 -16
View File
@@ -24,16 +24,18 @@
//
// casChannelI::casChannelI()
//
casChannelI::casChannelI (const casCtx &ctx) :
client ( * (casStrmClient *) ctx.getClient ()),
pv (*ctx.getPV()),
cid (ctx.getMsg()->m_cid),
accessRightsEvPending (FALSE)
casChannelI::casChannelI ( const casCtx & ctx ) :
pClient ( 0 ), pPV ( 0 ), cid ( 0xffffffff ),
accessRightsEvPending ( false )
{
assert (&this->client);
assert (&this->pv);
}
this->client.installChannel (*this);
void casChannelI::bindToClientI ( casCoreClient & client, casPVI & pv, caResId cidIn )
{
this->pClient = & client;
this->pPV = & pv;
this->cid = cidIn;
client.installChannel ( *this );
}
//
@@ -71,12 +73,12 @@ casChannelI::~casChannelI()
iterMon = tmpMon;
}
this->client.removeChannel(*this);
this->pClient->removeChannel(*this);
//
// force PV delete if this is the last channel attached
//
this->pv.deleteSignal();
this->pPV->deleteSignal();
this->unlock();
}
@@ -115,7 +117,7 @@ void casChannelI::show ( unsigned level ) const
tsDLIterConst <casMonitor> iter = this->monitorList.firstIter ();
if ( iter.valid () ) {
printf("List of CA events (monitors) for \"%s\".\n",
this->pv.getName());
this->pPV->getName());
}
while ( iter.valid () ) {
iter->show ( level );
@@ -136,9 +138,9 @@ caStatus casChannelI::cbFunc(casEventSys &)
{
caStatus stat;
stat = this->client.accessRightsResponse(this);
stat = this->pClient->accessRightsResponse(this);
if (stat==S_cas_success) {
this->accessRightsEvPending = FALSE;
this->accessRightsEvPending = false;
}
return stat;
}
@@ -168,10 +170,10 @@ void casChannelI::destroyClientNotify ()
pCDEV = new casChanDelEv (this->getCID());
if (pCDEV) {
this->client.casEventSys::addToEventQueue (*pCDEV);
this->pClient->casEventSys::addToEventQueue (*pCDEV);
}
else {
status = this->client.disconnectChan (this->getCID());
status = this->pClient->disconnectChan (this->getCID());
if (status) {
//
// At this point there is no space in pool
@@ -185,7 +187,7 @@ void casChannelI::destroyClientNotify ()
// will result in bugs because no doubt this
// could be called by a client member function.
//
this->client.setDestroyPending();
this->pClient->setDestroyPending();
}
}
this->destroy();
+7 -7
View File
@@ -27,7 +27,7 @@
//
inline void casChannelI::lock() const
{
this->client.lock();
this->pClient->lock();
}
//
@@ -35,7 +35,7 @@ inline void casChannelI::lock() const
//
inline void casChannelI::unlock() const
{
this->client.unlock();
this->pClient->unlock();
}
//
@@ -112,7 +112,7 @@ inline void casChannelI::removeAsyncIO(casAsyncIOI &io)
{
this->lock();
this->ioInProgList.remove(io);
this->pv.unregisterIO();
this->pPV->unregisterIO();
this->unlock();
}
@@ -130,9 +130,9 @@ inline const caResId casChannelI::getSID()
//
inline void casChannelI::postAccessRightsEvent()
{
if (!this->accessRightsEvPending) {
this->accessRightsEvPending = TRUE;
this->client.addToEventQueue(*this);
if ( ! this->accessRightsEvPending ) {
this->accessRightsEvPending = true;
this->pClient->addToEventQueue ( *this );
}
}
@@ -141,7 +141,7 @@ inline void casChannelI::postAccessRightsEvent()
//
inline const gddEnumStringTable & casChannelI::enumStringTable () const
{
return this->pv.enumStringTable ();
return this->pPV->enumStringTable ();
}
#endif // casChannelIIL_h
+11 -7
View File
@@ -283,9 +283,11 @@ public:
casChannelI (const casCtx &ctx);
epicsShareFunc virtual ~casChannelI();
void bindToClientI ( casCoreClient & client, casPVI & pv, caResId cid );
casCoreClient &getClient () const
{
return this->client;
return *this->pClient;
}
const caResId getCID ()
{
@@ -316,7 +318,7 @@ public:
casPVI &getPVI () const
{
return this->pv;
return *this->pPV;
}
void installAsyncIO (casAsyncIOI &);
@@ -356,10 +358,10 @@ public:
protected:
tsDLList<casMonitor> monitorList;
tsDLList<casAsyncIOI> ioInProgList;
casCoreClient &client;
casPVI &pv;
caResId const cid; // client id
unsigned accessRightsEvPending:1;
casCoreClient * pClient;
casPVI * pPV;
caResId cid; // client id
bool accessRightsEvPending:1;
epicsShareFunc virtual void destroy ();
casChannelI ( const casChannelI & );
@@ -372,8 +374,10 @@ protected:
class casPVListChan : public casChannelI, public tsDLNode<casPVListChan>
{
public:
casPVListChan (const casCtx &ctx);
casPVListChan ( const casCtx &ctx );
void bindToClient ( casCoreClient & client, casPVI & pv, caResId cid );
epicsShareFunc virtual ~casPVListChan();
private:
casPVListChan ( const casPVListChan & );
casPVListChan & operator = ( const casPVListChan & );
};
+7 -2
View File
@@ -25,7 +25,12 @@
casPVListChan::casPVListChan (const casCtx &ctx) :
casChannelI(ctx)
{
this->pv.installChannel(*this);
}
void casPVListChan::bindToClient ( casCoreClient & client, casPVI & pv, caResId cid )
{
this->bindToClientI ( client, pv, cid );
this->pPV->installChannel ( *this );
}
//
@@ -33,7 +38,7 @@ casPVListChan::casPVListChan (const casCtx &ctx) :
//
casPVListChan::~casPVListChan()
{
this->pv.removeChannel(*this);
this->pPV->removeChannel(*this);
//
// delete signal to PV occurs in
// casChannelI::~casChannelI
+2
View File
@@ -1077,6 +1077,8 @@ caStatus casStrmClient::createChanResponse(const caHdrLargeArray &hdr, const pvA
return this->channelCreateFailed (&hdr, S_cas_noMemory);
}
pChan->bindToClient ( *this, *pPV, hdr.m_cid );
pChanI = (casChannelI *) pChan;
//