fixed put notify shutdown during channel delete

This commit is contained in:
Jeff Hill
2002-03-14 01:13:58 +00:00
parent a29cf1b411
commit 094a79fcd0
5 changed files with 39 additions and 5 deletions

View File

@@ -99,6 +99,11 @@
/************************************************************************/
/*
* $Log$
* Revision 1.107.2.8 2002/03/08 00:25:08 jhill
* fixed bug where the db_put_field in the local event callback stub was supplied
* with a destination that was the database field. In situations where the dbAccess
* db_access field types were different the database was damaged.
*
* Revision 1.107.2.7 2001/09/18 12:17:48 mrk
* increased stack size for cac_recv_task from 4096 to 8192
*
@@ -1693,6 +1698,7 @@ const void *usrarg
ppn->dbPutNotify.pbuffer = (ppn+1);
}
ppn->busy = TRUE;
ppn->onExtraLaborQueue = FALSE;
ppn->caUserCallback = pfunc;
ppn->caUserArg = (void *) usrarg;
ppn->dbPutNotify.nRequest = count;
@@ -1792,6 +1798,7 @@ LOCAL void ca_put_notify_action(PUTNOTIFY *ppn)
* one client on another client).
*/
semTake(pcas->ca_putNotifyLock, WAIT_FOREVER);
pcapn->onExtraLaborQueue = TRUE;
ellAdd(&pcas->ca_putNotifyQue, &pcapn->node);
semGive(pcas->ca_putNotifyLock);
@@ -2690,6 +2697,16 @@ int epicsShareAPI ca_clear_channel (chid pChan)
if(ppn->busy){
dbNotifyCancel(&ppn->dbPutNotify);
}
semTake (ca_static->ca_putNotifyLock, WAIT_FOREVER);
if ( ppn->onExtraLaborQueue ) {
ellDelete( &ca_static->ca_putNotifyQue, &ppn->node );
}
semGive (ca_static->ca_putNotifyLock);
status = db_flush_extra_labor_event (ca_static->ca_evuser );
assert ( status == OK );
free(ppn);
}

View File

@@ -33,6 +33,9 @@
/*
* $Log$
* Revision 1.74.4.3 2000/11/30 22:07:51 jhill
* changes from Ken Evans
*
* Revision 1.74.4.2 1999/09/02 21:12:18 jhill
* use (void) and not () in func proto when its not a C++ file
*
@@ -375,7 +378,8 @@ typedef struct caclient_put_notify{
void (*caUserCallback)(struct event_handler_args);
void *caUserArg;
struct CA_STATIC *pcas;
int busy;
char busy;
char onExtraLaborQueue;
}CACLIENTPUTNOTIFY;
#endif /*vxWorks*/

View File

@@ -29,6 +29,9 @@
* Modification Log:
* -----------------
* $Log$
* Revision 1.39.4.5 2002/03/13 22:07:58 jhill
* improved put notify cleanup when client terminates
*
* Revision 1.39.4.4 2002/03/08 00:16:27 jhill
* check for floating point in correct place
*
@@ -912,6 +915,7 @@ LOCAL void ca_extra_event_labor (void *pArg)
*/
semTake (ca_static->ca_putNotifyLock, WAIT_FOREVER);
ppnb = (CACLIENTPUTNOTIFY *) ellGet (&ca_static->ca_putNotifyQue);
ppnb->onExtraLaborQueue = FALSE;
semGive (ca_static->ca_putNotifyLock);
/*

View File

@@ -1318,6 +1318,7 @@ LOCAL void write_notify_call_back(PUTNOTIFY *ppn)
* one client on another client).
*/
FASTLOCK(&pclient->putNotifyLock);
pciu->pPutNotify->onExtraLaborQueue = TRUE;
ellAdd(&pclient->putNotifyQue, &pciu->pPutNotify->node);
FASTUNLOCK(&pclient->putNotifyLock);
@@ -1354,6 +1355,7 @@ void write_notify_reply(void *pArg)
*/
FASTLOCK(&pClient->putNotifyLock);
ppnb = (RSRVPUTNOTIFY *)ellGet(&pClient->putNotifyQue);
ppnb->onExtraLaborQueue = FALSE;
FASTUNLOCK(&pClient->putNotifyLock);
/*
* break to loop exit
@@ -1533,6 +1535,7 @@ struct client *client
}
pciu->pPutNotify->busy = TRUE;
pciu->pPutNotify->onExtraLaborQueue = FALSE;
pciu->pPutNotify->msg = *mp;
pciu->pPutNotify->dbPutNotify.nRequest = mp->m_count;
#ifdef CONVERSION_REQUIRED
@@ -1715,9 +1718,14 @@ struct client *client
* if a put notify is outstanding then cancel it
*/
if(pciu->pPutNotify){
if(pciu->pPutNotify->busy){
dbNotifyCancel(&pciu->pPutNotify->dbPutNotify);
}
if( pciu->pPutNotify->busy ){
dbNotifyCancel(&pciu->pPutNotify->dbPutNotify);
}
FASTLOCK(&client->putNotifyLock);
if ( pciu->pPutNotify->onExtraLaborQueue ) {
ellDelete ( &client->putNotifyQue, &pciu->pPutNotify->node );
}
FASTUNLOCK(&client->putNotifyLock);
}
while (TRUE){

View File

@@ -150,7 +150,8 @@ typedef struct rsrv_put_notify{
PUTNOTIFY dbPutNotify;
caHdr msg;
unsigned long valueSize; /* size of block pointed to by dbPutNotify */
int busy; /* put notify in progress */
char busy; /* put notify in progress */
char onExtraLaborQueue;
}RSRVPUTNOTIFY;