Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/schedule/Scheduler.cc @ 373:eab18aa0c7f6
MemList not working
author | kazz@kazzone.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Fri, 31 Jul 2009 17:52:27 +0900 |
parents | b89ba1d96fff |
children | 6113af8f183b |
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/Scheduler.cc Fri Jul 31 01:44:06 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Fri Jul 31 17:52:27 2009 +0900 @@ -25,11 +25,11 @@ init_impl(); for (int i = 0; i < 2; i++) { - buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); - buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); - buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); + buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); + buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); + buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); } - + buffFlag_taskList = 0; buffFlag_inListData = 0; buffFlag_outListData = 0; @@ -37,13 +37,13 @@ // bzero でもいいけど for (int i = 0; i < MAX_GLOBAL_AREA; i++) { - globalList[i] = NULL; + globalList[i] = NULL; } for (int i = 0; i < MAX_MAINMEM_AREA; i++) { - mainMemList[i] = NULL; + mainMemList[i] = NULL; } - + taskGroup = new TaskGroup; renewTop_taskList = NULL; @@ -61,15 +61,15 @@ // main loop do { - __debug("----------\n"); - task3->write(); - task2->exec(); - task1->read(); + __debug("----------\n"); + task3->write(); + task2->exec(); + task1->read(); - taskTmp = task3; - task3 = task2; - task2 = task1; - task1 = task1->next(this, taskTmp); + taskTmp = task3; + task3 = task2; + task2 = task1; + task1 = task1->next(this, taskTmp); } while (task1); delete task3; @@ -133,14 +133,14 @@ Scheduler::get_renewListBuf(void) { if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { - return renewCur_taskList; + return renewCur_taskList; } else { - TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); - newList->length = 0; - newList->next = NULL; - renewTop_taskList = TaskList::append(renewTop_taskList, newList); - renewCur_taskList = newList; - return newList; + TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); + newList->length = 0; + newList->next = NULL; + renewTop_taskList = TaskList::append(renewTop_taskList, newList); + renewCur_taskList = newList; + return newList; } } @@ -156,16 +156,16 @@ Scheduler::get_nextRenewTaskList(void) { if (renewTop_taskList) { - TaskListPtr list = renewTop_taskList; - renewTop_taskList = renewTop_taskList->next; - renewCur_taskList = NULL; + TaskListPtr list = renewTop_taskList; + renewTop_taskList = renewTop_taskList->next; + renewCur_taskList = NULL; - list->next = NULL; - SchedTaskList *sched - = createSchedTaskList((uint32)list, this, SCHED_TASKLIST_RENEW); - return sched; + list->next = NULL; + SchedTaskList *sched + = createSchedTaskList((uint32)list, this, SCHED_TASKLIST_RENEW); + return sched; } else { - return NULL; + return NULL; } } @@ -191,7 +191,7 @@ Scheduler::get_backupTaskList(void) { TaskListPtr ret = bak_curTaskList; - + bak_curTaskList = NULL; return ret; } @@ -297,6 +297,12 @@ } void +Scheduler::global_set(int id, void *addr) +{ + globalList[id] = addr; +} + +void Scheduler::global_free(int id) { free(globalList[id]); @@ -323,3 +329,27 @@ { task_list[cmd] = task; } + +/*! + @param [size] リストの要素1つのサイズ + @param [count] 要素数 + @return allocate した領域のポインタ + + */ +MemList* +Scheduler::createMemList(int size, int count) +{ + uint32 head_size = round_up16(sizeof(MemorySegment)); + uint32 seg_size = round_up16(head_size+size); + char* mseg = (char*)allocate(seg_size*count); + MemList* mlist = new MemList((MemorySegment*)mseg); + + for(int i = 0; i < count; i++) { + MemorySegment* next = (MemorySegment*)(mseg+seg_size*i); + char* data = (char*)next+head_size; + next->data = (void*)data; + mlist->addLast(next); + } + + return mlist; +}