void *fss_map_prepare_dbd(struct fss_file *file, void *process, uoffset file_pos) { ssize_t ret; struct dbd *which; void *db_addr = NULL; unsigned long block_id; struct dbmr *map; block_id = file_pos / FSS_CACHE_DB_SIZE; which = fss_dbd_get(file, block_id); if (unlikely(!which)) goto end; ret = fss_dbd_make_valid(file, which); if(ret < 0) goto end; map = km_valloc(sizeof(struct dbmr)); if (map == NULL) goto end; map->process = process; map->base = 0; db_addr = which->buffer/*base*/ + file_pos % FSS_CACHE_DB_SIZE; ke_spin_lock(&which->map_lock); list_add_tail(&map->list ,&which->map_list); ke_spin_unlock(&which->map_lock); end: if (which) fss_dbd_put(which); return db_addr; }
static void *input_register_handle(void *drv_input_handle) { struct ddk_input_handle *handle = km_valloc(sizeof(*handle)); if (!handle) return NULL; handle->drv_handle = drv_input_handle; handle->event = input_event; return handle; }
/** @brief DB cache初始化 */ bool fss_db_init(void) { int i = 0; struct dbd *dbd_prev = NULL; cache_desc()->cache_size = FSS_CACHE_SIZE; cache_desc()->db_count = cache_desc()->cache_size / FSS_CACHE_DB_SIZE; /* The db virtual memory */ #ifdef _MSC_VER cache_desc()->db_cache = (char*)malloc(cache_desc()->cache_size); #else cache_desc()->db_cache = km_alloc_virtual(cache_desc()->cache_size, KM_PROT_READ | KM_PROT_WRITE); printf("fss_db_cache = %x", cache_desc()->db_cache); #endif if (cache_desc()->db_cache == NULL) goto err1; /* 分配DB栈 */ #ifdef _MSC_VER cache_desc()->db_stack = (unsigned long *)malloc(cache_desc()->db_count * sizeof(unsigned long)); #else cache_desc()->db_stack = (unsigned long *)km_valloc(cache_desc()->db_count * sizeof(unsigned long)); printf(", fss_db_stack = %x.\n", cache_desc()->db_stack); #endif if (cache_desc()->db_stack == NULL) goto err2; /* DB节点入栈 */ for (i = 0; i < cache_desc()->db_count; i++) cache_desc()->db_stack[i] = (unsigned long)cache_desc()->db_cache + (i * FSS_CACHE_DB_SIZE); cache_desc()->db_stack_top = cache_desc()->db_count - 1; /* 分配DBD */ #ifdef _MSC_VER cache_desc()->dbd_cache = (struct dbd*)malloc((cache_desc()->db_count) * sizeof(struct dbd)); #else cache_desc()->dbd_cache = (struct dbd*)km_valloc((cache_desc()->db_count) * sizeof(struct dbd)); #endif if (cache_desc()->dbd_cache == NULL) goto err3; /* DBD节点入栈 */ dbd_prev = NULL; for (i = 0; i < (cache_desc()->db_count); i++) { cache_desc()->dbd_stack_top = &(cache_desc()->dbd_cache[i]); cache_desc()->dbd_stack_top->buffer = NULL; cache_desc()->dbd_stack_top->list.prev = (void*)dbd_prev; dbd_prev = cache_desc()->dbd_stack_top; } ke_spin_init(&cache_desc()->db_stack_lock); ke_spin_init(&cache_desc()->dbd_stack_lock); ke_spin_init(&cache_desc()->dirty_list_lock); INIT_LIST_HEAD(&cache_desc()->sort_list); INIT_LIST_HEAD(&cache_desc()->dirty_list); ke_spin_init(&cache_desc()->sort_lock); //TODO: //Write back thread return true; err3: km_vfree(cache_desc()->db_stack); err2: km_dealloc_virtual(cache_desc()->db_cache); cache_desc()->db_count = 0; err1: return false; }
static void * handle_space_alloc(size_t size) { void * p = km_valloc(size); allocated_size += size; return p; }