Esta es una función que se puede registrar como una devolución de llamada y se invoca cuando se produce el suceso registrado. La función se registra proporcionando un puntero de función que coincide con el siguiente typedef:
type CciRegCallbackStatus (definida en BipCci.h)
Para cada una de estas cinco funciones de utilidad de rastreo, el parámetro CciObject debe ser NULL.
Declare la siguiente estructura y función:
typedef struct { int id; }MyContext; static int registered=0; CciRegCallbackStatus switchThreadStateChange(CciDataContext *context, CciCallbackType type) { char traceText[256]; char* typeStr=0; MyContext* myContext = (MyContext*)context; if (type==CCI_THREAD_STATE_IDLE){ typeStr = "idle"; }else if(type==CCI_THREAD_STATE_INSTANCE_END){ typeStr = "instance end"; }else if (type==CCI_THREAD_STATE_TERMINATION){ typeStr = "termination"; }else{ typeStr = "unknown"; } memset(traceText,0,256); sprintf(traceText,"switchThreadStateChange: context id = %d, thread state %s",myContext->id,typeStr); cciServiceTrace(NULL, NULL, traceText); return CCI_THREAD_STATE_REGISTRATION_RETAIN; }
Coloque el código siguiente en la función _Switch_evaluate en los ejemplos para que pueda leer el rastreo de servicio y ver cuándo la hebra de proceso de mensaje cambia de estado:
/*registrar para cambio de estado de hebra */ CciMessageContext* messageContext = cniGetMessageContext(NULL,message); CciThreadContext* threadContext = cniGetThreadContext(NULL,messageContext); static MyContext myContext={1}; if(registered==0){ cciRegisterForThreadStateChange( NULL, threadContext, & myContext, switchThreadStateChange, CCI_THREAD_STATE_IDLE | CCI_THREAD_STATE_INSTANCE_END | CCI_THREAD_STATE_TERMINATION); registered=1; }
Este ejemplo sólo registra en la primera hebra que recibe un mensaje. Si es necesario registrar cada hebra que recibe un mensaje, las extensiones definidas por el usuario deben recordar en que hebras se han registrado.
Al utilizar el parámetro userContext puede ver cómo los datos se pasan del código en el que está registrada la devolución de llamada a la función de devolución de llamada real.
Al registrar la devolución de llamada, se pasa un puntero a una instancia de la estructura MyContext. Este es el mismo puntero que se devuelve a la devolución de llamada. Para asegurar que el puntero todavía es válido cuando se devuelve a la devolución de llamada, una instancia de la estructura se declara como estática. Otra técnica para asegurar que el puntero es válido es asignar almacenamiento en el almacenamiento dinámico.
En la función de devolución de llamada, el parámetro userContext puede transformarse en un (MyContext*). Se puede hacer referencia a la estructura de MyContext original a través de esta dirección. Esto permite el paso de datos desde el código donde está registrada la devolución de llamada a la función de devolución de llamada.