Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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);
	}
}