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