ClRcT clLogClntStreamDataCleanup(ClLogClntStreamDataT *pData) { ClRcT rc = CL_OK; CL_LOG_DEBUG_TRACE(("Enter")); rc = clBitmapDestroy(pData->hStreamBitmap); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clBitmapDestroy(): rc[0x %x]", rc)); } #ifdef VXWORKS_BUILD clLogClientStreamMutexDestroy(pData); clLogClientStreamFlusherMutexDestroy(pData); #endif rc = clOsalMunmap_L(pData->pStreamHeader, pData->pStreamHeader->shmSize); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalMunmap(): rc[0x %x]", rc)); } clHeapFree(pData->shmName.pValue); CL_LOG_DEBUG_TRACE(("Exit")); return rc; }
ClRcT clLogClntStreamEntryAdd(ClCntHandleT hClntTable, ClLogStreamKeyT *pStreamKey, ClStringT *pShmName, ClUint32T shmSize, ClCntNodeHandleT *phStreamNode) { ClRcT rc = CL_OK; ClLogClntStreamDataT *pStreamData = NULL; #ifndef NO_SAF ClInt32T fd = 0; ClUint32T headerSize = 0; ClInt32T tries = 0; struct stat statbuf; #endif CL_LOG_DEBUG_TRACE(("Enter")); pStreamData = (ClLogClntStreamDataT*) clHeapCalloc(1, sizeof(ClLogClntStreamDataT)); if( pStreamData == NULL ) { CL_LOG_DEBUG_ERROR(("clHeapCalloc()")); return CL_LOG_RC(CL_ERR_NO_MEMORY); } pStreamData->shmName.pValue = (ClCharT*) clHeapCalloc(pShmName->length, sizeof(ClCharT)); if( NULL == pStreamData->shmName.pValue ) { CL_LOG_DEBUG_ERROR(("clHeapCalloc()")); clHeapFree(pStreamData); return CL_LOG_RC(CL_ERR_NO_MEMORY); } memcpy(pStreamData->shmName.pValue, pShmName->pValue, pShmName->length); CL_LOG_DEBUG_VERBOSE(("Opening Shared Memory Segment: %s", pStreamData->shmName.pValue)); #ifndef NO_SAF rc = clOsalShmOpen_L(pStreamData->shmName.pValue, CL_LOG_SHM_OPEN_FLAGS, CL_LOG_SHM_MODE, &fd); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalShmOpen(): rc[0x %x]", rc)); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } /* * Check to be safe w.r.t SIGBUS in case a parallel ftruncate from log server is in progress */ memset(&statbuf, 0, sizeof(statbuf)); while(tries++ < 3 && !fstat(fd, &statbuf)) { if((ClUint32T) statbuf.st_size < shmSize) { sleep(1); } else break; } if(!statbuf.st_size) { CL_LOG_DEBUG_ERROR(("fstat on shared segment with size 0")); CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return CL_LOG_RC(CL_ERR_LIBRARY); } rc = clOsalMmap_L(NULL, shmSize, CL_LOG_MMAP_PROT_FLAGS, CL_LOG_MMAP_FLAGS, fd, 0, (void **) &pStreamData->pStreamHeader); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalMmap(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); CL_LOG_DEBUG_VERBOSE(("Mmapped Shared Memory Segment")); pStreamData->pStreamHeader->shmSize = shmSize; headerSize = CL_LOG_HEADER_SIZE_GET(pStreamData->pStreamHeader->maxMsgs, pStreamData->pStreamHeader->maxComps); pStreamData->pStreamRecords = ((ClUint8T *) (pStreamData->pStreamHeader)) + headerSize; CL_LOG_DEBUG_VERBOSE(("pStreamHeader : %p", (void *) pStreamData->pStreamHeader)); CL_LOG_DEBUG_VERBOSE(("msgMap: %p", (void *) (pStreamData->pStreamHeader + 1))); CL_LOG_DEBUG_VERBOSE(("pStreamRecords: %p", pStreamData->pStreamRecords)); #endif rc = clBitmapCreate(&(pStreamData->hStreamBitmap), 0); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clBitmapCreate(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } /* * Create the shared lock for the sem. */ rc = clLogClientStreamSharedMutexInit(pStreamData, pShmName); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalProcessSharedMutexInit(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clBitmapDestroy(pStreamData->hStreamBitmap), CL_OK); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } rc = clCntNodeAddAndNodeGet(hClntTable,(ClCntKeyHandleT) pStreamKey, (ClCntDataHandleT) pStreamData, NULL, phStreamNode); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clCntNodeAddAndNodeGet(): rc[0x %x]", rc)); CL_LOG_CLEANUP(clBitmapDestroy(pStreamData->hStreamBitmap), CL_OK); CL_LOG_CLEANUP(clLogClientStreamMutexDestroy(pStreamData), CL_OK); CL_LOG_CLEANUP(clOsalMunmap_L(pStreamData->pStreamHeader, shmSize), CL_OK); clHeapFree(pStreamData->shmName.pValue); clHeapFree(pStreamData); pStreamData = NULL; return rc; } CL_LOG_DEBUG_TRACE(("Exit")); return rc; }
/* shmNameCreate(); map the shared memory; populate the Flusher data; clLogSvrFlusherThreadCreateNStart(); populate flusher.taskId */ static ClRcT clLogSvrShmOpenNFlusherCreate(ClLogSvrEoDataT *pSvrEoEntry, SaNameT *pStreamName, SaNameT *pStreamNodeName, ClStringT *pFileName, ClStringT *pFileLocation, ClCntNodeHandleT hSvrStreamNode, ClUint32T dsId) { ClRcT rc = CL_OK; ClInt32T fd = 0; ClLogStreamHeaderT *pStreamHeader = NULL; ClLogSvrStreamDataT *pSvrStreamData = NULL; ClUint32T headerSize = 0; ClLogSvrCommonEoDataT *pSvrCommonEoEntry = NULL; CL_LOG_DEBUG_TRACE(("Enter")); rc = clLogSvrEoEntryGet(NULL, &pSvrCommonEoEntry); if( CL_OK != rc ) { return rc; } rc = clCntNodeUserDataGet(pSvrEoEntry->hSvrStreamTable, hSvrStreamNode, (ClCntDataHandleT *) &pSvrStreamData); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clCntDataForNodeGet(): rc[0x %x]\n", rc)); return rc; } if(pFileLocation->pValue) pSvrStreamData->fileOwnerAddr = clLogFileOwnerAddressFetch(pFileLocation); else pSvrStreamData->fileOwnerAddr = CL_IOC_RESERVED_ADDRESS; memcpy(&pSvrStreamData->fileName, pFileName, sizeof(pSvrStreamData->fileName)); memcpy(&pSvrStreamData->fileLocation, pFileLocation, sizeof(pSvrStreamData->fileLocation)); rc = clLogShmNameCreate(pStreamName, pStreamNodeName, &(pSvrStreamData->shmName)); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clLogSvrShmNameCreate(): rc[0x %x]\n", rc)); return rc; } rc = clOsalShmOpen_L(pSvrStreamData->shmName.pValue, CL_LOG_SHM_CREATE_FLAGS, CL_LOG_SHM_MODE, &fd); if( CL_OK != rc ) { CL_LOG_DEBUG_ERROR(("clOsalShmOpen(): rc[0x %x]\n", rc)); CL_LOG_CLEANUP(clLogSvrShmNameDelete(&pSvrStreamData->shmName), CL_OK); return rc; } rc = clLogSvrShmMapAndGet(fd,(ClUint8T **) &pStreamHeader); if( CL_OK != rc ) { CL_LOG_CLEANUP(clOsalShmClose_L(fd), CL_OK); CL_LOG_CLEANUP(clLogSvrShmNameDelete(&pSvrStreamData->shmName), CL_OK); return rc; } pSvrStreamData->pStreamHeader = pStreamHeader; rc = clOsalShmClose_L(fd); if( CL_OK != rc ) { CL_LOG_CLEANUP(clOsalMunmap_L((ClPtrT) pStreamHeader, pStreamHeader->shmSize), CL_OK); pSvrStreamData->pStreamHeader = NULL; CL_LOG_CLEANUP(clLogSvrShmNameDelete(&pSvrStreamData->shmName), CL_OK); return rc; } #if 0 /* * FIXME- by this time, logMaster wont be availble, so postponing this call * to some time */ rc = clLogSvrStreamCurrentFilterGet(hSvrStreamNode, pStreamName, pStreamNodeName, pStreamHeader); if( CL_OK != rc ) { CL_LOG_CLEANUP(clOsalMunmap_L((ClPtrT) pStreamHeader, pStreamHeader->shmSize), CL_OK); CL_LOG_CLEANUP(clOsalShmUnlink_L(pSvrStreamData->shmName.pValue), CL_OK); CL_LOG_CLEANUP(clLogSvrShmNameDelete(&pSvrStreamData->shmName), CL_OK); return rc; } #endif pSvrStreamData->dsId = dsId; /* * streamHeader |--------------------| * | | * | | * maxMsgs|--------------------| * maxComps|--------------------| * pStreamRecords|--------------------| * | | * |--------------------| */ headerSize = CL_LOG_HEADER_SIZE_GET(pSvrCommonEoEntry->maxMsgs, pSvrCommonEoEntry->maxComponents); pSvrStreamData->pStreamRecords = ((ClUint8T *) (pSvrStreamData->pStreamHeader)) + headerSize; rc = clOsalTaskCreateAttached(pSvrStreamData->shmName.pValue, CL_OSAL_SCHED_OTHER, CL_OSAL_THREAD_PRI_NOT_APPLICABLE, CL_OSAL_MIN_STACK_SIZE, clLogFlusherStart, pSvrStreamData, &pSvrStreamData->flusherId); if( CL_OK != rc ) { CL_LOG_CLEANUP(clOsalMunmap_L((ClPtrT) pStreamHeader, pStreamHeader->shmSize), CL_OK); pSvrStreamData->pStreamHeader = NULL; CL_LOG_CLEANUP(clLogSvrShmNameDelete(&pSvrStreamData->shmName), CL_OK); return rc; } CL_LOG_DEBUG_TRACE(("Exit")); return rc; }