cciRegCallback

これはコールバックとして登録できる関数であり、登録されたイベントが発生すると呼び出されます。 この関数は以下の typedef と一致する関数ポインターを指定することにより登録されます。

構文

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

パラメーター

type CciDataContext*
これは、呼び出し元が登録関数に提供するポインターです。
type CciCallbackType
これはコールバックの理由を示します。これは必ず、このコールバックに対応する登録呼び出し上で指定された、いずれかの CciCallbackType 値となります。

戻り値

type CciRegCallbackStatus (BipCci.h で定義される)

  • CCI_THREAD_STATE_REGISTRATION_RETAIN: この戻りコードは、特定のスレッド上でコールバック関数として登録されたままとなるコールバックのために使用されます。
  • CCI_THREAD_STATE_REGISTRATION_REMOVE: この戻りコードは、このコールバックが登録解除されること、および再登録されない限り、これがこのスレッドで再度呼び出されることはないということを示すために使用されます。 これ以外の値が戻された場合は警告がログに書き込まれ、CCI_THREAD_STATE_REGISTRATION_RETAIN であるものとみなされます。
この関数の実行時に、関数を登録したノードまたはパーサーがすでに削除されていることがあります。 そのため、ノードまたはパーサーの存在に依存しているノードまたはパーサー・ユーティリティー関数は呼び出さないようにしてください。 このコールバックから呼び出される可能性があるユーティリティー関数は以下のものだけです。
  • cciLog
  • cciUserTrace
  • cciServiceTrace
  • cciUserDebugTrace
  • cciServiceDebugTrace
  • cciIsTraceActive

これら 5 つのトレース・ユーティリティー関数のそれぞれで、CciObject パラメーターは NULL でなければなりません。

以下の構造と関数を宣言します。

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;

}

以下のコードをサンプルの _Switch_evaluate 関数に入れると、サービス・トレースを読んで、メッセージ処理スレッドの状態がいつ変わったかを調べることができるようになります。

/*register for thread state change*/
  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;
  
  }

この例は、メッセージを受け取る最初のスレッドでのみ登録を行います。 メッセージを受け取るすべてのスレッドで登録を行う必要がある場合は、ユーザー定義拡張機能に、どのスレッドで登録を行ったかを記憶させておく必要があります。

userContext パラメーターを使用すると、コールバックが登録されているコードから、実際のコールバック関数へどのようにデータが渡されるかを調べることができます。

コールバックを登録する際、MyContext 構造のインスタンスへのポインターが渡されます。これは、コールバックに戻されるポインターと同じです。 コールバックに戻されるときまで確実にポインターを有効にしておくために、構造のインスタンスが静的インスタンスとして宣言されます。 確実にポインターを有効にしておくための別の手法として、ヒープにストレージを割り振る方法があります。

コールバック関数で、userContext パラメーターを (MyContext*) にキャストできます。元の MyContext 構造は、このアドレスを介して参照可能です。 これにより、コールバックが登録されているコードからコールバック関数にデータを渡すことが可能になります。

特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
as24650_