diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 42:aa11038dbdc1

*** empty log message ***
author gongo
date Thu, 14 Feb 2008 18:27:37 +0900
parents 0c9341da4522
children f154d9d07a42
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -1,6 +1,8 @@
 #include <stdio.h>
 #include "TaskManagerImpl.h"
 
+#include "ppe_spe.h"
+
 void
 noaction(void)
 {
@@ -11,6 +13,17 @@
     machineNum = num;
 }
 
+void
+TaskManagerImpl::init(void)
+{
+    mailManager = new MailManager();
+    mailManager->init_pool_mailQueue(20);
+
+    scheduler = new MainScheduler();
+    scheduler->init();
+    scheduler->set_mailManager(mailManager);
+}
+
 HTaskPtr
 TaskManagerImpl::create_task(int cmd, int size,
 			 unsigned long long in_addr, 
@@ -55,3 +68,112 @@
 	taskInfo->append_waitTask(task);	
     }
 }
+
+TaskListPtr
+TaskManagerImpl::set_task(void)
+{
+    // ここ...直すかな
+    TaskListPtr list;
+    TaskQueuePtr queue;
+    TaskQueuePtr d;
+    HTaskPtr htask;
+    TaskPtr task;
+
+    queue = taskInfo->activeTaskQueue;
+    if (queue == NULL) {
+	return NULL;
+    }
+
+    taskInfo->clear_taskList();
+ 
+    while (queue) {
+	list = taskInfo->get_available_taskList();
+	htask = queue->task;
+	d = queue;
+	queue = queue->next;
+
+	task = &list->tasks[list->length++];
+	task->command  = htask->command;
+	task->in_addr  = htask->in_addr;
+	task->out_addr = htask->out_addr;
+	task->in_size  = htask->in_size;
+	task->self = htask;
+
+	taskInfo->free_taskQueue(d);
+    }	
+
+    taskInfo->activeTaskQueue = NULL;
+
+    return list;
+}
+
+
+// ../spe/main.cpp
+extern MailQueuePtr spe_main(MailManager*, MailQueuePtr);
+
+void
+TaskManagerImpl::run(void)
+{
+    TaskListPtr list;
+    MailQueuePtr list_mail; // task list
+    MailQueuePtr sentinel;  // 番兵
+    MailQueuePtr in_mail_list = NULL;
+    MailQueuePtr out_mail_list = NULL;
+
+    // 暫定
+    list = set_task();
+
+    list_mail =	mailManager->create_mail((unsigned int)list);
+    in_mail_list = append_mailQueue(in_mail_list, list_mail);
+	
+    do {
+	sentinel  = mailManager->create_mail(MY_SPE_COMMAND_EXIT);
+	in_mail_list = append_mailQueue(in_mail_list, sentinel);
+
+	// 返って来た mail_list には、spe からの mail がある
+	scheduler->send_mailList(in_mail_list);
+	scheduler->run();
+	out_mail_list = scheduler->recv_mailList();
+	in_mail_list = mail_check(out_mail_list);
+    } while (in_mail_list);
+}
+
+/**
+ * PPE Scheduler からのメールをチェックする
+ */
+MailQueuePtr
+TaskManagerImpl::mail_check(MailQueuePtr mail_list)
+{
+    MailQueuePtr q = mail_list;
+    MailQueuePtr d;
+    MailQueuePtr ret = NULL;
+    unsigned int data;
+    TaskListPtr next_list;
+
+    while (q) {
+	data = q->data;
+
+	if (data == MY_SPE_STATUS_READY) {
+#ifdef _PPE_DEBUG
+	    printf("[FIFO] finish\n");
+#endif
+	    next_list = set_task();
+	    if (next_list != NULL) {
+		d = mailManager->create_mail((unsigned int)next_list);
+		ret = append_mailQueue(ret, d);
+	    }
+	} else {
+#ifdef _PPE_DEBUG
+	    printf("[PPE] recv from : 0x%x\n", data);
+#endif
+	    taskInfo->check_task_finish((HTaskPtr)data);
+	}
+
+	d = q;
+	q = q->next;
+
+	mailManager->free_mailQueue(d);
+    }
+
+    return ret;
+}