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

对于这五个实用程序函数中的每个实用程序函数,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 的实例声明为静态。另一个确保指针有效的技术是在堆上分配存储。

在回调函数中,可以将 userContext 参数类型强制转换成 (MyContext*)。可以通过此地址引用原始的 MyContext struct。这允许数据从注册回调的代码传递到该回调函数。

声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as24650_