diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 801:974cd68383b3

TaslListInfo
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 22 May 2010 18:20:16 +0900
parents 2708c4a7bade
children 3763d29f41a3
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Fri May 21 07:47:25 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sat May 22 18:20:16 2010 +0900
@@ -6,6 +6,8 @@
 #include "Scheduler.h"
 #include "SysTask.h"
 #include "SysFunc.h"
+#include <string.h>
+
 
 static HTaskPtr systask_start;
 static HTaskPtr systask_finish;
@@ -176,6 +178,39 @@
     waitTaskQueue ->addLast(q);
 }
 
+void
+TaskManagerImpl::set_taskList(HTaskPtr htask, TaskListInfoPtr taskList) {
+    TaskListPtr list = taskList->getLast();
+    SimpleTaskPtr task = &list->tasks[list->length++];
+    if (htask->command==TaskArray1) {
+	// compatibility
+	int next = ((htask->r_size)/sizeof(SimpleTask))+1;
+	if (list->length+next>=TASK_MAX_SIZE) {
+	    list->length--;
+	    TaskListPtr newList = taskListImpl->create();
+	    taskList->addLast(newList);
+	    list = newList;
+	    task = &list->tasks[list->length++];
+	}
+	Task *array = (Task*)&list->tasks[list->length];
+	list->length += next;
+	if (list->length>=TASK_MAX_SIZE) {
+	    perror("task array1 overflow\n");
+	}
+	memcpy(array, htask->rbuf, htask->r_size);
+	free(htask->rbuf);
+	htask->rbuf = 0; htask->r_size = 0;
+	*task = *(SimpleTask*)htask;
+    } else {
+	*task = *(SimpleTask*)htask;
+    }
+    if (list->length >= TASK_MAX_SIZE) {
+	TaskListPtr newList = taskListImpl->create();
+	taskList->addLast(newList);
+	list = newList;
+    }
+}
+
 
 
 /* end */