annotate TaskManager/Cell/CellTaskManagerImpl.cc @ 73:811ffebd8deb

*** empty log message ***
author gongo
date Mon, 18 Feb 2008 03:34:35 +0900
parents 178459e03f5c
children 5a1a5f4c28fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
1 #include <stdio.h>
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
2 #include <stdlib.h>
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
3 #include <string.h>
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
4 #include "CellTaskManagerImpl.h"
61
6bc72fde6615 *** empty log message ***
gongo
parents: 60
diff changeset
5 #include "CellBufferManager.h"
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
6 #include "types.h"
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
7 #include "error.h"
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
8
67
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
9 CellTaskManagerImpl::CellTaskManagerImpl(int num)
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
10 {
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
11 machineNum = num;
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
12 }
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
13
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
14 void
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
15 CellTaskManagerImpl::init(void)
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
16 {
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
17 TaskManagerImpl::init();
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
18
60
f50c74835a9b *** empty log message ***
gongo
parents: 57
diff changeset
19 bufferManager = new CellBufferManager();
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
20 bufferManager->init();
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
21
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
22 speThreads = new SpeThreads(machineNum);
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
23 speThreads->init();
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
24 }
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
25
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
26 TaskListPtr
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
27 CellTaskManagerImpl::set_task(void)
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
28 {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
29 // ここ...直すかな
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
30 TaskListPtr list;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
31 TaskQueuePtr queue;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
32 TaskQueuePtr d;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
33 HTaskPtr htask;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
34 TaskPtr task;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
35
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
36 queue = ((CellBufferManager*)bufferManager)->speActiveTaskQueue;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
37 if (queue == NULL) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
38 //return NULL;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
39 goto FINISH;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
40 }
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
41
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
42 ((CellBufferManager*)bufferManager)->clear_cellTaskList();
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
43
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
44 while (queue) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
45 //list = bufferManager->get_available_taskList();
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
46 list = ((CellBufferManager*)bufferManager)->machineTaskList[0];
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
47 htask = queue->task;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
48 d = queue;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
49 queue = queue->next;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
50
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
51 task = &list->tasks[list->length++];
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
52 task->command = htask->command;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
53
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
54 // Fix me !!!!!
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
55 // ださいというか動かないだろこれ。
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
56 // かっこいい class 判定がないものか。typeinfoだっけ?
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
57 // in,out にあるのが DmaBuffer 以外だったら通信させない決まりにしたい
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
58 if (htask->in_addr != 0) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
59 htask->in_addr->get_buffer(&task->in_addr);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
60 } else {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
61 task->in_addr = 0;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
62 }
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
63 if (htask->in_addr != 0) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
64 htask->out_addr->get_buffer(&task->out_addr);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
65 } else {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
66 task->out_addr = 0;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
67 }
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
68 task->in_size = htask->in_size;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
69 task->self = htask;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
71 bufferManager->free_taskQueue(d);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
72 }
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
73
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
74 ((CellBufferManager*)bufferManager)->speActiveTaskQueue = NULL;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
75
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
76 speThreads->send_mail(0, (unsigned int *)(&((CellBufferManager*)bufferManager)->machineTaskList[0]));
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
77
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
78 FINISH:
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
79 return TaskManagerImpl::set_task();
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
80 }
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
81
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
82 /**
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
83 * mail_list は ppe 側の mail なので、変更せず渡す。
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
84 * その前に spe からのメールをチェックする
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
85 */
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
86 MailQueuePtr
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
87 CellTaskManagerImpl::mail_check(MailQueuePtr mail_list)
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
88 {
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
89 int id;
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
90 int data;
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
91 MailQueuePtr list, d;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
92 TaskListPtr next_list;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
93
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
94 list = TaskManagerImpl::mail_check(mail_list);
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
95
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
96 do {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
97 for (id = 0; id < machineNum; id++) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
98 while (1) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
99 data = speThreads->get_mail(id);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
100 if (data < 0) break;
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
101
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
102 // 名前あとでちゃんと決めよう => MY_SPE_... とかじゃなくて
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
103 if (data == MY_SPE_STATUS_READY) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
104 __debug_ppe("[SPE %d] finish\n", id);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
105 } else {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
106 __debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
107 bufferManager->check_task_finish((HTaskPtr)data);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
108 }
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
109 }
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
110 }
73
811ffebd8deb *** empty log message ***
gongo
parents: 70
diff changeset
111 } while (list == NULL && !bufferManager->activeTaskQueue);
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
112
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
113 if (list == NULL) {
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
114 next_list = set_task();
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
115 d = mailManager->create((unsigned int)next_list);
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
116 list = MailManager::append_mailQueue(list, d);
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
117 }
66
1034077dd217 *** empty log message ***
gongo
parents: 65
diff changeset
118
70
178459e03f5c *** empty log message ***
gongo
parents: 67
diff changeset
119 return list;
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
120 }
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
121
65
519d24aa7ac8 *** empty log message ***
gongo
parents: 61
diff changeset
122
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
123 TaskManagerImpl*
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
124 create_impl(int num)
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
125 {
67
7d2874fb0671 *** empty log message ***
gongo
parents: 66
diff changeset
126 return new CellTaskManagerImpl(num);
57
1f8a23cdeec3 *** empty log message ***
gongo
parents:
diff changeset
127 }