Add RemoveCallback3 to match callback function and supply user function to determine if this callback should be deleted. Allows checking inside the userdata structure instead of just the address - needed for motor uninterest.
r1986 | dcl | 2007-05-25 16:15:15 +1000 (Fri, 25 May 2007) | 2 lines
This commit is contained in:
31
callback.c
31
callback.c
@ -230,7 +230,36 @@
|
||||
iCurrent = LLDnodePtr2Next(self->iList);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int RemoveCallback3(pICallBack self, SICSCallBack pFunc, int (*func)(const void* context, const void* pUserData), void *context)
|
||||
{
|
||||
CallBackItem sItem;
|
||||
int iCurrent;
|
||||
|
||||
if(!CheckPointer(self))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
iCurrent = LLDnodePtr2First(self->iList);
|
||||
while(iCurrent != 0)
|
||||
{
|
||||
LLDnodeDataTo(self->iList,&sItem);
|
||||
if(sItem.pFunc == pFunc && func(context, sItem.pUserData) == 0)
|
||||
{
|
||||
if(sItem.pKill != NULL)
|
||||
{
|
||||
sItem.pKill(sItem.pUserData);
|
||||
}
|
||||
LLDnodeDelete(self->iList);
|
||||
iCurrent = LLDnodePtr2First(self->iList);
|
||||
continue;
|
||||
}
|
||||
iCurrent = LLDnodePtr2Next(self->iList);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------
|
||||
a write function for the connection which writes to stdout
|
||||
-------------------------------------------------------------------*/
|
||||
|
@ -103,6 +103,7 @@
|
||||
void *pUserData, KillFuncIT pKill);
|
||||
int RemoveCallback(pICallBack pInterface, long iID);
|
||||
int RemoveCallback2(pICallBack pInterface, void *pUserData);
|
||||
int RemoveCallback3(pICallBack self, SICSCallBack pFunc, int (*func)(const void* context, const void* pUserData), void *context);
|
||||
|
||||
int CallbackScript(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
|
Reference in New Issue
Block a user