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; }
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; }