ClRcT clCachedCkptClientInitialize(ClCachedCkptClientSvcInfoT *serviceInfo, const SaNameT *ckptName, ClUint32T cachSize) { ClRcT rc = CL_OK; ClUint32T shmSize = clCachedCkptShmSizeGet(cachSize); ClCharT cacheName[CL_MAX_NAME_LENGTH]; serviceInfo->cachSize = shmSize; snprintf(cacheName, sizeof(cacheName), "%s_%d", ckptName->value, gIocLocalBladeAddress); rc = clOsalSemIdGet((ClUint8T*)cacheName, &serviceInfo->cacheSem); if( CL_OK != rc ) { clLogError("CCK", "INIT_CLIENT", "Failed to get SemId. error code [0x%x].", rc); goto out_1; } rc = clOsalShmOpen(cacheName , CL_CACHED_CKPT_SHM_OPEN_FLAGS, CL_CACHED_CKPT_SHM_MODE, &serviceInfo->fd); if( CL_OK != rc ) { clLogError("CCK", "INIT_CLIENT", "Failed to open shared memory for cached checkpoint. error code [0x%x].", rc); goto out_1; } rc = clOsalMmap(0, shmSize, CL_CACHED_CKPT_MMAP_PROT_FLAGS, CL_CACHED_CKPT_MMAP_FLAGS, serviceInfo->fd, 0, (void **) &serviceInfo->cache); if( CL_OK != rc ) { clLogError("CCK", "INIT_CLIENT", "Failed to map shared memory. error code [0x%x].", rc); goto out_2; } return rc; out_2: clOsalShmClose(&serviceInfo->fd); out_1: return rc; }
static ClRcT clNodeCacheOpen(void) { ClRcT rc = CL_OK; ClFdT fd; clLogDebug("NODE", "CACHE", "Opening existing node cache segment [%s]", gClNodeCacheSegment); rc = clOsalShmOpen(gClNodeCacheSegment, O_RDWR, 0666, &fd); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache [%s] segment open returned [%#x]", gClNodeCacheSegment, rc); goto out; } rc = clOsalMmap(0, CL_NODE_CACHE_SEGMENT_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0, (ClPtrT*)&gpClNodeCache); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache segment mmap returned [%#x]", rc); close((ClInt32T)fd); goto out; } gClNodeCacheFd = fd; rc = clOsalSemIdGet((ClUint8T*)gClNodeCacheSegment, &gClNodeCacheSem); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache semid get returned [%#x]", rc); close((ClInt32T)fd); } out: return rc; }
ClRcT clCpmCompGet(ClUint32T argc, ClCharT *argv[], ClCharT **retStr) { ClRcT rc = CL_OK; ClNameT compName = { 0 }; ClIocAddressT compAddress; ClUint32T compId = 0; ClCharT buffer[2048] = "\0"; ClUint32T length = 0; ClIocNodeAddressT nodeAddress; if (!strcasecmp("compAddressGet", argv[0])) { if (argc != THREE_ARGUMENT) { sprintf(buffer, "%s", "Usage: compAddressGet <CompName> <nodeIocAddress>\n" "\tcompName[STRING] - component Name\n" "\tnodeIocAddress[DEC] - node ioc Address, where the component exist\n"); rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER); goto done; } strcpy(compName.value, argv[1]); compName.length = strlen(argv[1]); nodeAddress = (ClIocNodeAddressT) cpmCliStrToInt(argv[2]); rc = clCpmComponentAddressGet(nodeAddress, &compName, &compAddress); if (rc == CL_OK) sprintf(buffer, "Address %d Port %x\n", compAddress.iocPhyAddress.nodeAddress, compAddress.iocPhyAddress.portId); else sprintf(buffer, "Failed get component Address, rc = 0x%x", rc); } else if (!strcasecmp("compIdGet", argv[0])) { if (argc != TWO_ARGUMENT) { sprintf(buffer, "%s", "Usage: compIdGet <CompName> \n" "\tcompName[STRING] - component Name\n"); rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER); goto done; } strcpy(compName.value, argv[1]); compName.length = strlen(argv[1]); rc = clCpmComponentIdGet(0, &compName, &compId); if (rc == CL_OK) sprintf(buffer, "compId is %d\n", compId); else sprintf(buffer, "Failed get component Id, rc = 0x%x", rc); } else if (!strcasecmp("compPIDGet", argv[0])) { if (argc != TWO_ARGUMENT) { sprintf(buffer, "%s", "Usage: compPidGet <CompName> \n" "\tcompName[STRING] - component Name\n"); rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER); goto done; } strcpy(compName.value, argv[1]); compName.length = strlen(argv[1]); rc = clCpmComponentPIDGet(&compName, &compId); if (rc == CL_OK) sprintf(buffer, "compPId is %d\n", compId); else sprintf(buffer, "Failed get component PID, rc = 0x%x", rc); } else if (!strcasecmp("compTraceGet", argv[0])) { ClPtrT ppOutMem = NULL; ClUint32T segmentSize = 0; ClFdT fd = 0; #ifndef POSIX_BUILD ClCharT compShmSegment[CL_MAX_NAME_LENGTH]; segmentSize = getpagesize(); if (argc != TWO_ARGUMENT) { sprintf(buffer, "%s", "Usage: compTraceGet <CompName> \n" "\tcompName[STRING] - component Name \n"); rc = CL_CPM_RC(CL_ERR_INVALID_PARAMETER); goto done; } strcpy(compName.value, argv[1]); snprintf(compShmSegment, sizeof(compShmSegment), "/CL_%s_exception_%d", compName.value, clIocLocalAddressGet()); rc = clOsalShmOpen(compShmSegment, O_RDONLY, 0777, &fd); if(rc == CL_OK) { rc = clOsalMmap(0, segmentSize, PROT_READ, MAP_PRIVATE, fd, 0, &ppOutMem); } #endif if (ppOutMem) { sprintf(buffer, "%s\n", (ClCharT*)ppOutMem); clOsalMunmap(ppOutMem, segmentSize); close(fd); } else sprintf(buffer, "%s\n", "Unable to get the component Stack Trace"); } done: length = strlen(buffer) + 1; *retStr = (ClCharT *) clHeapAllocate(length); if (*retStr != NULL) strcpy(*retStr, buffer); else rc = CL_CPM_RC(CL_ERR_NO_MEMORY); return rc; }
/** * INIT: The below function initializes the checkpoint service client * and opens a checkpoint to store data. */ ClRcT clCachedCkptInitialize(ClCachedCkptSvcInfoT *serviceInfo, const SaNameT *ckptName, const SaCkptCheckpointCreationAttributesT *ckptAttributes, SaCkptCheckpointOpenFlagsT openFlags, ClUint32T cachSize) { ClRcT rc = CL_OK; SaCkptHandleT ckptSvcHandle = 0; SaCkptCheckpointHandleT ckptHandle = 0; SaVersionT ckptVersion = {'B', 0x01, 0x01}; ClTimerTimeOutT delay = { 0, 500}; ClInt32T tries = 0; ClCharT cacheName[CL_MAX_NAME_LENGTH]; ClUint32T shmSize = clCachedCkptShmSizeGet(cachSize); ClUint32T *numberOfSections; ClUint32T *sizeOfCache; serviceInfo->cachSize = shmSize; if(serviceInfo->ckptHandle != CL_HANDLE_INVALID_VALUE) { clLogWarning("CCK", "INI", "Checkpoint already initialized. Skipping initialization"); return CL_ERR_ALREADY_EXIST; } snprintf(cacheName, sizeof(cacheName), "%s_%d", ckptName->value, gIocLocalBladeAddress); rc = clOsalSemCreate((ClUint8T*)cacheName, 1, &serviceInfo->cacheSem); if(rc != CL_OK) { ClOsalSemIdT semId = 0; if(clOsalSemIdGet((ClUint8T*)cacheName, &semId) != CL_OK) { clLogError("CCK", "INI", "cache semaphore creation error while fetching semaphore id"); goto out1; } if(clOsalSemDelete(semId) != CL_OK) { clLogError("CCK", "INI", "cache semaphore creation error while deleting old semaphore id"); goto out1; } rc = clOsalSemCreate((ClUint8T*)cacheName, 1, &serviceInfo->cacheSem); } if(ckptAttributes || openFlags) { if(serviceInfo->ckptSvcHandle == CL_HANDLE_INVALID_VALUE) { /* Initialize checkpoint service instance */ do { rc = clCkptInitialize(&ckptSvcHandle, NULL, (ClVersionT *)&ckptVersion); } while(rc != CL_OK && tries++ < 100 && clOsalTaskDelay(delay) == CL_OK); if(rc != CL_OK) { clLogError("CCK", "INI", "Failed to initialize checkpoint service instance. error code [0x%x].", rc); goto out2; } serviceInfo->ckptSvcHandle = ckptSvcHandle; } /* Create the checkpoint for read and write. */ do { rc = clCkptCheckpointOpen(serviceInfo->ckptSvcHandle, (SaNameT *)ckptName, (ClCkptCheckpointCreationAttributesT *)ckptAttributes, openFlags, 0L, &ckptHandle); } while(rc != CL_OK && tries++ < 100 && clOsalTaskDelay(delay) == CL_OK); if(rc != CL_OK) { clLogError("CCK", "INI", "Failed to open checkpoint. error code [0x%x].", rc); goto out3; } serviceInfo->ckptHandle = ckptHandle; } /* Create shm */ rc = clOsalShmOpen((ClCharT *)cacheName, CL_CACHED_CKPT_SHM_EXCL_CREATE_FLAGS, CL_CACHED_CKPT_SHM_MODE, &serviceInfo->fd); if( CL_ERR_ALREADY_EXIST == CL_GET_ERROR_CODE(rc) ) { rc = clOsalShmOpen((ClCharT *)cacheName, CL_CACHED_CKPT_SHM_OPEN_FLAGS, CL_CACHED_CKPT_SHM_MODE, &serviceInfo->fd); if( CL_OK != rc ) { clLogError("CCK", "INI", "Could not open shared memory."); goto out4; } } rc = clOsalFtruncate(serviceInfo->fd, shmSize); if( CL_OK != rc ) { clLogError("CCK", "INI", "clOsalFtruncate(): error code [0x%x].", rc); goto out5; } rc = clOsalMmap(0, shmSize, CL_CACHED_CKPT_MMAP_PROT_FLAGS, CL_CACHED_CKPT_MMAP_FLAGS, serviceInfo->fd, 0, (void **) &serviceInfo->cache); if( CL_OK != rc ) { clLogError("CCK", "INI", "clOsalMmap(): error code [0x%x].", rc); goto out5; } numberOfSections = (ClUint32T *)(serviceInfo->cache); sizeOfCache = (ClUint32T *)(numberOfSections + 1); *numberOfSections = 0; *sizeOfCache = 0; clOsalMsync(serviceInfo->cache, shmSize, MS_SYNC); goto out1; out5: clOsalShmClose(&serviceInfo->fd); out4: if(serviceInfo->ckptHandle) { clCkptCheckpointClose(serviceInfo->ckptHandle); serviceInfo->ckptHandle = CL_HANDLE_INVALID_VALUE; } out3: if(serviceInfo->ckptSvcHandle) { clCkptFinalize(serviceInfo->ckptSvcHandle); serviceInfo->ckptSvcHandle = CL_HANDLE_INVALID_VALUE; } out2: clOsalSemDelete(serviceInfo->cacheSem); out1: return rc; }
static ClRcT clNodeCacheCreate(void) { ClRcT rc = CL_OK; ClFdT fd; clLogDebug("NODE", "CACHE", "Creating/initializing node cache segment [%s]", gClNodeCacheSegment); clOsalShmUnlink(gClNodeCacheSegment); rc = clOsalShmOpen(gClNodeCacheSegment, O_RDWR | O_CREAT | O_EXCL, 0666, &fd); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache shm open of segment [%s] returned [%#x]", gClNodeCacheSegment, rc); goto out; } rc = clOsalFtruncate(fd, CL_NODE_CACHE_SEGMENT_SIZE); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache segment truncate of size [%d] returned [%#x]", (ClUint32T) CL_NODE_CACHE_SEGMENT_SIZE, rc); goto out_unlink; } rc = clOsalMmap(0, CL_NODE_CACHE_SEGMENT_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0, (ClPtrT*)&gpClNodeCache); if(rc != CL_OK) { clLogError("NODE", "CACHE", "Node cache segment mmap returned [%#x]", rc); goto out_unlink; } gClNodeCacheFd = fd; rc = clOsalSemCreate((ClUint8T*)gClNodeCacheSegment, 1, &gClNodeCacheSem); if(rc != CL_OK) { ClOsalSemIdT semId = 0; if(clOsalSemIdGet((ClUint8T*)gClNodeCacheSegment, &semId) != CL_OK) { clLogError("NODE", "CACHE", "Node cache segment sem creation error while fetching sem id"); goto out_unlink; } if(clOsalSemDelete(semId) != CL_OK) { clLogError("NODE", "CACHE", "Node cache segment sem creation error while deleting old sem id"); goto out_unlink; } rc = clOsalSemCreate((ClUint8T*)gClNodeCacheSegment, 1, &gClNodeCacheSem); } return rc; out_unlink: clOsalShmUnlink(gClNodeCacheSegment); close((ClInt32T)fd); out: return rc; }