ClRcT clCpmNodeNameGet(ClUint32T argc, ClCharT *argv[], ClCharT **retStr)
{
    ClRcT rc = CL_OK;
    ClNameT nodeName={0};
    *retStr = NULL;
    if(argc > 1 )
    {
        ClCharT tempStr[0x100];
        rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER);
        snprintf(tempStr, sizeof(tempStr),
                 "Usage: nodename\n");
        *retStr = (ClCharT *) clHeapAllocate(strlen(tempStr) + 1);
        if (*retStr)
            strcpy(*retStr, tempStr);
        goto out;
    }
    rc = clCpmLocalNodeNameGet(&nodeName);
    if(rc != CL_OK)
    {
        rc = CL_CPM_RC(CL_ERR_UNSPECIFIED);
        goto out;
    }
    *retStr = clHeapCalloc(1,nodeName.length+1);
    if(!*retStr)
    {
        rc = CL_CPM_RC(CL_ERR_NO_MEMORY);
        goto out;
    }
    strncpy(*retStr,nodeName.value,nodeName.length);
    rc = CL_OK;

    out:
    return rc;
}
ClRcT clNodeCacheInitialize(ClBoolT createFlag)
{
    ClRcT rc = CL_OK;
    ClUint32T capability = 0;
    SaNameT nodeName = {0};

    if(gpClNodeCache)
        goto out;

    gClAspNativeLeaderElection = !clParseEnvBoolean("CL_ASP_OPENAIS_LEADER_ELECTION");

    snprintf(gClNodeCacheSegment, sizeof(gClNodeCacheSegment)-1,
             "%s_%d", CL_NODE_CACHE_SEGMENT, clIocLocalAddressGet());

    if(createFlag == CL_TRUE)
    {
        rc = clNodeCacheCreate();
    }
    else
    {
        rc = clNodeCacheOpen();
    }
    
    if(rc != CL_OK)
    {
        clLogError("NODE", "CACHE", "Segment initialize returned [%#x]", rc);
        goto out;
    }

    CL_ASSERT(gpClNodeCache != NULL);

    if(!createFlag)
    {
        goto out;
    }

    CL_NODE_CACHE_HEADER_BASE(gpClNodeCache)->maxNodes = CL_IOC_MAX_NODES;
    CL_NODE_CACHE_HEADER_BASE(gpClNodeCache)->currentNodes = 0;
    memset(CL_NODE_CACHE_HEADER_BASE(gpClNodeCache)->nodeMap, 0, 
           sizeof(CL_NODE_CACHE_HEADER_BASE(gpClNodeCache)->nodeMap));

    if(clCpmIsSC())
    {
        CL_NODE_CACHE_SC_CAPABILITY_SET(capability);
        CL_NODE_CACHE_SC_PROMOTE_CAPABILITY_SET(capability);
    }
    else if(clCpmIsSCCapable())
    {
        CL_NODE_CACHE_SC_PROMOTE_CAPABILITY_SET(capability);
        CL_NODE_CACHE_PL_CAPABILITY_SET(capability);
    }
    else
    {
        CL_NODE_CACHE_PL_CAPABILITY_SET(capability);
    }
    
    clCpmLocalNodeNameGet(&nodeName);

    clNodeCacheUpdate(clIocLocalAddressGet(),CL_VERSION_CURRENT, capability, &nodeName);

    rc = clOsalMsync(gpClNodeCache, CL_NODE_CACHE_SEGMENT_SIZE, MS_ASYNC);
    if(rc != CL_OK)
    {
        clLogError("NODE", "CACHE", "Node cache segment msync returned [%#x]", rc);
        goto out;
    }

    gClNodeCacheOwner = CL_TRUE;

    out:
    return rc;
}