static size_t MV_SHM_Base_Malloc(shm_device_t *shm_dev, size_t Size,
				size_t Alignment, int mem_type)
{
	size_t Offset;

	if ((shm_dev == NULL) || (Size == 0)
		|| (Alignment % 2)) {
		shm_error("kernel MV_SHM_Base_Malloc parameters error"
			"shm_dev[%p] size[%08x] align[%0x] mem_type[%d]\n",
			shm_dev, Size, Alignment, mem_type);
		return ERROR_SHM_MALLOC_FAILED;
	}

	if (shm_check_alignment(Alignment) != 0) {
		shm_error("kernel MV_SHM_Base_Malloc Alignment parameter"
			" error. align[%x]\n", Alignment);
		return ERROR_SHM_MALLOC_FAILED;
	}

	shm_round_size(Size);
	shm_round_alignment(Alignment);

	Offset = shm_device_allocate(shm_dev,
			Size, Alignment, mem_type);
	if (Offset == ERROR_SHM_MALLOC_FAILED) {

		shm_error("kernel MV_SHM_Base_Malloc malloc shm fail "
			"shm_dev[%p] size[%08x] align[%0x] mem_type[%d]\n",
			shm_dev, Size, Alignment, mem_type);
		return ERROR_SHM_MALLOC_FAILED;
	}

	return Offset;
}
Example #2
0
static size_t MV_SHM_Malloc_Base(shm_dev_t *shm_dev,
			size_t Size, size_t Alignment)
{
	HRESULT res;
	shm_driver_operation_t op;
	int i = 50;

	if ((SHM_DEVICE_LOAD_COUNT <= 0) || (Size == 0) ||
		(Alignment % 2)) {
		MV_SHM_Print("user space MV_SHM_Malloc_Base shm device not open"
			" or parameter error. open[%d] size[%08x] align[%x] "
			"mem_type[%d]\n", SHM_DEVICE_LOAD_COUNT, Size, Alignment,
			shm_dev->mem_type);
		return ERROR_SHM_MALLOC_FAILED;
	}

	if (shm_check_alignment(Alignment) != S_OK) {
		MV_SHM_Print("user space MV_SHM_Malloc_Base parameter error. "
			"size[%08x] align[%x] mem_type[%d]\n", Size,
			Alignment, shm_dev->mem_type);
		return ERROR_SHM_MALLOC_FAILED;

	}

	shm_round_size(Size);
	shm_round_alignment(Alignment);

	while (i) {
		op.m_param1 = Size;
		op.m_param2 = Alignment;
		op.m_param3 = 0;
		res = ioctl( shm_dev->base.m_fd,
			SHM_DEVICE_CMD_ALLOCATE, &op);

		if (-1 == res || ERROR_SHM_MALLOC_FAILED == op.m_param1) {
			if (op.m_param3 == 1) {
				MV_SHM_Print("user space %s no task to be kill for"
					" alloc shm, so fail\n", __FUNCTION__);
				break;
			}
			if (0 == i) {
				MV_SHM_Print("user space %s line %d:trying 10 times"
					" to alloc shm but fail\n", __FUNCTION__,
					__LINE__);
				break;
			} else {
				usleep(100000);
				MV_SHM_Print("user space %s line %d:fail to allocte"
					" shm, re-try again:%d\n", __FUNCTION__,
					__LINE__, i);
				i--;
				continue;
			}
		} else
		    break;
	}

	if (op.m_param1 == ERROR_SHM_MALLOC_FAILED) {
		MV_SHM_Print("user space MV_SHM_Malloc_Base malloc shm fail\n");
		return ERROR_SHM_MALLOC_FAILED;
	}

	return op.m_param1;
}