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)이어야 합니다.

다음 struct 및 함수 선언

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 struct 인스턴스의 포인터가 전달됩니다. 이 포인터는 콜백으로 다시 전달되는 포인터와 같습니다. 포인터가 콜백으로 다시 전달될 때에도 유효한지 확인하기 위해 struct의 인스턴스가 정적으로 선언됩니다. 포인터가 유효한지 확인하는 또 다른 기술은 힙(heap)에서 저장영역을 할당하는 것입니다.

콜백 함수에서 userContext 매개변수는 (MyContext*)로 캐스트됩니다. 원래의 MyContext struct는 이 주소로 참조할 수 있습니다. 그렇게 하면 콜백이 콜백 함수에 등록된 코드에서 데이터를 전달할 수 있습니다.

주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24650_