cciRegCallback

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:

Sintaxis

typedef int (*CciRegCallback)(CciDataContext *, cciCallbackType);

Parámetros

type CciDataContext*
Este es el puntero que proporciona el canal de llamada a la función de registro.
type CciCallbackType
Indica la razón de la devolución de llamada. Siempre es uno de los valores de CciCallbackType que se especifica en la llamada de registro correspondiente a esta devolución de llamada.

Valores de retorno

type CciRegCallbackStatus (definida en BipCci.h)

  • CCI_THREAD_STATE_REGISTRATION_RETAIN: Este código de retorno se utiliza para una devolución de llamada que debe permanecer registrada como función de devolución de llamada en una hebra específica.
  • CCI_THREAD_STATE_REGISTRATION_REMOVE: Este código de retorno se utiliza para indicar que debe anularse el registro de la devolución de llamada y que no debe volver a llamarse en esta hebra, a menos que se vuelva a registrar. Si se devuelve otro valor, se anota un aviso en las anotaciones y se supone el elemento CCI_THREAD_STATE_REGISTRATION_RETAIN.
Durante la ejecución de esta función, es posible que ya se haya suprimido el nodo o el analizador que ha registrado la función. Por tanto, no debe llamar ninguna función de utilidad de nodo o analizador que dependa de la existencia de un nodo o analizador. Las únicas funciones de utilidad que pueden llamarse desde esta devolución de llamada son:
  • cciLog
  • cciUserTrace
  • cciServiceTrace
  • cciUserDebugTrace
  • cciServiceDebugTrace
  • cciIsTraceActive

Para cada una de estas cinco funciones de utilidad de rastreo, el parámetro CciObject debe ser NULL.

Ejemplo

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.

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