cciRegisterForThreadStateChange

Questa funzione registra una funzione da richiamare quando il thread attuale assume un determinato stato.

Sintassi

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

Parametri

returnCode
Il codice di ritorno dalla funzione (output). Se l'input è NULL, significa che gli errori vengono gestiti o sono ignorati dal broker. Se l'input è diverso da NULL, l'output indica l'esito positivo della chiamata. Se il parametro threadContext non è valido, *returnCode è impostato su CCI_INV_THREAD_CONTEXT e la callback non è registrata.
threadContext
Fornisce il contesto del thread in cui registrare la funzione callback ed i dati associati. Si assume che questo parametro sia ottenuto utilizzando l'API cniGetThreadContext() sul thread attuale. Se NULL è fornito come threadContext, il contesto del thread è determinato dal framework. Ciò risulta meno efficace che richiamare cniGetThreadContext.
userContext
Consente a chi esegue la chiamata di fornire un puntatore del contesto che viene passato alla funzione callback quando questa viene richiamata. Questo parametro può essere NULL.
callback
E' un puntatore alla funzione callback che deve essere richiamata. Tale funzione deve essere di tipo CciRegCallback.
type
Specifica se deve essere richiamata la funzione callback quando il thread è in fase di chiusura o quando il thread si trova in uno degli stati di inattività. Tali stati possono assumere uno dei seguenti valori:
  • CCI_THREAD_STATE_IDLE:

    Il nodo di input per il thread attuale esegue attivamente il polling dei dati dall'origine di input, ma non è disponibile alcun dato. Finché il nodo di input non dispone dei dati, i messaggi non vengono trasmessi nel relativo flusso.

  • CCI_THREAD_STATE_INSTANCE_END

    Il nodo di input per il thread attuale ha interrotto il polling dei dati e il thread è stato rilasciato. Il thread viene inviato di nuovo mediante lo stesso nodo di input o mediante un altro nodo di input nello stesso flusso di messaggi. Questo stato viene assunto quando sono state utilizzate istanze aggiuntive, che sono state inviate per un flusso di messaggi, per far fronte ad un afflusso di dati di input che ora è cessato. Il nodo di input continua a richiedere dati di input su un unico thread e gli altri thread vengono rilasciati.

  • CCI_THREAD_STATE_TERMINATION

    Il thread attuale è in fase di chiusura. Ciò può accadere quando il broker è chiuso, l'elaborazione del gruppo di esecuzione si sta concludendo in modo controllato o quando il flusso di messaggi viene eliminato. Ciò può verificarsi dopo che tutti i nodi ed i programmi di analisi nel flusso vengono eliminati.

In alternativa, il parametro type può essere il risultato di un'operazione OR a livello di bit su due o più di questi valori. In tale caso, la funzione specificata viene richiamata quando il thread assume lo stato relativo a ciascun singolo valore type.

Valori di restituzione

Nessuno. Se si verifica un errore, il parametro returnCode indica il motivo dell'errore.

Esempio

Dichiarazione di struct e funzione:

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;

}

Inserire il seguente codice nella funzione _Switch_evaluate negli esempi per abilitare la lettura della traccia del servizio e per vedere quando il thread di elaborazione del messaggio cambia stato:

/*registro del cambiamento di stato del thread*/
  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;
  
  }

In questo esempio viene registrato solo il primo thread che riceve un messaggio. Se è necessario registrare tutti i thread che ricevono un messaggio, è necessario che le estensioni definite dall'utente ricordino i thread sui quali sono registrate.

Mediante l'uso del parametro userContext è possibile vedere come i dati vengono passati dal codice dove è registrata la funzione callback alla funzione callback attuale.

Quando si registra la callback, viene passato un puntatore ad un'istanza dello struct MyContext. Questo è lo stesso puntatore così come ripassato alla funzione callback. Per accertarsi che il puntatore sia ancora valido quando viene ripassato alla callback, un'istanza dello struct viene dichiarata come statica. Un altro modo per accertarsi che il puntatore sia valido è quello di assegnare memoria sull'heap.

Nella funzione callback, il parametro userContext può essere impostato su un (MyContext*). E' possibile fare riferimento allo struct MyContext di origine mediante questo indirizzo. Ciò consente il passaggio dei dati dal codice in cui la callback è registrata nella funzione callback.

Riferimenti correlati
cniGetThreadContext
cciRegCallback
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
as24630_