cciRegCallback

Hier handelt es sich um eine Funktion, die als Callback registriert werden kann und dann aufgerufen wird, wenn das registrierte Ereignis auftritt. Die Funktion wird registriert, indem ein Funktionszeiger angegeben wird, der zur folgenden Typendefinition passt:

Syntax

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

Parameter

type CciDataContext*
Hier handelt es sich um den Zeiger, der vom Aufrufenden der Registrierungsfunktion zur Verfügung gestellt wird.
type CciCallbackType
Dies stellt die Angabe des Grundes für den Callback dar. Es handelt sich stets um einen der der CciCallbackType-Werte, der beim Registrierungsaufruf zu diesem Callback angegeben wird.

Rückgabewerte

type CciRegCallbackStatus (defined in BipCci.h)

  • CCI_THREAD_STATE_REGISTRATION_RETAIN: Dieser Rückkehrcode wird für einen Callback verwendet, der weiterhin als Callback-Funktion auf einem bestimmten Thread registriert sein soll.
  • CCI_THREAD_STATE_REGISTRATION_REMOVE: Dieser Rückkehrcode wird verwendet, um zu signalisieren, dass der Callback zu deregistrieren ist und auf diesem Thread nicht mehr aufgerufen werden soll, es sei denn, er wird erneut registriert. Wenn irgendein anderer Wert zurückgegeben wird, wird eine Warnung in ein Protokoll geschrieben und CCI_THREAD_STATE_REGISTRATION_RETAIN angenommen.
Während der Ausführung dieser Funktion kann es vorkommen, dass der Knoten oder Parser, der die Funktion registriert hat, bereits gelöscht worden ist. Daher sollten Sie keinen Knoten und keine Parser-Dienstprogrammfunktion aufrufen, die vom Vorhandensein eines Knotens oder Parsers ausgehen. Die einzigen Dienstprogrammfunktionen, die von diesem Callback aus aufgerufen werden dürfen, sind:
  • cciLog
  • cciUserTrace
  • cciServiceTrace
  • cciUserDebugTrace
  • cciServiceDebugTrace
  • cciIsTraceActive

Bei jeder dieser fünf Tracedienstprogrammfunktionen muss der Parameter CciObject NULL sein.

Beispiel

Deklarieren Sie folgendermaßen Struct und Funktion:

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;

}

Fügen Sie den folgenden Code in die Funktion _Switch_evaluate aus den mitgelieferten Muster-Codes ein, um den Service-Trace lesen und sehen zu können, wann der Nachrichtenverarbeitungs-Thread seinen Status wechselt:

/*für Thread-Statuswechsel registrieren*/
  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 diesem Beispiel wird nur der erste Thread registriert, der eine Nachricht empfängt. Wenn es nötig ist, jeden Thread zu registrieren, der eine Nachricht empfängt, dann müssen die benutzerdefinierten Erweiterungen sich merken, auf welchen Threads sie sich registriert haben.

Mit Hilfe des Parameters userContext können Sie nachvollziehen, wie Daten von dem Code aus, in dem der Callback registriert wird, an die eigentliche Callback-Funktion übergeben werden.

Beim Registrieren des Callbacks wird ein Zeiger auf eine Instanz des Structs MyContext übergeben. Dies ist derselbe Zeiger, der an den Callback zurück übergeben wird. Um sicher zu stellen, dass der Zeiger noch gültig ist, wenn er an den Callback zurück übergeben wird, wird ein Instanz des Structs als statisch deklariert. Ein anderes Vorgehen, um sicher zu stellen, dass der Zeiger gültig ist, ist, Speicherplatz auf dem Heap zuzuweisen.

In der Callback-Funktion kann der Parameter userContext in den Typ (MyContext*) konvertiert werden. Das ursprüngliche Struct MyContext kann durch diese Adresse referenziert werden. So ist es möglich, Daten von dem Code aus, wo der der Callback registriert wird, an die Callback-Funktion zu übergeben.

Zugehörige Verweise
cciRegisterForThreadStateChange
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2006 Letzte Aktualisierung: 23. Aug. 2006
as24650_