/** @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; }
/** @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; }
static void handle_space_free(void * p) { km_vfree(p); }