int32_t RingBuf_Write(ring_buffer_t* pRB, const uint8_t* data, uint32_t dataBytes) { uint32_t writeToEnd, bytesToCopy; INIT_CRITICAL(); ENTER_CRITICAL(); /* Calculate the maximum amount we can copy */ writeToEnd = pRB->size - pRB->wNdx; bytesToCopy = MIN(dataBytes, pRB->size - pRB->cnt); if (bytesToCopy != 0) { /* Copy as much as we can until we fall off the end of the buffer */ memcpy(&pRB->pBuf[pRB->wNdx], data, MIN(bytesToCopy, writeToEnd)); /* Check if we have more to copy to the front of the buffer */ if (writeToEnd < bytesToCopy) { memcpy(pRB->pBuf, data + writeToEnd, bytesToCopy - writeToEnd); } /* Update the wNdx */ pRB->wNdx = (pRB->wNdx + bytesToCopy) % pRB->size; pRB->cnt += dataBytes; } LEAVE_CRITICAL(); return bytesToCopy; }
int32_t RingBuf_Free(ring_buffer_t* pRB, uint32_t bytesToFree) { INIT_CRITICAL(); ENTER_CRITICAL(); pRB->rNdx = (pRB->rNdx + bytesToFree) % pRB->size; pRB->cnt -= bytesToFree; LEAVE_CRITICAL(); return bytesToFree; }
int32_t RingBuf_Write1Byte(ring_buffer_t* pRB, const uint8_t *pcData) { uint32_t ret = 0; INIT_CRITICAL(); ENTER_CRITICAL(); if (pRB->cnt < pRB->size) { pRB->pBuf[pRB->wNdx] = pcData[0]; pRB->wNdx = (pRB->wNdx + 1) % pRB->size; pRB->cnt++; ret = 1; } LEAVE_CRITICAL(); return ret; }
int32_t RingBuf_Read1Byte(ring_buffer_t* pRB, uint8_t *pData) { uint32_t ret = 0; INIT_CRITICAL(); ENTER_CRITICAL(); if (pRB->cnt != 0) { pData[0] = pRB->pBuf[pRB->rNdx]; pRB->rNdx = (pRB->rNdx + 1) % pRB->size; pRB->cnt--; ret = 1; } LEAVE_CRITICAL(); return ret; }
int32_t _prvRingBuf_Read(ring_buffer_t* pRB, uint8_t* data, uint32_t dataBytes, uint32_t isToFree) { uint32_t readToEnd, bytesToCopy; INIT_CRITICAL(); ENTER_CRITICAL(); readToEnd = pRB->size - pRB->rNdx; bytesToCopy = MIN(dataBytes, pRB->cnt); if (bytesToCopy != 0) { memcpy(data, &pRB->pBuf[pRB->rNdx], MIN(bytesToCopy, readToEnd)); if (readToEnd < bytesToCopy) memcpy(data + readToEnd, &pRB->pBuf[0], bytesToCopy - readToEnd); if (isToFree) { pRB->rNdx = (pRB->rNdx + bytesToCopy) % pRB->size; pRB->cnt -= bytesToCopy; } } LEAVE_CRITICAL(); return bytesToCopy; }
void __attribute__((constructor)) __ibprof_init(void) { IBPROF_ERROR status = IBPROF_ERR_NONE; ibprof_dump_file = (FILE *)stderr; /* check if it has been activated */ if (!ibprof_obj) { IBPROF_OBJECT *temp_ibprof_obj = NULL; IBPROF_MODULE_OBJECT *temp_module_obj = NULL; int i = 0; /* allocate memory for basis object */ temp_ibprof_obj = (IBPROF_OBJECT *) sys_malloc(sizeof(IBPROF_OBJECT)); if (!temp_ibprof_obj) { status = IBPROF_ERR_NO_MEMORY; IBPROF_FATAL("%s : error=%d - Can't allocate memory\n", __FUNCTION__, status); } /* get/proc environment variables */ if (status == IBPROF_ERR_NONE) { status = __get_env(); } /* initialize available modules */ if (status == IBPROF_ERR_NONE) { temp_ibprof_obj->module_array = __ibprof_modules; i = 0; temp_module_obj = temp_ibprof_obj->module_array[0]; while (!status && temp_module_obj) { if (temp_module_obj->id != IBPROF_MODULE_INVALID) { if (temp_module_obj->init) { status = temp_module_obj->init(temp_module_obj); /* Mark module as invalid in case all or some * symbols can not be resolved */ if (status == IBPROF_ERR_NOT_EXIST || status == IBPROF_ERR_UNSUPPORTED) { IBPROF_WARN("Can't resolve symbols from %s module\n", temp_module_obj->name); temp_module_obj->id = IBPROF_MODULE_INVALID; status = IBPROF_ERR_NONE; } } } temp_module_obj = temp_ibprof_obj->module_array[++i]; } } /* initialize hash object */ if (status == IBPROF_ERR_NONE) { temp_ibprof_obj->hash_obj = ibprof_hash_create(); if (!temp_ibprof_obj->hash_obj) { status = IBPROF_ERR_INCORRECT; IBPROF_FATAL("%s : error=%d - Can't create hash object\n", __FUNCTION__, status); } } /* initialize task object */ if (status == IBPROF_ERR_NONE) { temp_ibprof_obj->task_obj = ibprof_task_create(); if (!temp_ibprof_obj->task_obj) { status = IBPROF_ERR_INCORRECT; IBPROF_FATAL("%s : error=%d - Can't create hash object\n", __FUNCTION__, status); } } if (status == IBPROF_ERR_NONE) { INIT_CRITICAL(&(temp_ibprof_obj->lock)); ENTER_CRITICAL(&(temp_ibprof_obj->lock)); ibprof_obj = temp_ibprof_obj; LEAVE_CRITICAL(&(ibprof_obj->lock)); } if (status != IBPROF_ERR_NONE) { if (temp_ibprof_obj) { if (temp_ibprof_obj->module_array) { IBPROF_MODULE_OBJECT *temp_module_obj = NULL; int i = 0; temp_module_obj = temp_ibprof_obj->module_array[0]; while (temp_module_obj) { if (temp_module_obj->id != IBPROF_MODULE_INVALID) { if (temp_module_obj->exit) status = temp_module_obj->exit(temp_module_obj); } temp_module_obj = temp_ibprof_obj->module_array[++i]; } } if (temp_ibprof_obj->hash_obj) ibprof_hash_destroy(temp_ibprof_obj->hash_obj); if (temp_ibprof_obj->task_obj) ibprof_task_destroy(temp_ibprof_obj->task_obj); sys_free(temp_ibprof_obj); } } } if (status != IBPROF_ERR_NONE) { IBPROF_FATAL("%s : error=%d - Can't load %s\n", __FUNCTION__, status, __MODULE_NAME); exit(EXIT_FAILURE); } }