ClRcT
clBitmapBuffer2BitmapGet(ClUint32T        listLen, 
                         ClUint8T         *pPositionList,
                         ClBitmapHandleT  *phBitmap)
{
    ClRcT      rc      = CL_OK;
    ClUint32T  nBits   = 0;
    ClUint32T  bitNum  = 0;
    ClUint32T  bitIdx  = 0;
    ClUint32T  byteIdx = 0;

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Enter"));

    if( (NULL == pPositionList) || (NULL == phBitmap) )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Null pointer"));
        return CL_BITMAP_RC(CL_ERR_NULL_POINTER);
    }

    nBits = listLen * CL_BM_BITS_IN_BYTE;
    rc = clBitmapCreate(phBitmap, nBits);
    if( CL_OK != rc )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapCreate(): rc[0x %x]", rc));
        return rc;
    }
    
    for(bitNum = 0; bitNum < nBits; bitNum++)
    {
       byteIdx = bitNum / CL_BM_BITS_IN_BYTE;
       bitIdx  = bitNum % CL_BM_BITS_IN_BYTE;
       if( (*(pPositionList + byteIdx)) & (0x1 << bitIdx) )
       {
           rc = clBitmapBitSet(*phBitmap, bitNum);
           if( CL_OK != rc )
           {
               ClRcT rc2 = CL_OK;
               CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapBitSet(): rc[0x %x]",
                           rc));
               if( (rc2 = clBitmapDestroy(*phBitmap) ) != CL_OK )
               {
                   CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapDestroy(): rc[%#x]",
                                                   rc2));
               }
               return rc;
           }
       }
    }

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Exit"));
    return rc;
}
ClRcT
clLogStreamOwnerCkptDsIdGet(ClLogSOEoDataT  *pSoEoEntry, 
                            ClUint32T       *pDsId)
{
    ClRcT             rc         = CL_OK;
    ClLogSvrCommonEoDataT  *pCommonEoData = NULL;
    ClUint32T              dsId           = 0;

    CL_LOG_DEBUG_TRACE(("Enter"));
    
    rc = clLogStreamOwnerEoEntryGet(NULL, &pCommonEoData);
    if( CL_OK != rc )
    {
        return rc;
    }    

    dsId = pSoEoEntry->dsIdCnt;
    dsId++;
    rc = clBitmapBitSet(pSoEoEntry->hDsIdMap, dsId);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBitmapBitSet(): rc[0x %x]", rc));
        return rc;
    }    
    rc = clCkptLibraryCkptDataSetCreate(pCommonEoData->hLibCkpt, 
                                        (SaNameT *) &gSOLocalCkptName,
                                        dsId, 0, 0, 
                                        clLogStreamOwnerEntrySerialiser,
                                        clLogSOStreamEntryRecreate);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCkptLibraryCkptDataSetCreate(): rc[0x %x]",
                    rc));
        CL_LOG_CLEANUP(clBitmapBitClear(pSoEoEntry->hDsIdMap, dsId), CL_OK);
        return rc;
    }    
    pSoEoEntry->dsIdCnt = dsId;
    *pDsId = dsId;

    CL_LOG_CLEANUP(clCkptLibraryCkptDataSetWrite(pCommonEoData->hLibCkpt, 
                                       (SaNameT *) &gSOLocalCkptName,
                                       CL_LOG_SO_DSID_START,
                                       pSoEoEntry), CL_OK);

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}    
ClRcT
clLogInitHandleBitmapFileAdd(ClLogHandleT      hLog, 
                             ClLogFileHandleT  hFileHdlr)
{
    ClRcT                  rc            = CL_OK;
    ClLogInitHandleDataT  *pData         = NULL;
    ClLogClntEoDataT      *pClntEoEntry  = NULL;

    CL_LOG_DEBUG_TRACE(("Enter"));
        
    rc = clLogClntEoEntryGet(&pClntEoEntry);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clLogClntEoEntryGet(): rc[0x %x]", rc));
        return rc;
    }

    rc = clHandleCheckout(pClntEoEntry->hClntHandleDB, hLog,
                          (void **) (&pData)); 
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clHandleCheckout(): rc[0x %x]\n", rc));
        return rc;
    }

    rc = clBitmapBitSet(pData->hFileBitmap, hFileHdlr);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBitmapBitSet(): rc[0x %x]", rc));
        CL_LOG_CLEANUP(clHandleCheckin(pClntEoEntry->hClntHandleDB, hLog),
                       CL_OK);
        return rc;
    }

    rc = clHandleCheckin(pClntEoEntry->hClntHandleDB, hLog); 
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clHandleCheckin(): rc[0x %x]", rc));
        return rc;
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
ClRcT
clBitmapPositionList2BitmapGet(ClUint32T        listLen, 
                               ClUint32T        *pPositionList,
                               ClBitmapHandleT  *phBitmap)
{
    ClRcT      rc      = CL_OK;
    ClUint32T  bitNum  = 0;
    ClUint32T  length  = 0;

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Enter"));

    if( (NULL == pPositionList) || (NULL == phBitmap) )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Null pointer"));
        return CL_BITMAP_RC(CL_ERR_NULL_POINTER);
    }
    length = pPositionList[listLen - 1];
    rc = clBitmapCreate(phBitmap, length);
    if( CL_OK != rc )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapCreate(): rc[0x %x]", rc));
        return rc;
    }
    
    for(bitNum = 0; bitNum < listLen; bitNum++)
    {
           rc = clBitmapBitSet(*phBitmap, pPositionList[bitNum]);
           if( CL_OK != rc )
           {
               ClRcT rc2 = CL_OK;
               CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapBitSet(): rc[0x %x]",
                           rc));
               if( (rc2 = clBitmapDestroy(*phBitmap) ) != CL_OK)
               {
                   CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapDestroy(): rc[%#x]",
                                                   rc2));
               }
               return rc;
           }
    }

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Exit"));
    return rc;
}
static ClRcT
clLogCkptDsIdGet(ClLogSvrEoDataT  *pSvrEoEntry,
                 ClUint32T        *pDsId)
{
    ClRcT   rc = CL_OK;

    CL_LOG_DEBUG_TRACE(("Enter"));

    pSvrEoEntry->nextDsId++;
    *pDsId = pSvrEoEntry->nextDsId;
    rc = clBitmapBitSet(pSvrEoEntry->hDsIdMap, *pDsId);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clBitmapBitSet(): rc[0x %x]", rc));
        pSvrEoEntry->nextDsId--;
        return rc;
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return CL_OK;
}
ClRcT
clBitmapBufferBitsCopy(ClUint32T        listLen, 
                       ClUint8T         *pPositionList,
                       ClBitmapHandleT  hBitmap)
{
    ClRcT      rc      = CL_OK;
    ClUint32T  nBits   = 0;
    ClUint32T  bitNum  = 0;
    ClUint32T  bitIdx  = 0;
    ClUint32T  byteIdx = 0;

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Enter"));

    if( NULL == pPositionList )
    {
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("Null pointer"));
        return CL_BITMAP_RC(CL_ERR_NULL_POINTER);
    }

    nBits = listLen * CL_BM_BITS_IN_BYTE;
    for(bitNum = 0; bitNum < nBits; bitNum++)
    {
       byteIdx = bitNum / CL_BM_BITS_IN_BYTE;
       bitIdx  = bitNum % CL_BM_BITS_IN_BYTE;
       if( (*(pPositionList + byteIdx)) & (0x1 << bitIdx) )
       {
           rc = clBitmapBitSet(hBitmap, bitNum);
           if( CL_OK != rc )
           {
               CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("clBitmapBitSet(): rc[0x %x]",
                           rc));
               return rc;
           }
       }
    }

    CL_DEBUG_PRINT(CL_DEBUG_TRACE, ("Exit"));
    return rc;
}
ClRcT
clLogDsIdMapUnpack(ClBufferHandleT  msg,
                   ClLogSOEoDataT   *pSoEoEntry)
{
    ClRcT                   rc     = CL_OK;
    ClUint32T  count = 0;
    ClUint32T  dsId  = 0;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clXdrUnmarshallClUint32T(msg, &pSoEoEntry->dsIdCnt);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrUnmarshallClUint32T(): rc[0x %x]",
                    rc));
        return rc;
    }
    for( count = 2; count < pSoEoEntry->dsIdCnt ; count++)
    {
        rc = clXdrUnmarshallClUint32T(msg, &dsId);
        if( CL_OK != rc )
        {
            CL_LOG_DEBUG_ERROR(("clXdrUnmarshallClUint32T(): rc[0x %x]",
                        rc));
            return rc;
        }
        rc = clBitmapBitSet(pSoEoEntry->hDsIdMap, dsId);
        if( CL_OK != rc )
        {
            CL_LOG_DEBUG_ERROR(("clBitmapBitSet(): rc[0x %x]", rc));
            return rc;
    }
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
ClRcT
clLogClntStreamOpen(ClLogHandleT        hLog,
                    SaNameT             *pStreamName,
                    SaNameT             *pNodeName,
                    ClStringT           *pShmName,
                    ClUint32T           shmSize,
                    ClLogStreamHandleT  *phStream,
                    ClUint32T           recSize)
{
    ClRcT                 rc              = CL_OK;
    ClLogClntEoDataT      *pClntEoEntry   = NULL;
    ClBoolT               addedTable      = CL_FALSE;
    ClBoolT               addedEntry      = CL_FALSE;
    ClCntNodeHandleT      hClntStreamNode = CL_HANDLE_INVALID_VALUE;
    ClLogClntStreamDataT  *pUserData      = NULL;

    CL_LOG_DEBUG_TRACE(("Enter"));

    CL_LOG_PARAM_CHK((NULL == pStreamName), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((NULL == pNodeName), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((NULL == pShmName), CL_LOG_RC(CL_ERR_NULL_POINTER));
    CL_LOG_PARAM_CHK((sizeof(ClLogStreamHeaderT) > shmSize),
                      CL_LOG_RC(CL_ERR_INVALID_PARAMETER));
    CL_LOG_PARAM_CHK((NULL == phStream), CL_LOG_RC(CL_ERR_NULL_POINTER));

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

    rc = clOsalMutexLock_L(&(pClntEoEntry->clntStreamTblLock));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clOsalMutexLock(): rc[0x %x]", rc));
        return rc;
    }

    if( CL_HANDLE_INVALID_VALUE == pClntEoEntry->hClntStreamTable )
    {
        rc = clCntHashtblCreate(pClntEoEntry->maxStreams,
                                clLogStreamKeyCompare,
                                clLogStreamHashFn,
                                clLogClntStreamDeleteCb,
                                clLogClntStreamDeleteCb,
                                CL_CNT_UNIQUE_KEY,
                                &(pClntEoEntry->hClntStreamTable));
        if( CL_OK != rc )
        {
            CL_LOG_DEBUG_ERROR(("clCntHashtblCreate(): rc[0x %x]", rc));
            CL_LOG_CLEANUP(
                clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),CL_OK);
            return rc;
        }
        addedTable = CL_TRUE;
        CL_LOG_DEBUG_VERBOSE(("Created the HashTable"));
    }

    rc = clLogClntStreamEntryGet(pClntEoEntry, pStreamName, pNodeName,
                                 pShmName, shmSize, &hClntStreamNode,
                                 &addedEntry);
    if( CL_OK != rc)
    {
        if( CL_TRUE == addedTable )
        {
            CL_LOG_CLEANUP(clCntDelete(pClntEoEntry->hClntStreamTable), CL_OK);
        }
        CL_LOG_CLEANUP(clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),
                       CL_OK);
        return rc;
    }
    CL_LOG_DEBUG_VERBOSE(("Got the stream entry"));

    rc = clLogHandleStreamHandleCreate(hLog, hClntStreamNode, phStream);
    if( CL_OK != rc)
    {
        if( CL_TRUE == addedEntry )
        {
            CL_LOG_CLEANUP(clCntNodeDelete(pClntEoEntry->hClntStreamTable,
                                           hClntStreamNode), CL_OK);
        }
        if( CL_TRUE == addedTable )
        {
            CL_LOG_CLEANUP(clCntDelete(pClntEoEntry->hClntStreamTable), CL_OK);
        }
        CL_LOG_CLEANUP(clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),
                       CL_OK);
        return rc;
    }
    CL_LOG_DEBUG_VERBOSE(("Created the streamhandle"));

    rc = clCntNodeUserDataGet(pClntEoEntry->hClntStreamTable, hClntStreamNode,
                              (ClCntDataHandleT *) &pUserData);
    if( CL_OK != rc )
    {
        CL_LOG_CLEANUP(clHandleDestroy(pClntEoEntry->hClntHandleDB,
                                             *phStream), CL_OK);
        *phStream = CL_HANDLE_INVALID_VALUE;
        if( CL_TRUE == addedEntry )
        {
            CL_LOG_CLEANUP(clCntNodeDelete(pClntEoEntry->hClntStreamTable,
                                           hClntStreamNode), CL_OK);
        }

        if( CL_TRUE == addedTable )
        {
            CL_LOG_CLEANUP(clCntDelete(pClntEoEntry->hClntStreamTable), CL_OK);
        }
        CL_LOG_CLEANUP(clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),
                       CL_OK);
        return rc;
    }
#ifdef NO_SAF
    pUserData->recSize=recSize;
#endif
    CL_LOG_DEBUG_VERBOSE(("Got stream entry"));
    rc = clBitmapBitSet(pUserData->hStreamBitmap, CL_HDL_IDX(*phStream));
    if( CL_OK != rc )
    {
        CL_LOG_CLEANUP(clHandleDestroy(pClntEoEntry->hClntHandleDB, *phStream),
                       CL_OK);
        *phStream = CL_HANDLE_INVALID_VALUE;
        if( CL_TRUE == addedEntry )
        {
            CL_LOG_CLEANUP(clCntNodeDelete(pClntEoEntry->hClntStreamTable,
                                           hClntStreamNode), CL_OK);
        }

        if( CL_TRUE == addedTable )
        {
            CL_LOG_CLEANUP(clCntDelete(pClntEoEntry->hClntStreamTable), CL_OK);
        }
        CL_LOG_CLEANUP(clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),
                       CL_OK);
        return rc;
    }
    CL_LOG_DEBUG_VERBOSE(("Updated stream bitmap"));

    rc = clLogHandleInitHandleStreamAdd(hLog, *phStream);
    if( CL_OK != rc )
    {
        CL_LOG_CLEANUP(clBitmapBitClear(pUserData->hStreamBitmap, CL_HDL_IDX(*phStream)),
                       CL_OK);
        CL_LOG_CLEANUP(clHandleDestroy(pClntEoEntry->hClntHandleDB, *phStream),
                       CL_OK);
        *phStream = CL_HANDLE_INVALID_VALUE;
        if( CL_TRUE == addedEntry )
        {
            CL_LOG_CLEANUP(clCntNodeDelete(pClntEoEntry->hClntStreamTable,
                                           hClntStreamNode), CL_OK);
        }

        if( CL_TRUE == addedTable )
        {
            CL_LOG_CLEANUP(clCntDelete(pClntEoEntry->hClntStreamTable), CL_OK);
        }
        CL_LOG_CLEANUP(clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock)),
                       CL_OK);
        return rc;
    }
    CL_LOG_DEBUG_VERBOSE(("Updated init handle"));

    rc = clOsalMutexUnlock_L(&(pClntEoEntry->clntStreamTblLock));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clOsalMutexUnlock(): rc[0x %x]", rc));
        return rc;
    }

    CL_LOG_DEBUG_TRACE(("Exit"));
    return rc;
}
static ClRcT
clLogMasterStreamTableRecreate(ClLogSvrCommonEoDataT  *pCommonEoEntry,
                               ClBufferHandleT        hFileEntryBuf,
                               ClLogFileDataT         *pFileData)
{
    ClRcT                   rc              = CL_OK;
    ClLogStreamKeyT         streamKey       = {{0}};
    ClLogStreamKeyT         *pStreamKey     = NULL;
    ClLogMasterStreamDataT  *pStreamData    = NULL;
    ClCntNodeHandleT        hStreamNode     = CL_HANDLE_INVALID_VALUE;
    ClUint32T               bitNum          = 0;
    ClLogMasterEoDataT      *pMasterEoEntry = NULL;

    CL_LOG_DEBUG_TRACE(("Enter"));

    rc = clLogMasterEoEntryGet(&pMasterEoEntry, &pCommonEoEntry);
    if( CL_OK != rc )
    {
        return rc;
    }

    rc = clXdrUnmarshallSaNameT(hFileEntryBuf, &(streamKey.streamName));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }

    rc = clXdrUnmarshallSaNameT(hFileEntryBuf, &(streamKey.streamScopeNode));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallSaNameT(): rc[0x %x]", rc));
        return rc;
    }

    rc = clLogStreamKeyCreate(&streamKey.streamName, &streamKey.streamScopeNode,
                              pCommonEoEntry->maxStreams, &pStreamKey);
    if( CL_OK != rc )
    {
        return rc;
    }

    pStreamData = (ClLogMasterStreamDataT*) clHeapCalloc(1, sizeof(ClLogMasterStreamDataT));
    if( NULL == pStreamData )
    {
        CL_LOG_DEBUG_ERROR(("clHeapCalloc()"));
        clLogStreamKeyDestroy(pStreamKey);
        return rc;
    }

    rc = clXdrUnmarshallClUint64T(hFileEntryBuf, &(pStreamData->streamMcastAddr));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint64T(): rc[0x %x]", rc));
        clHeapFree(pStreamData);
        clLogStreamKeyDestroy(pStreamKey);
        return rc;
    }

    rc = clXdrUnmarshallClUint16T(hFileEntryBuf, &(pStreamData->streamId));
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clXdrMarshallClUint16T(): rc[0x %x]", rc));
        clHeapFree(pStreamData);
        clLogStreamKeyDestroy(pStreamKey);
        return rc;
    }

    rc = clCntNodeAddAndNodeGet(pFileData->hStreamTable,
                                (ClCntKeyHandleT) pStreamKey,
                                (ClCntDataHandleT) pStreamData,
                                NULL, &hStreamNode);
    if( CL_OK != rc )
    {
        CL_LOG_DEBUG_ERROR(("clCntNodeAdd(): rc[0x %x]", rc));
        clHeapFree(pStreamData);
        clLogStreamKeyDestroy(pStreamKey);
        return rc;
    }
    /* Find out the partiuclar stream is still valid */
    if( strncmp(gStreamScopeGlobal, (const ClCharT *)pStreamKey->streamScopeNode.value,
                pStreamKey->streamScopeNode.length)
            &&
            CL_FALSE == clLogMasterStreamIsValid(&pStreamKey->streamScopeNode))
    {
        /*
         * marking this as invalid by assigining CL_IOC_RESERVED_ADDRESS
         * so that streamMcastAddr will not be allocated & bit will not be set
         * numActive streams count also will be valid
         */
        pStreamData->streamMcastAddr = CL_IOC_RESERVED_ADDRESS;
        clLogNotice(CL_LOG_AREA_FILE_OWNER, CL_LOG_CTX_FO_INIT,
                    "Invalidating the stream [%.*s:%.*s]",
                    pStreamKey->streamScopeNode.length, pStreamKey->streamScopeNode.value,
                    pStreamKey->streamName.length, pStreamKey->streamName.value);
    }
    if( CL_IOC_RESERVED_ADDRESS != pStreamData->streamMcastAddr )
    {
        bitNum = pStreamData->streamMcastAddr - pMasterEoEntry->startMcastAddr;
        CL_LOG_DEBUG_TRACE(("bitNUm: %d  pStreamData->streamMcastAddr : %lld \n", bitNum,
                            pStreamData->streamMcastAddr));
        rc = clBitmapBitSet(pMasterEoEntry->hAllocedAddrMap, bitNum);
        if( CL_OK != rc )
        {
            CL_LOG_DEBUG_ERROR(("clBitmapBitClear()"));
            CL_LOG_CLEANUP(clCntNodeDelete(pFileData->hStreamTable, hStreamNode), CL_OK);
        }
        pFileData->nActiveStreams++;
        clLogInfo(CL_LOG_AREA_MASTER, CL_LOG_CTX_CKPT_READ,
                  "Active stream [%.*s:%.*s] has been added",
                  pStreamKey->streamScopeNode.length, pStreamKey->streamScopeNode.value,
                  pStreamKey->streamName.length, pStreamKey->streamName.value);
    }
    CL_LOG_DEBUG_TRACE(("Exit"));
    return CL_OK;
}