cciRegisterForThreadStateChange

Esta función registra la función que se debe llamar cuando la hebra actual entra en un estado específico.

Sintaxis

void cciRegisterForThreadStateChange(
          int               *returnCode,
          CciThreadContext  *threadContext,
          CciDataContext    *userContext,
          CciRegCallback     callback,
          CciCallbackType    type);

Parámetros

returnCode
Código de retorno de la función (salida). Si la entrada es NULL, esto significa que el intermediario maneja los errores silenciosamente o hace caso omiso de ellos. Si la entrada no es NULL, la salida indica el estado de ejecución satisfactoria de la llamada. Si el parámetro threadContext no es válido, *returnCode se establece en CCI_INV_THREAD_CONTEXT y no se registra la devolución de llamada.
threadContext
Proporciona el contexto de hebra en el que registrar la función de devolución de llamada y los datos asociados. Se supone que este parámetro se obtiene utilizando la API de cniGetThreadContext() en la hebra actual. Si se proporciona NULL como threadContext, la infraestructura es la que determina el contexto de hebra. En ese caso, el rendimiento es menor que cuando se llama a cniGetThreadContext.
userContext
Permite al canal de llamada proporcionar un puntero de contexto que, cuando se llama, se pasa a la función de devolución de llamada. Este parámetro puede ser NULL.
callback
Puntero a la función de devolución de llamada que se va a invocar. Esta función debe ser del tipo CciRegCallback.
type
Especifica si la devolución de llamada debe invocarse cuando la hebra está finalizando o cuando la hebra está en uno de sus estados de desocupado. Los estados de desocupado puede ser uno de los valores siguientes:
  • CCI_THREAD_STATE_IDLE:

    El nodo de entrada para la hebra actual está sondeando activamente datos de la fuente 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.

  • CCI_THREAD_STATE_INSTANCE_END

    El nodo de entrada para la hebra actual ha dejado de sondear datos y la hebra se ha liberado. El mismo nodo de entrada o cualquier otro nodo de entrada del mismo flujo de mensajes, vuelven a despachar la hebra. Se entra en este estado cuando se han utilizado 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 se liberan las hebras restantes.

  • CCI_THREAD_STATE_TERMINATION

    La hebra actual está finalizando. Esto 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. 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 a nivel de 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 de type específico.

Valores de retorno

Ninguno. Si se produce un error, el parámetro returnCode indica la razón del mismo.

Ejemplo

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 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.

Referencia relacionada
cniGetThreadContext
cciRegCallback
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
as24630_