Beispiel #1
0
/**
	@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;
}
Beispiel #2
0
/**
	@brief Thread synchronizing operation
 
	@return kt_sync_wait_result
*/
static int thread_sync_ops(struct sysreq_thread_sync *req)
{
	int i;
	int ops = req->ops;

	switch(ops)
	{
		/* 等待同步对象 */
		case SYSREQ_THREAD_SYNC_WAIT_OBJS:
		{
			int count = req->detail.wait_objs.count;
			struct kt_sync_base *sync_objs[Y_SYNC_MAX_OBJS_COUNT];
			y_handle sync_handles[Y_SYNC_MAX_OBJS_COUNT];
			kt_sync_wait_result ret = KE_WAIT_ERROR;
			
			if (count > Y_SYNC_MAX_OBJS_COUNT)
				goto wait_end;
			
			for (i = 0; i < count; i++)
			{
				sync_handles[i] =(ke_handle)req->detail.wait_objs.sync_objects[i];
				sync_objs[i] = ke_handle_translate(sync_handles[i]);
				if (!sync_objs[i])
					goto unwind_translate;
			}
			ret = kt_wait_objects(kt_current(), count, sync_objs,
							req->detail.wait_objs.wait_all,
							req->detail.wait_objs.timeout, NULL);

unwind_translate:
			for (i = 0; i < count; i++)
			{
				if (sync_objs[i])
					ke_handle_put(sync_handles[i], sync_objs[i]);
			}
wait_end:
			return ret;
		}
		case SYSREQ_THREAD_SYNC_WAIT_MS:
		{
			TODO("");
			break;	
		}

		case SYSREQ_THREAD_SYNC_EVENT:
		{
			ke_handle hevent;
			struct ke_event *event;
			
			switch (req->detail.event.ops)
			{
				case 's':
				{
					/* 唤醒线程,返回唤醒数量 */
					int count;
					
					hevent = req->detail.event.event;
					if (!(event = ke_handle_translate(hevent)))
						goto invalid_handle;
					count = ke_event_set(event);
					ke_handle_put(hevent, event);
					
					return count;
				}
				case 'c':
				{
					/* Create event, return handle */
					if (!(event = ke_event_object_create(req->detail.event.is_manual, req->detail.event.is_set)))
						goto invalid_handle;
					if (KE_INVALID_HANDLE == (hevent = ke_handle_create(event)))
					{
						km_vfree(event);
						goto invalid_handle;
					}
				
					return hevent;
				}
				case 'd':
				{
					/* delete the event, cause everybody wakeup */
#if 0
					hevent = req->detail.event.event;
					if (!(event = ke_handle_translate(hevent)))
						goto invalid_handle;
					ke_handle_and_object_destory(hevent, event);
#else
					TODO("事件对象用户模型还缺少cl_object的封装,无法销毁对象");
#endif
					return 0;
				}
			}
			break;
		}
	}
	
invalid_handle:
	return KE_INVALID_HANDLE;
}
Beispiel #3
0
static void handle_space_free(void * p)
{
	km_vfree(p);
}