Ejemplo n.º 1
0
hrt_vaddress sh_css_refcount_alloc(
	int32_t id, const size_t size, const uint16_t attribute)
{
	hrt_vaddress ptr;
	struct sh_css_refcount_entry *entry = NULL;
	uint32_t i;

	assert(size > 0);
	assert(id != FREE_BUF_CACHE);

	for (i = 0; i < myrefcount.size; i++) {
		entry = &myrefcount.items[i];
		if ((entry->id == FREE_BUF_CACHE) && (entry->size == size)) {
			entry->id = id;
			assert(entry->count == 0);
			entry->count = 1;
			assert(entry->data != mmgr_NULL);
			if (attribute & MMGR_ATTRIBUTE_CLEARED)
				mmgr_clear(entry->data, size);
			sh_css_dtrace(SH_DBG_TRACE_PRIVATE,
				"sh_css_refcount_alloc(%x) 0x%x "
				"reused from cache, refcnt %d\n",
				id, entry->data, entry->count);

			return entry->data;
		}
	}

	ptr = mmgr_alloc_attr(size, attribute);
	assert(ptr != mmgr_NULL);

	/* This address should not exist in the administration yet */
	assert(!find_entry(ptr));
	entry = find_free_entry(ptr);

	assert(entry != NULL);
	if (entry == NULL)
		return mmgr_NULL;
	assert(entry->data == mmgr_NULL);
	

	entry->id = id;
	entry->data = ptr;
	entry->size = size;
	entry->count = 1;

	sh_css_dtrace(SH_DBG_TRACE_PRIVATE,
		"sh_css_refcount_alloc(%x) 0x%x "
		"new alloc refcnt %d\n",
		id, ptr, entry->count);


	return ptr;
}
static enum ia_css_err frame_allocate_buffer_data(struct ia_css_frame *frame)
{
	frame->data = mmgr_alloc_attr(frame->data_bytes,
				      frame->contiguous ?
				      MMGR_ATTRIBUTE_CONTIGUOUS :
				      MMGR_ATTRIBUTE_DEFAULT);

	if (frame->data == mmgr_NULL)
		return IA_CSS_ERR_CANNOT_ALLOCATE_MEMORY;
	return IA_CSS_SUCCESS;
}
hrt_vaddress
mmgr_calloc(const size_t N, const size_t size)
{
	return mmgr_alloc_attr(size * N, MMGR_ATTRIBUTE_CLEARED);
}
hrt_vaddress
mmgr_malloc(const size_t size)
{
	return mmgr_alloc_attr(size, 0);
}