Ok I will increment.

-AVM

On 12/19/2013 1:49 PM, Mathivanan Naickan Palanivelu wrote:
> Hi Mahesh,
>
> I think we should increment the library version because we are introducing 
> new APIs.
>
> Thanks,
> Mathi.
>
>> -----Original Message-----
>> From: Venkata Mahesh Alla
>> Sent: Thursday, December 19, 2013 12:23 PM
>> To: opensaf-devel@lists.sourceforge.net; Sirisha Alla;
>> hans.fe...@ericsson.com; Mathivanan Naickan Palanivelu
>> Cc: opensaf-devel@lists.sourceforge.net
>> Subject: [PATCH 1 of 1] cpsv: standardize arrival callback API(s) with SAF
>> syntax [#561]
>>
>>   opensaf.spec.in                          |    1 +
>>   osaf/libs/agents/saf/cpa/cpa_api.c       |  547
>> ++++++++++++++++++++++++++++++-
>>   osaf/libs/agents/saf/cpa/cpa_proc.c      |    6 +-
>>   osaf/libs/common/cpsv/cpsv_edu.c         |   22 +-
>>   osaf/libs/common/cpsv/include/cpa_cb.h   |    4 +-
>>   osaf/libs/common/cpsv/include/cpa_def.h  |    2 +-
>>   osaf/libs/common/cpsv/include/cpa_proc.h |    2 +-
>>   osaf/libs/common/cpsv/include/cpsv.h     |    7 +
>>   osaf/libs/common/cpsv/include/cpsv_evt.h |    8 +-
>>   osaf/libs/saf/include/Makefile.am        |    1 +
>>   osaf/libs/saf/include/saCkpt_B_02_03.h   |  152 ++++++++
>>   osaf/services/saf/cpsv/cpnd/cpnd_evt.c   |   39 ++-
>>   12 files changed, 775 insertions(+), 16 deletions(-)
>>
>>
>> diff --git a/opensaf.spec.in b/opensaf.spec.in
>> --- a/opensaf.spec.in
>> +++ b/opensaf.spec.in
>> @@ -1399,6 +1399,7 @@ fi
>>   %{_includedir}/saAis.h
>>   %{_includedir}/saAmf.h
>>   %{_includedir}/saCkpt.h
>> +%{_includedir}/saCkpt_B_02_03.h
>>   %{_includedir}/saClm.h
>>   %{_includedir}/saEvt.h
>>   %{_includedir}/saImm.h
>> diff --git a/osaf/libs/agents/saf/cpa/cpa_api.c
>> b/osaf/libs/agents/saf/cpa/cpa_api.c
>> --- a/osaf/libs/agents/saf/cpa/cpa_api.c
>> +++ b/osaf/libs/agents/saf/cpa/cpa_api.c
>> @@ -119,8 +119,9 @@ SaAisErrorT saCkptInitialize(SaCkptHandl
>>
>>      /* Store the callback functions, if set */
>>      if (ckptCallbacks) {
>> -            cl_node->ckpt_callbk = *ckptCallbacks;
>> -
>> +            cl_node->ckpt_callbk.saCkptCheckpointOpenCallback =
>> ckptCallbacks->saCkptCheckpointOpenCallback;
>> +            cl_node->ckpt_callbk.saCkptCheckpointSynchronizeCallback
>> = ckptCallbacks->saCkptCheckpointSynchronizeCallback;
>> +            cl_node->ckpt_callbk.saCkptCheckpointTrackCallback =
>> NULL;
>>      }
>>
>>           proc_rc = cpa_callback_ipc_init(cl_node); @@ -278,11 +279,269 @@
>> SaAisErrorT saCkptInitialize(SaCkptHandl  }
>>
>>
>> /**********************************************************
>> ******************
>> -  Name          :  saCkptSelectionObjectGet
>> +  Name          :  SaCkptInitialize_2
>>
>> -  Description   :  This function returns the operating system handle
>> -                   associated with the ckptHandle.
>> +  Description   :  This function initializes the Checkpoint Service for the
>> +                   invoking process and registers the various callback 
>> functions.
>> +                   The handle 'ckptHandle' is returned as the reference to 
>> this
>> +                   association between the process and the Checkpoint 
>> Service.
>> +
>>
>> +  Arguments     :  ckptHandle - A pointer to the handle designating this
>> +                                particular initialization of the Checkpoint
>> +                                service that it to be returned by the 
>> Checkpoint
>> +                                Service.
>> +                   callbacks  - Pointer to a SaCkptCallbacksT_2 structure,
>> +                                containing the callback functions of the 
>> process
>> +                                that the Checkpoint Service may invoke.
>> +                   version    - Is a pointer to the version of the 
>> Checkpoint
>> +                                Service that the invoking process is using.
>> +
>> +  Return Values :  Refer to SAI-AIS specification for various return values.
>> +
>> +  Notes         :
>> +*********************************************************
>> **************
>> +*******/ SaAisErrorT saCkptInitialize_2(SaCkptHandleT *ckptHandle,
>> +const SaCkptCallbacksT_2 *ckptCallbacks, SaVersionT *version) {
>> +    CPA_CB *cb = NULL;
>> +    SaAisErrorT rc = SA_AIS_OK;
>> +    CPSV_EVT init_evt;
>> +    CPSV_EVT *out_evt = NULL;
>> +    uint32_t proc_rc = NCSCC_RC_SUCCESS;
>> +    CPA_CLIENT_NODE *cl_node = NULL;
>> +    bool locked = true;
>> +    SaVersionT client_version;
>> +
>> +    TRACE_ENTER();
>> +    proc_rc = ncs_agents_startup();
>> +    if (NCSCC_RC_SUCCESS != proc_rc) {
>> +            TRACE_4("cpa CkptInit:agents_startup Api failed with return
>> value:%d", proc_rc);
>> +            return SA_AIS_ERR_LIBRARY;
>> +    }
>> +
>> +    proc_rc = ncs_cpa_startup();
>> +    if (NCSCC_RC_SUCCESS != proc_rc) {
>> +            TRACE_4("cpa CkptInit:agents_startup Api failed with return
>> value:%d" , proc_rc);
>> +            ncs_agents_shutdown();
>> +            return SA_AIS_ERR_LIBRARY;
>> +    }
>> +
>> +    if ((!ckptHandle) || (!version)) {
>> +            rc = SA_AIS_ERR_INVALID_PARAM;
>> +            TRACE_4("cpa CkptInit Api failed with return value :%d", rc);
>> +            goto end;
>> +    }
>> +
>> +    *ckptHandle = 0;
>> +
>> +    memcpy(&client_version, version, sizeof(SaVersionT));
>> +
>> +    if (m_CPA_VER_IS_BELOW_B_2_3(version)) {
>> +            rc = SA_AIS_ERR_VERSION;
>> +            TRACE_2("ERR_VERSION: Cpa version incompatible
>> saCkptInitialize_2 SHOULD BE A VERSION B.02.03 and above initialize but
>> claims to be"
>> +                            "%c %u %u", version->releaseCode, version-
>>> majorVersion, version->minorVersion);
>> +            version->releaseCode = CPA_RELEASE_CODE;
>> +            version->majorVersion = CPA_MAJOR_VERSION;
>> +            version->minorVersion = CPA_MINOR_VERSION;
>> +            goto end;
>> +    }
>> +
>> +    /* Draft Validations : Version */
>> +    rc = cpa_version_validate(version);
>> +    if (rc != SA_AIS_OK) {
>> +            TRACE_4("cpa  CkptInit Api failed with return value:%d", rc);
>> +            goto end;
>> +    }
>> +
>> +    /* retrieve CPA CB */
>> +    m_CPA_RETRIEVE_CB(cb);
>> +    if (cb == NULL) {
>> +            TRACE_4("cpa CkptInit:HDL_TAKE");
>> +            return SA_AIS_ERR_LIBRARY;
>> +    }
>> +
>> +    /* Take the CB Lock */
>> +    if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) !=
>> NCSCC_RC_SUCCESS) {
>> +            TRACE_4("cpa CkptInit:LOCK");
>> +            rc = SA_AIS_ERR_LIBRARY;
>> +            goto lock_fail;
>> +    }
>> +
>> +    /* Alloc the client info data structure & put it in the Pat tree */
>> +    cl_node = (CPA_CLIENT_NODE
>> *)m_MMGR_ALLOC_CPA_CLIENT_NODE;
>> +    if (cl_node == NULL) {
>> +            TRACE_4("cpa mem alloc CkptInit:CPA_CLIENT_NODE");
>> +            rc = SA_AIS_ERR_NO_MEMORY;
>> +            goto cnode_alloc_fail;
>> +    }
>> +    memset(cl_node, 0, sizeof(CPA_CLIENT_NODE));
>> +
>> +    /* Store the callback functions, if set */
>> +    if (ckptCallbacks) {
>> +            cl_node->ckpt_callbk = *ckptCallbacks;
>> +    }
>> +
>> +    proc_rc = cpa_callback_ipc_init(cl_node);
>> +    if (proc_rc != NCSCC_RC_SUCCESS) {
>> +            /* Error handling */
>> +            rc = SA_AIS_ERR_LIBRARY;
>> +            /* ALready looged by cpa_callback_ipc_init */
>> +            goto ipc_init_fail;
>> +    }
>> +
>> +    /* populate the EVT structure */
>> +    memset(&init_evt, 0, sizeof(CPSV_EVT));
>> +    init_evt.type = CPSV_EVT_TYPE_CPND;
>> +    init_evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_INIT;
>> +    init_evt.info.cpnd.info.initReq.version = client_version;
>> +
>> +    /* Release the CB lock Before MDS Send */
>> +    if (locked)
>> +            m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +    locked = false;
>> +
>> +    /* CPND GOES DOWN */
>> +    if (false == cb->is_cpnd_up) {
>> +            rc = SA_AIS_ERR_TRY_AGAIN;
>> +            TRACE_4("cpa: api failed in CkptInit:CPND_DOWN");
>> +            goto mds_fail;
>> +    }
>> +
>> +    /* send the request to the CPND */
>> +    proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl, &cb-
>>> cpnd_mds_dest,
>> +&init_evt, &out_evt, CPSV_WAIT_TIME);
>> +
>> +    /* Error Handling */
>> +    switch (proc_rc) {
>> +            case NCSCC_RC_SUCCESS:
>> +                    break;
>> +            case NCSCC_RC_REQ_TIMOUT:
>> +                    TRACE_4("cpa CkptInit:MDS Api failed with return
>> value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest);
>> +                    rc = SA_AIS_ERR_TIMEOUT;
>> +                    goto mds_fail;
>> +            default:
>> +                    TRACE_4("cpa CkptInit:MDS Api failed with return
>> value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest);
>> +                    rc = SA_AIS_ERR_TRY_AGAIN;
>> +                    goto mds_fail;
>> +    }
>> +
>> +    if (out_evt) {
>> +            rc = out_evt->info.cpa.info.initRsp.error;
>> +            if (rc != SA_AIS_OK) {
>> +                    TRACE_4("cpa CkptInit:CPND_ERR Api failed with
>> return value:%d",rc);
>> +                    goto rsp_not_ok;
>> +            }
>> +
>> +            if (m_CPA_VER_IS_ABOVE_B_1_1(version)) {
>> +                    if (rc == SA_AIS_ERR_UNAVAILABLE) {
>> +                            cb->is_cpnd_joined_clm = false;
>> +                            if (locked)
>> +                                    m_NCS_UNLOCK(&cb->cb_lock,
>> NCS_LOCK_WRITE);
>> +                            locked = false;
>> +                            goto clm_left;
>> +                    } else {
>> +                            cb->is_cpnd_joined_clm = true;
>> +                    }
>> +            }
>> +            /* Take the CB lock after MDS Send */
>> +            if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) !=
>> NCSCC_RC_SUCCESS) {
>> +                    TRACE_4("cpa CkptInit:LOCK");
>> +                    rc = SA_AIS_ERR_LIBRARY;
>> +                    goto lock_fail1;
>> +            } else
>> +                    locked = true;
>> +
>> +            cl_node->cl_hdl = out_evt->info.cpa.info.initRsp.ckptHandle;
>> +            cl_node->stale = false;
>> +            proc_rc = cpa_client_node_add(&cb->client_tree, cl_node);
>> +            if (proc_rc != NCSCC_RC_SUCCESS) {
>> +                    rc = SA_AIS_ERR_LIBRARY;
>> +                    TRACE_4("cpa api processing failed in
>> CkptInit:client_node_add Api failed with return value:%d,cl_hdl:%llx ", rc,
>> cl_node->cl_hdl);
>> +                    goto node_add_fail;
>> +            }
>> +    } else {
>> +            TRACE_4("cpa api processing failed in CkptInit Api failed with
>> return value:%d", rc);
>> +            rc = SA_AIS_ERR_NO_RESOURCES;
>> +    }
>> +
>> +    if (rc != SA_AIS_OK) {
>> +            TRACE_4("cpa CkptInit:CPND_ERR Api failed with return
>> value:%d",rc);
>> +            goto cpnd_rsp_fail;
>> +    }
>> +
>> +    /*Error handling */
>> +cpnd_rsp_fail:
>> +node_add_fail:
>> +lock_fail1:
>> +    if (rc != SA_AIS_OK) {
>> +            CPSV_EVT finalize_evt, *out_evt1;
>> +
>> +            out_evt1 = NULL;
>> +            /* populate the structure */
>> +            memset(&finalize_evt, 0, sizeof(CPSV_EVT));
>> +            finalize_evt.type = CPSV_EVT_TYPE_CPND;
>> +            finalize_evt.info.cpnd.type =
>> CPND_EVT_A2ND_CKPT_FINALIZE;
>> +            finalize_evt.info.cpnd.info.finReq.client_hdl = cl_node-
>>> cl_hdl;
>> +
>> +            if (locked)
>> +                    m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +            locked = false;
>> +
>> +            /* send the request to the CPND */
>> +            proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl,
>> &(cb->cpnd_mds_dest),
>> +                            &finalize_evt, &out_evt1,
>> CPSV_WAIT_TIME);
>> +            if (out_evt1)
>> +                    m_MMGR_FREE_CPSV_EVT(out_evt1,
>> NCS_SERVICE_ID_CPA);
>> +    }
>> +
>> +rsp_not_ok:
>> +mds_fail:
>> +
>> +    /* Free the IPC initialized for this client */
>> +    if (rc != SA_AIS_OK)
>> +            cpa_callback_ipc_destroy(cl_node);
>> +
>> +ipc_init_fail:
>> +    /* Free the Client NODE */
>> +    if (rc != SA_AIS_OK)
>> +            m_MMGR_FREE_CPA_CLIENT_NODE(cl_node);
>> +
>> +cnode_alloc_fail:
>> +    /* Release the CB lock */
>> +    if (locked)
>> +            m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +
>> +lock_fail:
>> +clm_left:
>> +    /* Release the CB handle */
>> +    m_CPA_GIVEUP_CB;
>> +
>> +    /* Free the Out Event */
>> +    if (out_evt)
>> +            m_MMGR_FREE_CPSV_EVT(out_evt,
>> NCS_SERVICE_ID_CPA);
>> +
>> +    if (rc == SA_AIS_OK) {
>> +            memcpy(&(cl_node->version), &client_version,
>> sizeof(SaVersionT));
>> +            /* Went well, return ckptHandle to the application */
>> +            *ckptHandle = cl_node->cl_hdl;
>> +            TRACE_1("cpa ckptInit Api success with return value:%d and
>> cl_hdl:%llx", SA_AIS_OK, cl_node->cl_hdl);
>> +    }
>> +end:
>> +    if (rc != SA_AIS_OK) {
>> +            ncs_cpa_shutdown();
>> +            ncs_agents_shutdown();
>> +    }
>> +
>> +    TRACE_LEAVE2("API Return code = %u", rc);
>> +    return rc;
>> +}
>> +
>> +
>> +/*********************************************************
>> *******************
>> +Name          :  saCkptSelectionObjectGet
>> +
>> +Description   :  This function returns the operating system handle
>> +associated with the ckptHandle.
>> +
>>     Arguments     :  ckptHandle - Checkpoint service handle.
>>                      selectionObject - Pointer to the operating system 
>> handle.
>>
>> @@ -4166,7 +4425,7 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp
>>      }
>>
>>      if (ckptArrivalCallback) {
>> -            cl_node->ckptArrivalCallback = ckptArrivalCallback;
>> +            cl_node->ckpt_callbk.saCkptCheckpointTrackCallback =
>> +ckptArrivalCallback;
>>              if (cl_node->callbk_mbx == 0)
>>                      proc_rc = cpa_callback_ipc_init(cl_node);
>>              else
>> @@ -4226,3 +4485,279 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp
>>      TRACE_LEAVE2("API return code = %u", rc);
>>      return rc;
>>   }
>> +
>> +/*********************************************************
>> *******************
>> +Name          :  saCkptTrack
>> +
>> +Description   :  This function enable  the Ckpt Track call back
>> +
>> +Arguments     :  ckptHandle - Checkpoint handle.
>> +
>> +Return Values :  Refer to SAI-AIS specification for various return values.
>> +
>> +Notes         :
>> +
>> +*********************************************************
>> **************
>> +*******/ SaAisErrorT saCkptTrack(SaCkptHandleT ckptHandle) {
>> +    SaAisErrorT rc = SA_AIS_OK;
>> +    CPSV_EVT evt;
>> +    uint32_t proc_rc = NCSCC_RC_SUCCESS;
>> +    CPA_CLIENT_NODE *cl_node = NULL;
>> +    CPA_CB *cb = NULL;
>> +    bool is_locked = false;
>> +
>> +    /* retrieve CPA CB */
>> +    m_CPA_RETRIEVE_CB(cb);
>> +    if (!cb) {
>> +            rc = SA_AIS_ERR_BAD_HANDLE;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx",rc, ckptHandle);
>> +            goto done;
>> +    }
>> +
>> +    /* get the CB Lock */
>> +    if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) !=
>> NCSCC_RC_SUCCESS) {
>> +            rc = SA_AIS_ERR_LIBRARY;
>> +            TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto lock_fail;
>> +    }
>> +
>> +    is_locked = true;
>> +
>> +    /* Get the Client info */
>> +    rc = cpa_client_node_get(&cb->client_tree, &ckptHandle,
>> &cl_node);
>> +
>> +    if (!cl_node) {
>> +            rc = SA_AIS_ERR_BAD_HANDLE;
>> +            TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed
>> with return value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +    }
>> +
>> +    if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) {
>> +            rc = SA_AIS_ERR_VERSION;
>> +            TRACE_2("ERR_VERSION: saCkptTrack SHOULD BE A VERSION
>> B.02.03 and above API but claims to be"
>> +                            "%c %u %u", cl_node->version.releaseCode,
>> cl_node->version.majorVersion, cl_node->version.minorVersion);
>> +            goto proc_fail;
>> +    }
>> +
>> +    if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) {
>> +            if (cl_node->callbk_mbx == 0)
>> +                    proc_rc = cpa_callback_ipc_init(cl_node);
>> +            else
>> +                    proc_rc = NCSCC_RC_SUCCESS;
>> +    } else {
>> +            rc = SA_AIS_ERR_INIT;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +
>> +    }
>> +
>> +    if (proc_rc != NCSCC_RC_SUCCESS) {
>> +            /* Error handling */
>> +            rc = SA_AIS_ERR_LIBRARY;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +    }
>> +    /* Send it to CPND */
>> +    memset(&evt, 0, sizeof(CPSV_EVT));
>> +    evt.type = CPSV_EVT_TYPE_CPND;
>> +    evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_REG;
>> +    evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle;
>> +
>> +    m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +    is_locked = false;
>> +    /* IF CPND IS DOWN  */
>> +    if (false == cb->is_cpnd_up) {
>> +            rc = SA_AIS_ERR_TRY_AGAIN;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto lock_fail;
>> +    }
>> +    proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb-
>>> cpnd_mds_dest, &evt, NCSMDS_SVC_ID_CPND);
>> +    /* Generate rc from proc_rc */
>> +    switch (proc_rc) {
>> +            case NCSCC_RC_SUCCESS:
>> +                    cl_node->is_track_enabled = true;
>> +                    break;
>> +            case NCSCC_RC_REQ_TIMOUT:
>> +                    rc = SA_AIS_ERR_TIMEOUT;
>> +                    TRACE_4("cpa CkptArrivalCallback:MDS Api failed
>> with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc,
>> ckptHandle, cb->cpnd_mds_dest);
>> +                    goto proc_fail;
>> +            default:
>> +                    rc = SA_AIS_ERR_NO_RESOURCES;
>> +                    TRACE_4("cpa CkptArrivalCallback:MDS Api failed
>> with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc,
>> ckptHandle, cb->cpnd_mds_dest);
>> +                    goto proc_fail;
>> +    }
>> +
>> +proc_fail:
>> +    if (is_locked)
>> +            m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +lock_fail:
>> +    m_CPA_GIVEUP_CB;
>> +
>> +done:
>> +    TRACE_LEAVE2("API return code = %u", rc);
>> +    return rc;
>> +}
>> +
>> +/*********************************************************
>> *******************
>> +Name          :  saCkptTrackStop
>> +
>> +Description   :  This function disable the Ckpt Track call back
>> +
>> +Arguments     :  ckptHandle - Checkpoint handle.
>> +
>> +Return Values :  Refer to SAI-AIS specification for various return values.
>> +
>> +Notes         :
>> +
>> +*********************************************************
>> **************
>> +*******/ SaAisErrorT saCkptTrackStop(SaCkptHandleT ckptHandle) {
>> +    SaAisErrorT rc = SA_AIS_OK;
>> +    CPSV_EVT evt;
>> +    uint32_t proc_rc = NCSCC_RC_SUCCESS;
>> +    CPA_CLIENT_NODE *cl_node = NULL;
>> +    CPA_CB *cb = NULL;
>> +    bool is_locked = false;
>> +
>> +    /* retrieve CPA CB */
>> +    m_CPA_RETRIEVE_CB(cb);
>> +    if (!cb) {
>> +            rc = SA_AIS_ERR_BAD_HANDLE;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx",rc, ckptHandle);
>> +            goto done;
>> +    }
>> +
>> +    /* get the CB Lock */
>> +    if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) !=
>> NCSCC_RC_SUCCESS) {
>> +            rc = SA_AIS_ERR_LIBRARY;
>> +            TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto lock_fail;
>> +    }
>> +
>> +    is_locked = true;
>> +
>> +    /* Get the Client info */
>> +    rc = cpa_client_node_get(&cb->client_tree, &ckptHandle,
>> &cl_node);
>> +
>> +    if (!cl_node) {
>> +            rc = SA_AIS_ERR_BAD_HANDLE;
>> +            TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed
>> with return value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +    }
>> +
>> +    if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) {
>> +            rc = SA_AIS_ERR_VERSION;
>> +            TRACE_2("ERR_VERSION: saCkptTrackStop SHOULD BE A
>> VERSION B.02.03 and above API  but claims to be"
>> +                            "%c %u %u", cl_node->version.releaseCode,
>> cl_node->version.majorVersion, cl_node->version.minorVersion);
>> +            goto proc_fail;
>> +    }
>> +
>> +    if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) {
>> +            if ((cl_node->callbk_mbx == 0) || (cl_node-
>>> is_track_enabled != true))
>> +                    proc_rc = SA_AIS_ERR_NOT_EXIST;
>> +            else
>> +                    proc_rc = NCSCC_RC_SUCCESS;
>> +    } else {
>> +            rc = SA_AIS_ERR_INIT;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +
>> +    }
>> +
>> +    if (proc_rc != NCSCC_RC_SUCCESS) {
>> +            /* Error handling */
>> +            rc = SA_AIS_ERR_NOT_EXIST;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto proc_fail;
>> +    }
>> +
>> +    /* Send it to CPND */
>> +    memset(&evt, 0, sizeof(CPSV_EVT));
>> +    evt.type = CPSV_EVT_TYPE_CPND;
>> +    evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_UNREG;
>> +    evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle;
>> +
>> +    m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +    is_locked = false;
>> +
>> +    /* IF CPND IS DOWN  */
>> +    if (false == cb->is_cpnd_up) {
>> +            rc = SA_AIS_ERR_TRY_AGAIN;
>> +            TRACE_4("cpa CkptArrivalCallback Api failed with return
>> value:%d,ckptHandle:%llx", rc, ckptHandle);
>> +            goto lock_fail;
>> +    }
>> +    proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb-
>>> cpnd_mds_dest, &evt,
>> +NCSMDS_SVC_ID_CPND);
>> +
>> +    /* Generate rc from proc_rc */
>> +    switch (proc_rc) {
>> +            case NCSCC_RC_SUCCESS:
>> +                    cl_node->is_track_enabled = false;
>> +                    break;
>> +            case NCSCC_RC_REQ_TIMOUT:
>> +                    rc = SA_AIS_ERR_TIMEOUT;
>> +                    TRACE_4("cpa CkptArrivalCallback:MDS Api failed
>> with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc,
>> ckptHandle, cb->cpnd_mds_dest);
>> +                    goto proc_fail;
>> +            default:
>> +                    rc = SA_AIS_ERR_NO_RESOURCES;
>> +                    TRACE_4("cpa CkptArrivalCallback:MDS Api failed
>> with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc,
>> ckptHandle, cb->cpnd_mds_dest);
>> +                    goto proc_fail;
>> +    }
>> +
>> +proc_fail:
>> +    if (is_locked)
>> +            m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
>> +lock_fail:
>> +    m_CPA_GIVEUP_CB;
>> +
>> +done:
>> +    TRACE_LEAVE2("API return code = %u", rc);
>> +    return rc;
>> +}
>> +
>> +/*********************************************************
>> *******************
>> +Name          :  saCkptCheckpointTrack
>> +
>> +Description   :  This function enables  the specific Checkpoint Track call 
>> back
>> +
>> +Arguments     :  checkpointHandle - The handle that designates the
>> checkpoint
>> +to enables Track.
>> +
>> +Return Values :  Refer to SAI-AIS specification for various return values.
>> +
>> +Notes         :
>> +
>> +*********************************************************
>> **************
>> +*******/ SaAisErrorT saCkptCheckpointTrack(SaCkptCheckpointHandleT
>> +checkpointHandle) {
>> +    /* TODO: Not supported yet.
>> +       In future to support checkpoint tracking start "per (checkpoint -
>> handle) SaCkptCheckpointHandleT ".
>> +       this is a placeholder for future enhancement the
>> saCkptCheckpointTrack() is in place, but
>> +       will return SA_AIS_ERR_NOT_SUPPORTED */
>> +    SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED;
>> +    TRACE_ENTER();
>> +    TRACE_LEAVE2("API return code = %u", rc);
>> +    return rc;
>> +}
>> +
>> +/*********************************************************
>> *******************
>> +Name          :  saCkptCheckpointTrackStop
>> +
>> +Description   :  This function disables the specific Checkpoint  Track call 
>> back
>> +
>> +Arguments     :  checkpointHandle - The handle that designates the
>> checkpoint
>> +to disables Track.
>> +
>> +Return Values :  Refer to SAI-AIS specification for various return values.
>> +
>> +Notes         :
>> +
>> +*********************************************************
>> **************
>> +*******/ SaAisErrorT
>> saCkptCheckpointTrackStop(SaCkptCheckpointHandleT
>> +checkpointHandle) {
>> +    /* TODO: Not supported yet.
>> +       In future to support checkpoint tracking stop "per (checkpoint -
>> handle) SaCkptCheckpointHandleT ".
>> +       this is a placeholder for future enhancement the
>> saCkptCheckpointTrack() is in place, but
>> +       will return SA_AIS_ERR_NOT_SUPPORTED */
>> +    SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED;
>> +    TRACE_ENTER();
>> +    TRACE_LEAVE2("API return code = %u", rc);
>> +    return rc;
>> +}
>> +
>> diff --git a/osaf/libs/agents/saf/cpa/cpa_proc.c
>> b/osaf/libs/agents/saf/cpa/cpa_proc.c
>> --- a/osaf/libs/agents/saf/cpa/cpa_proc.c
>> +++ b/osaf/libs/agents/saf/cpa/cpa_proc.c
>> @@ -1031,10 +1031,10 @@ static void cpa_process_callback_info(CP
>>              }
>>              break;
>>      case CPA_CALLBACK_TYPE_ARRIVAL_NTFY:
>> -            if (cl_node->ckptArrivalCallback) {
>> +            if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) {
>>                      uint32_t i = 0;
>> -                    cl_node->ckptArrivalCallback(callback->lcl_ckpt_hdl,
>> callback->ioVector,
>> -                                                 callback->num_of_elmts);
>> +                    cl_node-
>>> ckpt_callbk.saCkptCheckpointTrackCallback(callback->lcl_ckpt_hdl, callback-
>>> ioVector,
>> +                                            callback->num_of_elmts);
>>                      for (i = 0; i < callback->num_of_elmts; i++) {
>>                              if (callback->ioVector[i].sectionId.id != NULL
>>                                  && callback->ioVector[i].sectionId.idLen !=
>> 0) diff --git a/osaf/libs/common/cpsv/cpsv_edu.c
>> b/osaf/libs/common/cpsv/cpsv_edu.c
>> --- a/osaf/libs/common/cpsv/cpsv_edu.c
>> +++ b/osaf/libs/common/cpsv/cpsv_edu.c
>> @@ -87,7 +87,7 @@ FUNC_DECLARATION(CPD_EVT);
>> FUNC_DECLARATION(CPA_EVT);  FUNC_DECLARATION(CPSV_EVT);
>> FUNC_DECLARATION(CPSV_A2ND_CKPT_LIST_UPDATE);
>> -
>> +FUNC_DECLARATION(CPSV_A2ND_ARRIVAL_UNREG);
>>   /* Test function declaration */
>>   TEST_FUNC_DECLARATION(CPSV_EVT);
>>   TEST_FUNC_DECLARATION(CPA_EVT);
>> @@ -1086,6 +1086,21 @@ FUNC_DECLARATION(DS)
>>
>>   #undef DS
>>
>> +#define DS  CPSV_A2ND_ARRIVAL_UNREG
>> +FUNC_DECLARATION(DS)
>> +{
>> +    NCS_ENC_DEC_DECLARATION(DS);
>> +    NCS_ENC_DEC_ARRAY(DS) {
>> +
>> +            {
>> +                    EDU_START,
>> FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, 0, sizeof(DS), 0, NULL}, {
>> +                            EDU_EXEC, ncs_edp_uns64, 0, 0, 0,
>> (long)&((DS *) 0)->client_hdl, 0, NULL}, {
>> +                                    EDU_END, 0, 0, 0, 0, 0, 0, NULL},};
>> +                    NCS_ENC_DEC_REM_FLOW(DS)
>> +}
>> +
>> +#undef DS
>> +
>>   /* CPD --> CPND */
>>   #define DS   CPSV_CPND_DEST_INFO
>>   FUNC_DECLARATION(DS)
>> @@ -1234,6 +1249,7 @@ FUNC_DECLARATION(DS)
>>
>>   #undef DS
>>
>> +
>>   #define DS CPND_EVT
>>   TEST_FUNC_DECLARATION(DS)
>>   {
>> @@ -1301,6 +1317,7 @@ TEST_FUNC_DECLARATION(DS)
>>
>>
>>      LCL_TEST_JUMP_OFFSET_CPND_EVT_D2ND_CKPT_NUM_SECTIONS,
>>
>>      LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE,
>> +
>>      LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG,
>>
>>      };
>>
>> @@ -1416,6 +1433,8 @@ TEST_FUNC_DECLARATION(DS)
>>              return
>> LCL_TEST_JUMP_OFFSET_CPSV_D2ND_RESTART_DONE;
>>      case CPND_EVT_A2ND_CKPT_LIST_UPDATE:
>>              return
>> LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE;
>> +    case CPND_EVT_A2ND_ARRIVAL_CB_UNREG:
>> +            return
>> LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG;
>>      default:
>>              return EDU_FAIL;
>>      }
>> @@ -1520,6 +1539,7 @@ FUNC_DECLARATION(DS)
>>              EDU_EXEC, FUNC_NAME(CPSV_CKPT_NUM_SECTIONS), 0,
>> 0, EDU_EXIT,
>>                          (long)&((DS *) 0)->info.ckpt_sections, 0, NULL}, {
>>              EDU_EXEC, FUNC_NAME(CPSV_A2ND_CKPT_LIST_UPDATE),
>> 0, 0, EDU_EXIT, (long)&((DS *) 0)->info.ckptListUpdate, 0, NULL},{
>> +                    EDU_EXEC,
>> FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, EDU_EXIT,
>> +(long)&((DS *) 0)->info.arr_ntfy, 0, NULL},{
>>      EDU_END, 0, 0, 0, 0, 0, 0, NULL},};
>>      NCS_ENC_DEC_REM_FLOW(DS)
>>   }
>> diff --git a/osaf/libs/common/cpsv/include/cpa_cb.h
>> b/osaf/libs/common/cpsv/include/cpa_cb.h
>> --- a/osaf/libs/common/cpsv/include/cpa_cb.h
>> +++ b/osaf/libs/common/cpsv/include/cpa_cb.h
>> @@ -28,9 +28,9 @@ typedef struct cpa_client_node {
>>      SaCkptHandleT cl_hdl;   /* index for the tree */
>>      uint8_t stale;          /*Loss of connection with cpnd because of
>> clm node left
>>                                will set this to true for the connection. */
>> -    SaCkptCallbacksT ckpt_callbk;
>> +    SaCkptCallbacksT_2 ckpt_callbk;
>>      SYSF_MBX callbk_mbx;    /* Mailbox Queue for client messages */
>> -    ncsCkptCkptArrivalCallbackT ckptArrivalCallback;        /* NCS
>> callback extention */
>> +    bool is_track_enabled;
>>      SaVersionT version;
>>   } CPA_CLIENT_NODE;
>>
>> diff --git a/osaf/libs/common/cpsv/include/cpa_def.h
>> b/osaf/libs/common/cpsv/include/cpa_def.h
>> --- a/osaf/libs/common/cpsv/include/cpa_def.h
>> +++ b/osaf/libs/common/cpsv/include/cpa_def.h
>> @@ -21,7 +21,7 @@
>>   /* Macros for Validating Version */
>>   #define CPA_RELEASE_CODE 'B'
>>   #define CPA_MAJOR_VERSION 0x02
>> -#define CPA_MINOR_VERSION 0x02
>> +#define CPA_MINOR_VERSION 0x03
>>   #define CPA_BASE_MAJOR_VERSION 0x01
>>   #define CPA_BASE_MINOR_VERSION 0x01
>>
>> diff --git a/osaf/libs/common/cpsv/include/cpa_proc.h
>> b/osaf/libs/common/cpsv/include/cpa_proc.h
>> --- a/osaf/libs/common/cpsv/include/cpa_proc.h
>> +++ b/osaf/libs/common/cpsv/include/cpa_proc.h
>> @@ -23,7 +23,7 @@ typedef enum cpa_callback_type {
>>      CPA_CALLBACK_TYPE_OPEN = 1,
>>      CPA_CALLBACK_TYPE_SYNC,
>>      CPA_CALLBACK_TYPE_ARRIVAL_NTFY,
>> -    CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_SYNC
>> +    CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_ARRIVAL_NTFY
>>   } CPA_CALLBACK_TYPE;
>>
>>   /* Info required for Call back */
>> diff --git a/osaf/libs/common/cpsv/include/cpsv.h
>> b/osaf/libs/common/cpsv/include/cpsv.h
>> --- a/osaf/libs/common/cpsv/include/cpsv.h
>> +++ b/osaf/libs/common/cpsv/include/cpsv.h
>> @@ -74,6 +74,13 @@
>>       ((ver)->releaseCode > 'B') )&& \
>>       ((ver)->majorVersion > 0x01 ) && \
>>       ((ver)->minorVersion > 0x01 ) )
>> +
>> +#define m_CPA_VER_IS_BELOW_B_2_3(ver) \
>> +    (((ver)->releaseCode != 'B') || \
>> +    ((ver)->majorVersion != 0x02 ) || \
>> +    ((ver)->minorVersion < 0x03 ) )
>> +
>> +
>>   #define m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(attr)                  \
>>       ((attr)->creationFlags & SA_CKPT_CHECKPOINT_COLLOCATED)
>>
>> diff --git a/osaf/libs/common/cpsv/include/cpsv_evt.h
>> b/osaf/libs/common/cpsv/include/cpsv_evt.h
>> --- a/osaf/libs/common/cpsv/include/cpsv_evt.h
>> +++ b/osaf/libs/common/cpsv/include/cpsv_evt.h
>> @@ -30,6 +30,7 @@
>>   #define CPSV_EVT_H
>>
>>   #include <saCkpt.h>
>> +#include <saCkpt_B_02_03.h>
>>   #include "ncssysf_tmr.h"
>>
>>
>> /**********************************************************
>> *******************
>> @@ -115,7 +116,7 @@ typedef enum cpnd_evt_type {
>>
>>      CPND_EVT_A2ND_CKPT_ITER_GETNEXT,        /* Checkpoint Section
>> Iternation Getnext Call */
>>
>> -    CPND_EVT_A2ND_ARRIVAL_CB_REG,   /* Checkpoint Arrival Callback
>> */
>> +    CPND_EVT_A2ND_ARRIVAL_CB_REG,   /* Checkpoint Arrival Callback
>> Register*/
>>
>>      CPND_EVT_A2ND_CKPT_WRITE,       /* Checkpoint Write And
>> overwrite call */
>>      CPND_EVT_A2ND_CKPT_READ,        /* Checkpoint Read Call  */
>> @@ -177,6 +178,7 @@ typedef enum cpnd_evt_type {
>>      CPND_EVT_D2ND_CKPT_NUM_SECTIONS,
>>      CPND_EVT_A2ND_CKPT_REFCNTSET,        /* ref cont opener's set call */
>>      CPND_EVT_A2ND_CKPT_LIST_UPDATE, /* Checkpoint ckpt list update
>> Call */
>> +   CPND_EVT_A2ND_ARRIVAL_CB_UNREG,  /* Checkpoint Arrival Callback
>> Un-Register*/
>>      CPND_EVT_MAX
>>
>>   }CPND_EVT_TYPE;
>> @@ -394,6 +396,10 @@ typedef struct cpsv_a2nd_arrival_reg {
>>      SaCkptCheckpointHandleT client_hdl;
>>   } CPSV_A2ND_ARRIVAL_REG;
>>
>> +typedef struct cpsv_a2nd_arrival_unreg {
>> +    SaCkptCheckpointHandleT client_hdl;
>> +} CPSV_A2ND_ARRIVAL_UNREG;
>> +
>>   typedef struct cpsv_a2nd_sync_ckpt {
>>      SaCkptCheckpointHandleT ckpt_id;
>>      SaCkptCheckpointHandleT lcl_ckpt_hdl;
>> diff --git a/osaf/libs/saf/include/Makefile.am
>> b/osaf/libs/saf/include/Makefile.am
>> --- a/osaf/libs/saf/include/Makefile.am
>> +++ b/osaf/libs/saf/include/Makefile.am
>> @@ -22,6 +22,7 @@ include_HEADERS = \
>>      saAis.h \
>>      saAmf.h \
>>      saCkpt.h \
>> +    saCkpt_B_02_03.h \
>>      saClm.h \
>>      saEvt.h \
>>      saImm.h \
>> diff --git a/osaf/libs/saf/include/saCkpt_B_02_03.h
>> b/osaf/libs/saf/include/saCkpt_B_02_03.h
>> new file mode 100644
>> --- /dev/null
>> +++ b/osaf/libs/saf/include/saCkpt_B_02_03.h
>> @@ -0,0 +1,152 @@
>> +/*    -*- OpenSAF  -*-
>> + *
>> + * (C) Copyright 2008 The OpenSAF Foundation
>> + *
>> + * This program is distributed in the hope that it will be useful, but
>> + * WITHOUT ANY WARRANTY; without even the implied warranty of
>> +MERCHANTABILITY
>> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are
>> +licensed
>> + * under the GNU Lesser General Public License Version 2.1, February 1999.
>> + * The complete license can be accessed from the following location:
>> + * http://opensource.org/licenses/lgpl-license.php
>> + * See the Copying file included with the OpenSAF distribution for full
>> + * licensing terms.
>> + *
>> + * Author(s): Goahead
>> + */
>> +
>> +/*
>> + * DESCRIPTION:
>> + *   This file provides the suggested additions to the C language binding 
>> for
>> + *   the Service Availability(TM) Forum Information Model Management
>> Service (CKPT).
>> + *   It contains only the prototypes and type definitions that are part of 
>> this
>> + *   proposed addition.
>> + *   These additions are currently NON STANDARD. But the intention is to
>> get these
>> + *   additions approved formally by SAF in the future.
>> + *
>> + */
>> +
>> +#ifndef _SA_CKPT_B_02_03_H
>> +#define _SA_CKPT_B_02_03_H
>> +
>> +#include "saAis.h"
>> +
>> +#ifdef  __cplusplus
>> +extern "C" {
>> +#endif
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief    : The Checkpoint Service invokes this callback function when
>> the
>> +                    ckpt write, ckpt section create and ckpt section
>> delete happens
>> +                    for the ALL the Checkpoints which are opened with
>> CHECKPOINT_WRITE
>> +                    Open Flags by the ckptHandle invoking process .
>> +    @param[in]  : checkpointHandle - A pointer to the checkpoint handle
>> which was
>> +                     obtained by saCkptCheckpointOpen.
>> +    @param[out] : ioVector - A pointer to an array that contains
>> elements ioVector[0],
>> +    @param[out] : numberOfElements - Size of the ioVector.
>> +
>>      ****************************************************
>> ************************/
>> +    typedef void
>> +            (*SaCkptCheckpointTrackCallbackT)
>> (SaCkptCheckpointHandleT checkpointHandle,
>> +                            SaCkptIOVectorElementT *ioVector,
>> +                            SaUint32T numberOfElements);
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief   :  The callbacks structure is supplied to the Checkpoint
>> Service by a
>> +                    process and contains the callback functions that the
>> +                    Checkpoint Service can invoke.
>> +
>>      ****************************************************
>> *************************/
>> +    typedef struct {
>> +            SaCkptCheckpointOpenCallbackT
>> saCkptCheckpointOpenCallback;
>> +            SaCkptCheckpointSynchronizeCallbackT
>> saCkptCheckpointSynchronizeCallback;
>> +            SaCkptCheckpointTrackCallbackT
>> saCkptCheckpointTrackCallback;
>> +    } SaCkptCallbacksT_2;
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief      : saCkptInitialize_2 function initializes the Checkpoint
>> Service
>> +                    for the invoking process and registers the various
>> callback functions.
>> +                    The handle 'ckptHandle' is returned as the reference
>> to this
>> +                    association between the process and the Checkpoint
>> Service..
>> +    @param[out] : ckptHandle - A pointer to the handle designating this
>> +                    particular initialization of the Checkpoint
>> +                    service that it to be returned by the Checkpoint
>> Service.
>> +    @param[in]  : ckptCallbacks-Pointer to a SaCkptCallbacksT_2
>> structure,
>> +                    containing the callback functions of the process
>> +                    that the Checkpoint Service may invoke.
>> +    @param[in]  : version - Is a pointer to the version of the Checkpoint
>> +                    Service that the invoking process is using.
>> +    @return  : SA_AIS_OK if successful otherwise appropriate err
>> code,
>> +                    Refer to SAI-AIS specification for various return
>> values.
>> +
>>      ****************************************************
>> *************************/
>> +    extern SaAisErrorT
>> +            saCkptInitialize_2(SaCkptHandleT *ckptHandle, const
>> +SaCkptCallbacksT_2 *callbacks, SaVersionT *version);
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief    : saCkptTrack function enable/starts the Ckpt Track callback
>> +                    function (saCkptCheckpointTrackCallback) which was
>> registered
>> +                    at the time of initializes for the ckptHandle invoking
>> process.
>> +                    The registered Track Callback function will be invoked
>> whenever
>> +                    ckpt write, ckpt section create and ckpt section
>> delete happens
>> +                    for the ALL the Checkpoints which are opened with
>> CHECKPOINT_WRITE
>> +                    Open Flags by the ckptHandle invoking process .
>> +    @param[in]  : ckptHandle - A pointer to the handle designating this
>> +                    particular initialization of the Checkpoint
>> +                    service which was returned at the time of initialize().
>> +    @return  : SA_AIS_OK if successful otherwise appropriate err
>> code,
>> +                    Refer to SAI-AIS specification for various return
>> values.
>> +
>>      ****************************************************
>> *************************/
>> +    extern SaAisErrorT
>> +            saCkptTrack(SaCkptHandleT ckptHandle);
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief    : saCkptTrackStop function disables/stops the Ckpt Track
>> callback
>> +                    function (saCkptCheckpointTrackCallback) which was
>> registered at
>> +                    the time of initializes for the ckptHandle invoking
>> process.
>> +                    The registered Track Callback function will be disabled
>> for
>> +                    ckpt write, ckpt section create and ckpt section
>> delete happens
>> +                    for the ALL the Checkpoints which are opened with
>> CHECKPOINT_WRITE
>> +                    Open Flags by the ckptHandle invoking process .
>> +    @param[in]  : ckptHandle - A pointer to the handle designating this
>> +                    particular initialization of the Checkpoint
>> +                    service which was returned at the time of initialize().
>> +    @return  : SA_AIS_OK if successful otherwise appropriate err
>> code ,
>> +                    Refer to SAI-AIS specification for various return
>> values.
>> +
>>      ****************************************************
>> *************************/
>> +    extern SaAisErrorT
>> +            saCkptTrackStop(SaCkptHandleT ckptHandle);
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief    : saCkptCheckpointTrack function enable/starts the Ckpt
>> Track
>> +                    callback function (saCkptCheckpointTrackCallback)
>> which was
>> +                    registered at the time of initializes for a particular
>> checkpointHandle.
>> +                    The registered Track Callback function will be invoked
>> +                    whenever ckpt write, ckpt section create and ckpt
>> section
>> +                    delete happens for the Checkpoints which are
>> opened with
>> +                    CHECKPOINT_WRITE Open Flags by a particular
>> checkpointHandle.
>> +    @param[in]  : checkpointHandle -A pointer to the checkpoint handle
>> +                    which was obtained by saCkptCheckpointOpen
>> +    @return  : SA_AIS_OK if successful otherwise appropriate err
>> code,
>> +                    Refer to SAI-AIS specification for various return
>> values.
>> +
>>      ****************************************************
>> *************************/
>> +    extern SaAisErrorT
>> +            saCkptCheckpointTrack(SaCkptCheckpointHandleT
>> checkpointHandle);
>> +
>> +
>>      /****************************************************
>> ***********************
>> +    @brief    : saCkptCheckpointTrack function disables/stops the Ckpt
>> Track
>> +                    callback function (saCkptCheckpointTrackCallback)
>> which was
>> +                    registered at the time of initializes for a particular
>> checkpointHandle.
>> +                    The registered Track Callback function will be disabled
>> for
>> +                    ckpt write, ckpt section create and ckpt section
>> delete happens
>> +                    for the Checkpoints which are opened with
>> CHECKPOINT_WRITE
>> +                    Open Flags by a particular checkpointHandle .
>> +    @param[in]  : checkpointHandle -A pointer to the checkpoint handle
>> which
>> +                    was obtained by saCkptCheckpointOpen
>> +    @return  : SA_AIS_OK if successful otherwise appropriate err
>> code,
>> +                    Refer to SAI-AIS specification for various return
>> values.
>> +
>>      ****************************************************
>> *************************/
>> +    extern SaAisErrorT
>> +            saCkptCheckpointTrackStop(SaCkptCheckpointHandleT
>> checkpointHandle);
>> +
>> +#ifdef  __cplusplus
>> +}
>> +#endif
>> +
>> +#endif   /* _SA_CKPT_B_02_03_H */
>> diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
>> b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
>> --- a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
>> +++ b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
>> @@ -59,6 +59,7 @@ static uint32_t cpnd_evt_proc_nd2nd_ckpt  static
>> uint32_t cpnd_evt_proc_nd2nd_ckpt_active_data_access_rsp(CPND_CB
>> *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo);  static uint32_t
>> cpnd_evt_proc_ckpt_sync(CPND_CB *cb, CPND_EVT *evt,
>> CPSV_SEND_INFO *sinfo);  static uint32_t
>> cpnd_evt_proc_arrival_cbreg(CPND_CB *cb, CPND_EVT *evt,
>> CPSV_SEND_INFO *sinfo);
>> +static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb, CPND_EVT
>> +*evt, CPSV_SEND_INFO *sinfo);
>>   static uint32_t cpnd_evt_proc_nd2nd_ckpt_sync_req(CPND_CB *cb,
>> CPND_EVT *evt, CPSV_SEND_INFO *sinfo);  static uint32_t
>> cpnd_evt_proc_nd2nd_ckpt_active_sync(CPND_CB *cb, CPND_EVT *evt,
>> CPSV_SEND_INFO *sinfo);  static uint32_t
>> cpnd_evt_proc_ckpt_read(CPND_CB *cb, CPND_EVT *evt,
>> CPSV_SEND_INFO *sinfo); @@ -105,7 +106,7 @@ static char *cpnd_evt_str[]
>> = {
>>      "CPND_EVT_A2ND_CKPT_READ",      /* Checkpoint Read Call  */
>>      "CPND_EVT_A2ND_CKPT_SYNC",      /* Checkpoint Synchronize
>> call */
>>      "CPND_EVT_A2ND_CKPT_READ_ACK",  /* read ack */
>> -    "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Arrival Callback
>> Register */
>> +    "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Track  Callback
>> Register */
>>
>>      "CPND_EVT_ND2ND_ACTIVE_STATUS", /* ckpt status info
>> from active */       /* Not used Anywhere from 3.0.2 */
>>      "CPND_EVT_ND2ND_ACTIVE_STATUS_ACK",     /* ckpt status ack
>> from active */       /*Not used Anywhere from 3.0.2 */
>> @@ -148,6 +149,7 @@ static char *cpnd_evt_str[] = {
>>      "CPND_EVT_D2ND_CKPT_NUM_SECTIONS",
>>      "CPND_EVT_A2ND_CKPT_REFCNTSET",
>>              "CPND_EVT_A2ND_CKPT_LIST_UPDATE",       /* Checkpoint ckpt
>> list update Call */
>> +    "CPND_EVT_A2ND_ARRIVAL_CB_UNREG",       /* Track  Callback Un-
>> Register */
>>      "CPND_EVT_MAX"
>>   };
>>   #endif
>> @@ -264,6 +266,9 @@ void cpnd_process_evt(CPSV_EVT *evt)
>>      case CPND_EVT_A2ND_ARRIVAL_CB_REG:
>>              (void)cpnd_evt_proc_arrival_cbreg(cb, &evt->info.cpnd,
>> &evt->sinfo);
>>              break;
>> +    case CPND_EVT_A2ND_ARRIVAL_CB_UNREG:
>> +            (void)cpnd_evt_proc_arrival_cbunreg(cb, &evt->info.cpnd,
>> &evt->sinfo);
>> +            break;
>>      case CPND_EVT_D2ND_CKPT_ACTIVE_SET:     /* broadcast message
>> */
>>              (void)cpnd_evt_proc_ckpt_active_set(cb, &evt->info.cpnd,
>> &evt->sinfo);
>>              break;
>> @@ -3312,6 +3317,38 @@ static uint32_t cpnd_evt_proc_arrival_cb
>>      return rc;
>>   }
>>
>> +/*********************************************************
>> *********************
>> + * Name          : cpnd_evt_proc_arrival_cbunreg
>> + *
>> + * Description   : Function to process the arrival callback registration
>> + *
>> + * Arguments     : CPND_CB *cb - CPND CB pointer
>> + *                 CPSV_EVT *evt - Received Event structure
>> + *                 CPSV_SEND_INFO *sinfo - Sender MDS information.
>> + *
>> + * Return Values : NCSCC_RC_SUCCESS/Error
>> + *
>> +
>> +*********************************************************
>> **************
>> +******/ static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb,
>> +CPND_EVT *evt, CPSV_SEND_INFO *sinfo) {
>> +    CPND_CKPT_CLIENT_NODE *cl_node = NULL;
>> +    uint32_t rc = NCSCC_RC_SUCCESS;
>> +
>> +    TRACE_ENTER();
>> +    cpnd_client_node_get(cb, evt->info.arr_ntfy.client_hdl, &cl_node);
>> +    if (cl_node == NULL) {
>> +            TRACE_4("cpnd client hdl get failed for client_hdl:%llx",evt-
>>> info.arr_ntfy.client_hdl);
>> +            rc = NCSCC_RC_FAILURE;
>> +            TRACE_LEAVE();
>> +            return rc;
>> +    }
>> +    cl_node->arrival_cb_flag = false;
>> +
>> +    cpnd_restart_set_arrcb(cb, cl_node);
>> +    TRACE_LEAVE();
>> +    return rc;
>> +}
>> +
>>
>> /**********************************************************
>> ******************
>>    * Name          : cpnd_evt_proc_nd2nd_ckpt_sync_req
>>    *


------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to