Esta función registra una función a la que se debe llamar cuando la hebra actual entra en un estado específico.
void cciRegisterForThreadStateChange(
int *returnCode,
CciThreadContext *threadContext,
CciDataContext *userContext,
CciRegCallback callback,
CciCallbackType type);
El nodo de entrada para la hebra actual está sondeando activamente datos del origen de entrada, pero no hay datos disponibles. Los mensajes no se propagan por el flujo de mensajes hasta que no hay datos disponibles para el nodo de entrada.
El nodo de entrada para la hebra actual ha dejado de sondear datos y la hebra se ha liberado. La hebra es despachada de nuevo por el mismo nodo de entrada o por otro nodo de entrada del mismo flujo de mensajes. Se entra en este estado cuando se han configurado instancias adicionales, que se han desplegado para un flujo de mensajes, para hacer frente a un flujo de datos de entrada que ahora ya ha cesado. El nodo de entrada sigue sondeando datos de entrada en una sola hebra, y las otras hebras se liberan.
La hebra actual está finalizando. Esta acción puede suceder cuando se cierra el intermediario, el proceso del grupo de ejecución finaliza de forma controlada, o cuando se suprime el flujo de mensajes. Esta condición puede ocurrir después de haber suprimido todos los nodos y analizadores del flujo.
De forma alternativa, el parámetro type puede ser el resultado de una operación OR bit a bit en dos o más de estos valores. En este caso, se llama a la función especificada cuando la hebra entra en el estado relevante para cada valor type específico.
Ninguno. Si se produce un error, el parámetro returnCode indica la razón del mismo.
Declaración de la estructura y la 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 qué 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 puntero 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. Esta técnica permite el paso de datos del código donde está registrada la devolución de llamada a la función de devolución de llamada.