ClRcT
clLogStreamOwnerEntrySerialiser(ClUint32T  dsId,
                                ClAddrT    *pBuffer,
                                ClUint32T  *pSize,
                                ClPtrT     cookie)
{
    ClRcT      rc          = CL_OK;
    ClBufferHandleT  msg = (ClBufferHandleT) cookie;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clBufferLengthGet(msg, pSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet(): rc[0x %x]", rc));
        return rc;
    }
    *pBuffer = (ClAddrT)clHeapCalloc(*pSize, sizeof(ClUint8T));
    if( NULL == *pBuffer )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc()"));
        return rc;
    }    
    rc = clBufferNBytesRead(msg, (ClUint8T *) *pBuffer, pSize); 
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferNBytesRead(): rc[0x %x]", rc));
        clHeapFree(*pBuffer);
        return rc;
    }
        
    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}    
ClRcT
clLogMasterCompData2BufferGet(ClLogCompDataT  *pCompData,
                              ClUint8T        **ppBuffer,
                              ClUint32T       *pDataSize)
{
    ClRcT            rc  = CL_OK;
    ClBufferHandleT  msg = CL_HANDLE_INVALID_VALUE;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clBufferCreate(&msg);
    if(CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        return rc;
    }

    rc = VDECL_VER(clXdrMarshallClLogCompDataT, 4, 0, 0)(pCompData, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogMarshallClLogCompDataT(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }

    rc = clBufferLengthGet(msg, pDataSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }

    *ppBuffer = (ClUint8T*) clHeapCalloc(*pDataSize, sizeof(ClUint8T));
    if( NULL == *ppBuffer )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc()"));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return CL_LOG_RC(CL_ERR_NO_MEMORY);
    }

    rc = clBufferNBytesRead(msg, *ppBuffer, pDataSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferNBytesRead(): rc[0x %x]", rc));
        clHeapFree(*ppBuffer);
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }
    CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return CL_OK;
}
ClRcT clDebugPrintFinalize(ClDebugPrintHandleT* handle, char** buf)
{
    ClUint32T len = 0;
    ClRcT rc = CL_OK;
    ClBufferHandleT* msg = (ClBufferHandleT*)handle;

    if (NULL == buf)
    {
        return CL_DEBUG_RC(CL_ERR_NULL_POINTER);
    }

    rc = clBufferLengthGet(*msg, &len);
    if (CL_OK != rc)
    {
        return rc;
    }

    *buf = (char*)clHeapAllocate(len + 1);
    if (CL_OK != rc)
    {
        return CL_DEBUG_RC(CL_ERR_NO_MEMORY);
    }

    rc = clBufferNBytesRead(*msg, (ClUint8T*)*buf, &len);
    if (CL_OK != rc)
    {
        clHeapFree(*buf);
        *buf = NULL;
        return rc;
    }
    (*buf)[len] = '\0';

    clBufferDelete(msg);
    *msg = 0;

    return rc;
}
ClRcT corAmfObjectCreate(ClUint32T entityId, ClAmsEntityT *entity, ClCorMOIdT *pMoId)
{
    ClRcT rc = CL_OK;
    ClBufferHandleT msg = 0;
    ClUint32T moIdBufferLen = 0;
    ClUint8T *moIdBuffer = NULL;
    ClCorMOIdT tempMoId;
    ClCorMOServiceIdT svcId = CL_COR_SVC_ID_PROVISIONING_MANAGEMENT;
    ClCorAttributeValueListT attrValueList = {0};

    if(!gClAmfMibLoaded) 
        svcId = CL_COR_SVC_ID_AMF_MANAGEMENT;

    /*
     *Faster than a clone
     */
    memcpy(&tempMoId, pMoId, sizeof(tempMoId));

    rc = clCorObjectCreate(&sessionId, &tempMoId, NULL);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "COR MO object create for entity [%s] returned [%#x]",
                   entity->name.value, rc);
        goto out;
    }

    rc = clCorMoIdServiceSet(&tempMoId, svcId);
    CL_ASSERT(rc == CL_OK);

    rc = corAmfEntityAttributeListGet(&entityId, entity, NULL, &attrValueList);
    if(rc != CL_OK) goto out;
    
    rc = clCorObjectCreateAndSet(&sessionId, &tempMoId, &attrValueList, NULL);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "COR MSO object create for entity [%s] returned [%#x]",
                   entity->name.value, rc);
        goto out;
    }

    rc = clBufferCreate(&msg);
    CL_ASSERT(rc == CL_OK);

    rc = VDECL_VER(clXdrMarshallClCorMOIdT, 4, 0, 0)((ClUint8T*)&tempMoId, msg, 0);
    CL_ASSERT(rc == CL_OK);

    rc = clBufferLengthGet(msg, &moIdBufferLen);
    CL_ASSERT(rc == CL_OK);

    rc = clBufferFlatten(msg, &moIdBuffer);
    CL_ASSERT(rc == CL_OK);

    /*
     * Now store this moid buffer into the entity user area for the entity key.
     */
    rc = clAmsMgmtEntityUserDataSetKey(mgmtHandle, entity, &entity->name, 
                                       (ClCharT*)moIdBuffer, moIdBufferLen);
    if(rc != CL_OK)
    {
        clLogError("COR", "AMF", "Entity user data set for [%s] returned [%#x]",
                   entity->name.value, rc);
        goto out;
    }

    out:
    if(attrValueList.pAttributeValue) clHeapFree(attrValueList.pAttributeValue);
    if(moIdBuffer) clHeapFree(moIdBuffer);
    if(msg) clBufferDelete(&msg);
    return rc;
}
/**
 * Serializer function for transaction state
 */
static ClRcT _clTxnServiceCkptTxnStatePack(
    CL_IN   ClUint32T   dataSetId,
    CL_OUT  ClAddrT     *ppData,
    CL_OUT  ClUint32T   *pDataLen,
    CL_IN   ClPtrT      cookie)
{
    ClRcT                   rc  = CL_OK;
    ClTxnTransactionIdT     *pTxnId;
    ClBufferHandleT  msgHandle;
    ClUint32T               msgLen;

    CL_FUNC_ENTER();

    pTxnId = (ClTxnTransactionIdT *) cookie;

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("To checkpoint recovery-log of txn 0x%x:0x%x",
                                    pTxnId->txnMgrNodeAddress, pTxnId->txnId));

    rc = clBufferCreate(&msgHandle);

    if (CL_OK == rc)
    {
        rc = clTxnRecoveryLogPack(pTxnId, msgHandle);

        *ppData = NULL;
        *pDataLen = 0;
        if (CL_OK == rc)
        {
            /* Copy the state-information from message-buffer to ppData */
            rc = clBufferLengthGet(msgHandle, &msgLen);
        }

        if (CL_OK == rc)
        {
            *pDataLen = msgLen;
            *ppData = (ClInt8T *) clHeapAllocate(msgLen);
            if ( *ppData == NULL )
            {
                CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Failed to allocate memory"));
                rc = CL_ERR_NO_MEMORY;
            }
        }

        if (CL_OK == rc)
        {
            rc = clBufferNBytesRead(msgHandle, (ClUint8T *) *ppData, &msgLen);
            if (CL_OK != rc)
            {
                clHeapFree(*ppData);
                *pDataLen = 0x0;
                CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                               ("Failed to pack/serialize txn-defn[0x%x:0x%x] for ckpt. rc:0x%x",
                                pTxnId->txnMgrNodeAddress, pTxnId->txnId, rc));
                rc = CL_GET_ERROR_CODE(rc);
            }
        }
        rc = clBufferDelete(&msgHandle);
    }
    CL_FUNC_EXIT();
    return (rc);
}
/**
 * Internal function to pack/prepare state oa given transaction
 */
static ClRcT _clTxnServiceCkptTxnPack(
    CL_IN   ClUint32T   dataSetId,
    CL_OUT  ClAddrT     *ppData,
    CL_OUT  ClUint32T   *pDataLen,
    CL_IN   ClPtrT      cookie)
{
    ClRcT                   rc = CL_OK;
    ClTxnDefnT              *pTxnDefn;
    ClBufferHandleT  txnStateBuf;
    ClUint32T               msgLen;

    CL_FUNC_ENTER();

    pTxnDefn = (ClTxnDefnT *) cookie;

    if (pTxnDefn == NULL)
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Null argument"));
        CL_FUNC_EXIT();
        return (CL_ERR_NULL_POINTER);
    }

    CL_DEBUG_PRINT(CL_DEBUG_TRACE,
                   ("Packing for data-set 0x%x for txn[0x%x:0x%x]", dataSetId,
                    pTxnDefn->serverTxnId.txnMgrNodeAddress, pTxnDefn->serverTxnId.txnId));

    /* Validate between dataSetId and txn-Id */
#if 0
    if ( (dataSetId  - CL_TXN_CKPT_TXN_DATA_SET_ID_OFFSET) != pTxnId->txnId)
    {
        CL_TXN_RETURN_RC(CL_ERR_INVALID_PARAMETER,
                         ("Invalid data-set(0x%x) for transaction-id(0x%x)\n",
                          dataSetId, pTxnId->txnId));
    }
#endif

    rc = clBufferCreate (&txnStateBuf);

    if (CL_OK == rc)
    {
        rc = clTxnStreamTxnCfgInfoPack (pTxnDefn, txnStateBuf);

        *ppData = NULL;
        *pDataLen = 0;

        if (CL_OK == rc)
        {
            /* Copy the state-information from message-buffer to ppData */
            rc = clBufferLengthGet(txnStateBuf, &msgLen);
        }

        if (CL_OK == rc)
        {
            *pDataLen = msgLen;
            *ppData = (ClInt8T *) clHeapAllocate(msgLen);
            if ( *ppData == NULL )
            {
                CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Failed to allocate memory"));
                rc = CL_ERR_NO_MEMORY;
            }
        }

        if (CL_OK == rc)
        {
            rc = clBufferNBytesRead(txnStateBuf, (ClUint8T *) *ppData, &msgLen);
            if (CL_OK != rc)
            {
                clHeapFree(*ppData);
                *pDataLen = 0x0;
                CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                               ("Failed to pack/serialize txn-defn[0x%x:0x%x] for ckpt. rc:0x%x",
                                pTxnDefn->serverTxnId.txnMgrNodeAddress, pTxnDefn->serverTxnId.txnId, rc));
                rc = CL_GET_ERROR_CODE(rc);
            }


        }

        rc = clBufferDelete(&txnStateBuf);

    }
    CL_FUNC_EXIT();
    return (rc);
}
/**
 * Internal Function - used to pack/prepare data-set for checkpointing
 * transaction-service
 */
static ClRcT _clTxnServiceCkptAppStatePack(
    CL_IN   ClUint32T   dataSetId,
    CL_OUT  ClAddrT     *ppData,
    CL_OUT  ClUint32T   *pDataLen,
    CL_IN   ClPtrT      cookie)
{
    ClRcT                       rc = CL_OK;
    ClBufferHandleT      txnSrvcStateBuff;

    CL_FUNC_ENTER();
    /* Walk through the list of transactions available in activeTxnMap.
       For each transaction, call clTxnStreamTxnCfgInfoPack()
       For the received message-buffer, append it to the master message-buffer.
    */

    if ( (ppData == NULL) || (pDataLen == NULL) )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Null arguements"));
        CL_FUNC_EXIT();
        return CL_ERR_NULL_POINTER;
    }

    rc = clBufferCreate (&txnSrvcStateBuff);

    if (CL_OK == rc)
    {
        clXdrMarshallClUint32T( &(clTxnServiceCfg->txnIdCounter), txnSrvcStateBuff, 0);

        /* Copy to buffer */
        *pDataLen = 0;
        *ppData = NULL;

        if (CL_OK == rc)
        {
            ClUint32T   ckptDataLen;

            rc = clBufferLengthGet(txnSrvcStateBuff, &ckptDataLen);

            if ( (CL_OK == rc) && ( ckptDataLen != 0) )
            {
                *ppData = (ClAddrT) clHeapAllocate(ckptDataLen);
                *pDataLen = ckptDataLen;
                if ( *ppData != NULL )
                {
                    rc = clBufferNBytesRead(txnSrvcStateBuff,
                                            (ClUint8T *) *ppData, &ckptDataLen);
                    if (CL_OK != rc)
                    {
                        *pDataLen = 0x0;
                        clHeapFree(*ppData);
                        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Failed to create txn-service checkpoint. rc:0x%x", rc));
                        rc = CL_GET_ERROR_CODE(rc);
                    }


                }
                else
                {
                    rc = CL_ERR_NO_MEMORY;
                }
            }
            else
            {
                CL_DEBUG_PRINT(CL_DEBUG_ERROR,
                               ("Error while packing or no data rc:0x%x data-len:0%x", rc, ckptDataLen));
            }
        }

        rc = clBufferDelete(&txnSrvcStateBuff);

    }
    CL_FUNC_EXIT();
    return (rc);
}
ClRcT clEvtCpmReplyCb(ClUint32T data, ClBufferHandleT inMsgHandle,
                      ClBufferHandleT outMsgHandle)
{
    ClUint32T rc = CL_OK;

#if 0
    ClCpmLcmResponseT response = { {0, 0}, 0 };
    ClUint32T msgLength = 0;
    ClCharT logmsg[CL_MAX_NAME_LENGTH] = { 0 };
    ClCharT requesttype[CL_MAX_NAME_LENGTH] = { 0 };

    CL_FUNC_ENTER();
    rc = clBufferLengthGet(inMsgHandle, &msgLength);
    if (msgLength == sizeof(ClCpmLcmResponseT))
    {
        rc = clBufferNBytesRead(inMsgHandle, (ClUint8T *) &response,
                                &msgLength);
        if (rc != CL_OK)
        {
            clOsalPrintf("Unable to read the message. \n");
            goto failure;
        }
    }
    else
    {
        clOsalPrintf("Buffer read failure !\n");
        goto failure;
    }

    printf("Received reply for %s...\n", response.name);

    switch (response.requestType)
    {
    case CL_CPM_HEALTHCHECK:
        strcpy(requesttype, "CL_CPM_HEALTHCHECK");
        break;
    case CL_CPM_TERMINATE:
        strcpy(requesttype, "CL_CPM_TERMINATE");
        break;
    case CL_CPM_PROXIED_INSTANTIATE:
        strcpy(requesttype, "CL_CPM_PROXIED_INSTANTIATE");
        break;
    case CL_CPM_PROXIED_CLEANUP:
        strcpy(requesttype, "CL_CPM_PROXIED_CLEANUP");
        break;
    case CL_CPM_EXTN_HEALTHCHECK:
        strcpy(requesttype, "CL_CPM_EXTN_HEALTHCHECK");
        break;
    case CL_CPM_INSTANTIATE:
        strcpy(requesttype, "CL_CPM_INSTANTIATE");
        break;
    case CL_CPM_CLEANUP:
        strcpy(requesttype, "CL_CPM_CLEANUP");
        break;
    case CL_CPM_RESTART:
        strcpy(requesttype, "CL_CPM_RESTART");
        break;
    default:
        strcpy(requesttype, "Invalid request");
        break;
    }

    sprintf(logmsg, "%s %s request %s.\n", response.name, requesttype,
            response.returnCode == CL_OK ? "success" : "failure");
    printf(logmsg);

    CL_FUNC_EXIT();
    return CL_OK;

failure:
    CL_FUNC_EXIT();
#endif

    printf("Invoked the Callback for CPM API succesfully\n\r\n");

    return rc;
}
static ClRcT
clLogSvrStreamEntryPack(ClUint32T  dsId,
                        ClAddrT    *ppBuffer,
                        ClUint32T  *pBuffSize,
                        ClPtrT     cookie)
{
    ClRcT             rc            = CL_OK;
    ClBufferHandleT   msg           = CL_HANDLE_INVALID_VALUE;
    ClCntNodeHandleT  svrStreamNode = cookie;
    ClLogSvrEoDataT   *pSvrEoEntry  = NULL;

    CL_LOG_DEBUG_TRACE(("Enter"));

    CL_LOG_PARAM_CHK((NULL == ppBuffer), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((NULL == pBuffSize), CL_LOG_RC(CL_ERR_NULL_POINTER));

    rc = clLogSvrEoEntryGet(&pSvrEoEntry, NULL);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogSvrEoEntryGet(): rc[0x %x]\n", rc));
        return rc;
    }
    rc = clBufferCreate(&msg);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        return rc;
    }
    rc = clLogSvrStreamInfoPack(pSvrEoEntry, svrStreamNode, msg);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogSvrStreamInfoPack(): rc[0x %x]", rc));
        clBufferDelete(&msg);
        return rc;
    }
    rc = clBufferLengthGet(msg, pBuffSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet(): rc[0x %x]", rc));
        clBufferDelete(&msg);
        return rc;
    }
    *ppBuffer = (ClAddrT) clHeapCalloc(*pBuffSize, sizeof(ClUint8T));
    if( NULL == *ppBuffer )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc(): rc[0x %x]", rc));
        clBufferDelete(&msg);
        return rc;
    }
    rc = clBufferNBytesRead(msg, (ClUint8T *)*ppBuffer, pBuffSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferNBytesWrite(): rc[0x %x]", rc));
        clHeapFree(*ppBuffer);
        clBufferDelete(&msg);
        return rc;
    }
    CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
static ClRcT
clLogSvrDsIdMapPack(ClUint32T  dsId,
                    ClAddrT    *ppBuffer,
                    ClUint32T  *pBuffSize,
                    ClPtrT      cookie)
{
    ClRcT            rc           = CL_OK;
    ClLogSvrEoDataT  *pSvrEoEntry = (ClLogSvrEoDataT *) cookie;
    ClBufferHandleT  inMsg        = CL_HANDLE_INVALID_VALUE;

    CL_LOG_DEBUG_TRACE(("Enter"));

    CL_LOG_PARAM_CHK((NULL == ppBuffer), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((NULL == pSvrEoEntry), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((CL_LOG_DSID_START != dsId),
                     CL_LOG_RC(CL_ERR_INVALID_PARAMETER));

    rc = clBufferCreate(&inMsg);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        return rc;
    }
    rc = clXdrMarshallClUint32T(&pSvrEoEntry->nextDsId, inMsg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        clBufferDelete(&inMsg);
        return rc;
    }
    rc = clLogBitmapPack(pSvrEoEntry->hDsIdMap, inMsg);
    if( CL_OK != rc )
    {
        clBufferDelete(&inMsg);
        return rc;
    }
    rc = clBufferLengthGet(inMsg, pBuffSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet(): rc[0x %x]", rc));
        clBufferDelete(&inMsg);
        return rc;
    }
    *ppBuffer = (ClAddrT) clHeapCalloc(*pBuffSize, sizeof(ClUint8T));
    if( NULL == *ppBuffer )
    {
        clBufferDelete(&inMsg);
        CL_LOG_DEBUG_ERROR(("clHeapCalloc(): rc[0x %x]", rc));
        return rc;
    }
    rc = clBufferNBytesRead(inMsg,(ClUint8T *) *ppBuffer, pBuffSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferNBytesWrite(): rc[0x %x]", rc));
        clHeapFree(*ppBuffer);
        clBufferDelete(&inMsg);
        return rc;
    }
    CL_LOG_CLEANUP(clBufferDelete(&inMsg), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
static ClRcT
clLogMasterFileEntryPack(ClLogMasterEoDataT  *pMasterEoEntry,
                         ClCntNodeHandleT    hFileNode,
                         ClCkptSectionIdT    *pSecId,
                         ClUint8T            **ppBuffer,
                         ClUint32T           *pBufferLen)
{
    ClBufferHandleT  hFileEntryBuf = CL_HANDLE_INVALID_VALUE;
    ClLogFileKeyT    *pFileKey     = NULL;
    ClLogFileDataT   *pFileData    = NULL;
    ClRcT            rc            = CL_OK;
    ClVersionT       version       = {  CL_RELEASE_VERSION, CL_MAJOR_VERSION, CL_MINOR_VERSION };
    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clCntNodeUserKeyGet(pMasterEoEntry->hMasterFileTable, hFileNode, (ClCntKeyHandleT *) &pFileKey);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntNodeUserKeyGet(): rc[0x %x]", rc));
        return rc;
    }

    rc = clCntNodeUserDataGet(pMasterEoEntry->hMasterFileTable, hFileNode, (ClCntDataHandleT *) &pFileData);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntNodeUserDataGet(): rc[0x %x]", rc));
        return rc;
    }

    rc = clLogMasterFileEntrySecIdGet(pFileKey, pSecId);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogMasterFileEntrySecIdGet(): rc[0x %x]", rc));
        return rc;
    }

    rc = clBufferCreate(&hFileEntryBuf);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        clHeapFree(pSecId->id);
        return rc;
    }
    rc = clXdrMarshallClVersionT(&version, hFileEntryBuf, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClVersionT(): rc[%#x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }

    rc = clLogMasterFileKeyPack(pFileKey, hFileEntryBuf);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogMasterFileKeyPack(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }

    rc = clLogMasterFileDataPack(pFileData, hFileEntryBuf);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogMasterFileDataPack(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }

    rc = clBufferLengthGet(hFileEntryBuf, pBufferLen);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet: rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }

    /* rc = clBufferFlatten(hFileEntryBuf, ppBuffer); */
    *ppBuffer = (ClUint8T*) clHeapCalloc(*pBufferLen, sizeof(ClCharT));
    if( NULL == *ppBuffer )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc()"));
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }
    rc = clBufferNBytesRead(hFileEntryBuf, (ClUint8T *) *ppBuffer, pBufferLen);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferFlatten(): rc[0x %x]", rc));
        clHeapFree(*ppBuffer);
        CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);
        clHeapFree(pSecId->id);
        return rc;
    }
    CL_LOG_CLEANUP(clBufferDelete(&hFileEntryBuf), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
static ClRcT clLogMasterEoEntryCheckpoint(ClLogMasterEoDataT *pMasterEoEntry)
{
    ClRcT            rc          = CL_OK;
    ClBufferHandleT  hEoEntryBuf = CL_HANDLE_INVALID_VALUE;
    ClUint8T         *pBuffer    = NULL;
    ClUint32T        bufferLen   = 0;
    ClVersionT       version     = { CL_RELEASE_VERSION, CL_MAJOR_VERSION, CL_MINOR_VERSION };
    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clBufferCreate(&hEoEntryBuf);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        return rc;
    }

    rc = clXdrMarshallClVersionT(&version, hEoEntryBuf, 0);

    if( CL_OK != rc)
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClVersionT(): rc[%#x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hEoEntryBuf), CL_OK);
        return rc;
    }

    rc = clXdrMarshallClUint16T(&(pMasterEoEntry->nextStreamId),
                                hEoEntryBuf, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint16T(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hEoEntryBuf), CL_OK);
        return rc;
    }

    rc = clBufferLengthGet(hEoEntryBuf, &bufferLen);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet: rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hEoEntryBuf), CL_OK);
        return rc;
    }

    rc = clBufferFlatten(hEoEntryBuf, &pBuffer);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferFlatten(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&hEoEntryBuf), CL_OK);
        return rc;
    }

    rc = clCkptSectionOverwrite(pMasterEoEntry->hCkpt, &gLogMasterDefaultSectionId, pBuffer, bufferLen);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCkptSectionOverwrite(): rc[0x %x]", rc));
    }

    clHeapFree(pBuffer);
    CL_LOG_CLEANUP(clBufferDelete(&hEoEntryBuf), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
ClRcT
clLogSODsIdMapPack(ClUint32T  dsId,
                   ClAddrT    *pBuffer,
                   ClUint32T  *pSize,
                   ClPtrT     cookie)
{
    ClRcT                   rc     = CL_OK;
    ClLogSOEoDataT  *pSoEoEntry = NULL;
    ClBufferHandleT  msg        = 0;

    CL_LOG_DEBUG_TRACE(("Enter"));

    CL_LOG_PARAM_CHK( (CL_LOG_DSID_START != dsId),
            CL_LOG_RC(CL_ERR_INVALID_PARAMETER));
    CL_LOG_PARAM_CHK( (NULL == pBuffer), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK( (NULL == pSize), CL_LOG_RC(CL_ERR_NULL_POINTER));
        
    rc = clLogStreamOwnerEoEntryGet(&pSoEoEntry, NULL);
    if( CL_OK != rc )
    {
        return rc;
    }
    
    rc = clBufferCreate(&msg);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferCreate(): rc[0x %x]", rc));
        return rc;
    }
    rc = clXdrMarshallClUint32T(&pSoEoEntry->dsIdCnt, msg, 0);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint32T(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }
    rc = clLogBitmapPack(pSoEoEntry->hDsIdMap, msg);
    if( CL_OK != rc )
    {
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }    
    rc = clBufferLengthGet(msg, pSize);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferLengthGet(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }
    *pBuffer = (ClAddrT)clHeapCalloc(*pSize, sizeof(ClInt8T));
    if( NULL == *pBuffer )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc()"));
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }    
    rc = clBufferNBytesRead(msg, (ClUint8T *) *pBuffer, pSize); 
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBufferNBytesRead(): rc[0x %x]", rc));
        clHeapFree(*pBuffer);
        CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);
        return rc;
    }
    CL_LOG_CLEANUP(clBufferDelete(&msg), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
Exemple #14
0
ClRcT clRmdParamSanityCheck(ClBufferHandleT inMsgHdl,    /* Input
                                                                 * Message */
                            ClBufferHandleT outMsgHdl,   /* Output
                                                                 * Message */
                            ClUint32T flags,    /* Flags */
                            ClRmdOptionsT *pOptions,    /* Optional Parameters
                                                         * for RMD Call */
                            ClRmdAsyncOptionsT *pAsyncOptions)  /* Optional
                                                                 * Async
                                                                 * Parameters
                                                                 * for RMD Call 
                                                                 */
{
    ClRcT rc;
    ClUint32T size;
    ClUint32T inBufLen = 0;

    CL_FUNC_ENTER();

    rc = clRmdMaxPayloadSizeGet(&size);
    if (rc != CL_OK)
        return rc;
    if (inMsgHdl)
        rc = clBufferLengthGet(inMsgHdl, &inBufLen);
    if (rc != CL_OK)
    {
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
    }
    if (inBufLen > size)
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));

    if (flags &
        ~(CL_RMD_CALL_ASYNC | CL_RMD_CALL_NEED_REPLY | CL_RMD_CALL_ATMOST_ONCE |
          RMD_CALL_MSG_ASYNC | CL_RMD_CALL_DO_NOT_OPTIMIZE |
          CL_RMD_CALL_NON_PERSISTENT | CL_RMD_CALL_IN_SESSION | 
          CL_RMD_CALL_ORDERED
        ))
    {
        RMD_DBG2((" RMD INVALID FLAGS 1\n"));
        CL_FUNC_EXIT();
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
    }

    if (inMsgHdl != 0)
    {
        if (inBufLen == 0)
        {
            RMD_DBG2((" RMD INVALID input buffer len 1 \n"));
            CL_FUNC_EXIT();
            return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
        }
    }

    if (flags & CL_RMD_CALL_ASYNC)
    {
        if (pAsyncOptions == NULL)
        {
            if (flags & CL_RMD_CALL_NEED_REPLY)
            {
                RMD_DBG2((" RMD INVALID Outbuff parametrs  for async 1\n"));
                CL_FUNC_EXIT();
                return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
            }


        }
        else
        {
            if (pAsyncOptions->fpCallback == NULL)
            {
                if (flags & CL_RMD_CALL_NEED_REPLY)
                {
                    RMD_DBG2((" RMD INVALID Outbuff parametrs  for async 2\n"));
                    CL_FUNC_EXIT();
                    return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
                }
            }

        }
    }
    else
    {
        if (pAsyncOptions)
            if (pAsyncOptions->fpCallback || pAsyncOptions->pCookie)
            {
                RMD_DBG2((" RMD INVALID Outbuff parametrs  for sync 1\n"));
                CL_FUNC_EXIT();
                return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
            }


    }

    if (pOptions && (pOptions->retries > _clRmdConfig.maxRetries))
    {
        RMD_DBG2((" RMD INVALID Options retries2\n"));
        CL_FUNC_EXIT();
        return ((CL_RMD_RC(CL_ERR_INVALID_PARAMETER)));
    }

    CL_FUNC_EXIT();
    return CL_OK;
}
int clGmsSendMsg(ClGmsViewMemberT       *memberNodeInfo,
                 ClGmsGroupIdT           groupId, 
                 ClGmsMessageTypeT       msgType,
                 ClGmsMemberEjectReasonT ejectReason,
                 ClUint32T               dataSize,
                 ClPtrT                  dataPtr)
{
    mar_req_header_t        header = {0};
    struct VDECL(req_exec_gms_nodejoin) req_exec_gms_nodejoin = {{0}};
    struct iovec    req_exec_gms_iovec = {0};
    int             result = -1;
    ClRcT           rc = CL_OK;
    ClUint32T       clusterVersion = 0;
    ClBufferHandleT bufferHandle = 0;
    ClUint8T        *message = NULL;
    ClUint32T       length = 0;
    ClPtrT          temp = NULL;

    rc = clNodeCacheMinVersionGet(NULL, &clusterVersion);
    if(clusterVersion >= CL_VERSION_CODE(5, 0, 0) 
       && 
       clAspNativeLeaderElection())
    {
        clLog(DBG, OPN, AIS, 
              "Skipped sending msgtype [%d] since node cache is used to form the cluster view",
              msgType);
        return 0;
    }

    if (rc != CL_OK)
    {
        clLog(ERROR,OPN,AIS,
                "Error while getting version from the version cache. rc 0x%x",rc);

        curVer.releaseCode = CL_RELEASE_VERSION;
        curVer.majorVersion = CL_MAJOR_VERSION;
        curVer.minorVersion = CL_MINOR_VERSION;
    } 
    else 
    {
        curVer.releaseCode = CL_VERSION_RELEASE(clusterVersion);
        curVer.majorVersion = CL_VERSION_MAJOR(clusterVersion);
        curVer.minorVersion = CL_VERSION_MINOR(clusterVersion);
    }

    /* Get the version and send it */
    req_exec_gms_nodejoin.version.releaseCode = curVer.releaseCode;
    req_exec_gms_nodejoin.version.majorVersion = curVer.majorVersion;
    req_exec_gms_nodejoin.version.minorVersion = curVer.minorVersion;

    /* For now we send message without caring about version. Later on
     * we need to change it accordingly */
    
    switch(msgType)
    {
        case CL_GMS_CLUSTER_JOIN_MSG:
        case CL_GMS_CLUSTER_LEAVE_MSG:
        case CL_GMS_CLUSTER_EJECT_MSG:
            clLog(DBG,OPN,AIS,
                    "Sending cluster %s multicast message",
                    msgType == CL_GMS_CLUSTER_JOIN_MSG ? "join":
                    msgType == CL_GMS_CLUSTER_LEAVE_MSG ? "leave" : "eject");
            req_exec_gms_nodejoin.ejectReason = ejectReason;
            memcpy (&req_exec_gms_nodejoin.specificMessage.gmsClusterNode, &memberNodeInfo->clusterMember,
                    sizeof (ClGmsClusterMemberT));
            req_exec_gms_nodejoin.contextHandle = memberNodeInfo->contextHandle;
            break;
        case CL_GMS_GROUP_CREATE_MSG:
        case CL_GMS_GROUP_DESTROY_MSG:
        case CL_GMS_GROUP_JOIN_MSG:
        case CL_GMS_GROUP_LEAVE_MSG:
            clLog(DBG,OPN,AIS,
                    "Sending group %s multicast message",
                    msgType == CL_GMS_GROUP_CREATE_MSG ? "create" : 
                    msgType == CL_GMS_GROUP_DESTROY_MSG ? "destroy" :
                    msgType == CL_GMS_GROUP_JOIN_MSG ? "join" : "leave");
            memcpy (&req_exec_gms_nodejoin.specificMessage.groupMessage.gmsGroupNode, 
                    &memberNodeInfo->groupMember,
                    sizeof (ClGmsGroupMemberT));
            memcpy (&req_exec_gms_nodejoin.specificMessage.groupMessage.groupData, 
                    &memberNodeInfo->groupData,
                    sizeof(ClGmsGroupInfoT));
            req_exec_gms_nodejoin.contextHandle = memberNodeInfo->contextHandle;
            break;
        case CL_GMS_COMP_DEATH:
            clLog(DBG,OPN,AIS,
                    "Sending comp death multicast message");
            memcpy (&req_exec_gms_nodejoin.specificMessage.groupMessage.gmsGroupNode, 
                    &memberNodeInfo->groupMember,
                    sizeof (ClGmsGroupMemberT));
            req_exec_gms_nodejoin.contextHandle = memberNodeInfo->contextHandle;
            break;
        case CL_GMS_LEADER_ELECT_MSG:
            clLog(DBG,OPN,AIS,
                    "Sending leader elect multicast message");
            memcpy (&req_exec_gms_nodejoin.specificMessage.gmsClusterNode, &memberNodeInfo->clusterMember,
                    sizeof (ClGmsClusterMemberT));
            req_exec_gms_nodejoin.contextHandle = memberNodeInfo->contextHandle;
            break;
        case CL_GMS_SYNC_MESSAGE:
            clLog(DBG,OPN,AIS,
                    "Sending gms synch multicast message");
            req_exec_gms_nodejoin.dataPtr = dataPtr;
            break;
        case CL_GMS_GROUP_MCAST_MSG:
            memcpy (&req_exec_gms_nodejoin.specificMessage.mcastMessage.groupInfo.gmsGroupNode, 
                    &memberNodeInfo->groupMember,
                    sizeof (ClGmsGroupMemberT));
            memcpy (&req_exec_gms_nodejoin.specificMessage.mcastMessage.groupInfo.groupData,
                    &memberNodeInfo->groupData,
                    sizeof(ClGmsGroupInfoT));
            req_exec_gms_nodejoin.contextHandle = memberNodeInfo->contextHandle;
            req_exec_gms_nodejoin.specificMessage.mcastMessage.userDataSize = dataSize;
            req_exec_gms_nodejoin.dataPtr = dataPtr;
            break;
        default:
            clLog(DBG,OPN,AIS,
                    "Requested wrong message to be multicasted. Message type %d",
                    msgType);
            return CL_GMS_RC(CL_ERR_INVALID_PARAMETER);
    }

    req_exec_gms_nodejoin.gmsMessageType = msgType;
    req_exec_gms_nodejoin.gmsGroupId = groupId;

    /* Create a buffer handle and marshall the eliments */
    rc = clBufferCreate(&bufferHandle);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to create buffer while sending message on totem. rc 0x%x",rc);
        return rc;
    }

    rc = marshallReqExecGmsNodeJoin(&req_exec_gms_nodejoin,bufferHandle);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to marshall the data while sending message on totem. rc 0x%x",rc);
        goto buffer_delete_return;
    }

    rc = clBufferLengthGet(bufferHandle, &length);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to get buffer length. rc 0x%x",rc);
        goto buffer_delete_return;
    }

    rc = clBufferFlatten(bufferHandle, &message);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "clBufferFlatten failed with rc 0x%x",rc);
        goto buffer_delete_return;
    }

    header.id = SERVICE_ID_MAKE (GMS_SERVICE, MESSAGE_REQ_EXEC_GMS_NODEJOIN);
    header.size = length + sizeof(mar_req_header_t);

    /* We need to prepend the total message length in the beginning of the
     * message so that we can find the length while unmarshalling */
    temp = clHeapAllocate(header.size);
    if (temp == NULL)
    {
        clLogError(OPN,AIS, 
                "Failed to allocate memory while sending the message");
        goto buffer_delete_return;
    }

    memcpy(temp,&header, sizeof(mar_req_header_t));
    memcpy(temp+sizeof(mar_req_header_t), message, length);

    req_exec_gms_iovec.iov_base = temp;
    req_exec_gms_iovec.iov_len = length + sizeof(mar_req_header_t);

    result = totempg_groups_mcast_joined (openais_group_handle, &req_exec_gms_iovec, 1, TOTEMPG_AGREED);

    clLog(DBG,OPN,AIS,
            "Done with sending multicast message of type %d",msgType);

buffer_delete_return:
    if (message != NULL)
        clHeapFree(message);

    if (temp != NULL)
        clHeapFree(temp);

    clBufferDelete(&bufferHandle);
    return result;
}
static int gms_nodejoin_send (void)
{
    /* For now this function sends only latest version. It needs to be 
     * modified in future when version changes */
    /* Send the join message with given version */
    mar_req_header_t                    header = {0};
	struct VDECL(req_exec_gms_nodejoin) req_exec_gms_nodejoin;
	struct iovec                 req_exec_gms_iovec;
    ClGmsClusterMemberT          thisGmsClusterNode;
	int                          result;
    ClRcT                        rc = CL_OK;
    ClUint32T                    clusterVersion;
    ClBufferHandleT bufferHandle = 0;
    ClUint8T        *message = NULL;
    ClPtrT          temp = NULL;
    ClUint32T       length = 0;

    rc = clNodeCacheMinVersionGet(NULL, &clusterVersion);
    if (rc != CL_OK)
    {
        clLog(ERROR,OPN,AIS,
                "Error while getting version from the version cache. rc 0x%x",rc);

        curVer.releaseCode = CL_RELEASE_VERSION;
        curVer.majorVersion = CL_MAJOR_VERSION;
        curVer.minorVersion = CL_MINOR_VERSION;
    } else {
        curVer.releaseCode = CL_VERSION_RELEASE(clusterVersion);
        curVer.majorVersion = CL_VERSION_MAJOR(clusterVersion);
        curVer.minorVersion = CL_VERSION_MINOR(clusterVersion);
    }

    clLog(DBG,OPN,AIS,
            "This node is sending join message for version %d, %d, %d",
            curVer.releaseCode, curVer.majorVersion, curVer.minorVersion);
    /* Get the version and send it */
    req_exec_gms_nodejoin.version.releaseCode = curVer.releaseCode;
    req_exec_gms_nodejoin.version.majorVersion = curVer.majorVersion;
    req_exec_gms_nodejoin.version.minorVersion = curVer.minorVersion;

    _clGmsGetThisNodeInfo(&thisGmsClusterNode);

    // node join is send for default cluster group - 0
    req_exec_gms_nodejoin.gmsGroupId     = 0;
    memcpy (&req_exec_gms_nodejoin.specificMessage.gmsClusterNode, &thisGmsClusterNode, sizeof (ClGmsClusterMemberT));
    req_exec_gms_nodejoin.gmsMessageType = CL_GMS_CLUSTER_JOIN_MSG; 

    /* Create a buffer handle and marshall the elements */
    rc = clBufferCreate(&bufferHandle);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to create buffer while sending message on totem. rc 0x%x",rc);
        return rc;
    }

    rc = marshallReqExecGmsNodeJoin(&req_exec_gms_nodejoin,bufferHandle);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to marshall the data while sending message on totem. rc 0x%x",rc);
        goto buffer_delete_return;
    }

    rc = clBufferLengthGet(bufferHandle, &length);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "Failed to get buffer length. rc 0x%x",rc);
        goto buffer_delete_return;
    }

    rc = clBufferFlatten(bufferHandle, &message);
    if (rc != CL_OK)
    {
        clLogError(OPN,AIS,
                "clBufferFlatten failed with rc 0x%x",rc);
        goto buffer_delete_return;
    }

    /* We need to prepend the total message length in the beginning of the
     * message so that we can find the length while unmarshalling */
    temp = clHeapAllocate(length + sizeof(mar_req_header_t));
    if (temp == NULL)
    {
        clLogError(OPN,AIS, 
                "Failed to allocate memory while sending the message");
        goto buffer_delete_return;
    }

	header.id = SERVICE_ID_MAKE (GMS_SERVICE, MESSAGE_REQ_EXEC_GMS_NODEJOIN);
    header.size = length + sizeof(mar_req_header_t);

    memcpy(temp,&header,sizeof(mar_req_header_t));
    memcpy(temp+sizeof(mar_req_header_t), message, length);

    req_exec_gms_iovec.iov_base = temp;
    req_exec_gms_iovec.iov_len = length + sizeof(mar_req_header_t);

    clLog(DBG,OPN,AIS,
            "Sending node join from this node in sync_process");
    result = totempg_groups_mcast_joined (openais_group_handle, &req_exec_gms_iovec, 1, TOTEMPG_AGREED);

buffer_delete_return:
    if (message != NULL)
        clHeapFree(message);
    if (temp != NULL)
        clHeapFree(temp);
    clBufferDelete(&bufferHandle);
    return result;
}