示例#1
0
文件: map.c 项目: 304471720/GridOS
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;
	
}
示例#2
0
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;
}
示例#3
0
文件: block.c 项目: hxhlb/GridOS
/**
	@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;
}
示例#4
0
文件: handle.c 项目: goumuli/GridOS
static void * handle_space_alloc(size_t size)
{
	void * p = km_valloc(size);
	allocated_size += size;
	return p;
}