# HG changeset patch # User hiroki@henri.cr.ie.u-ryukyu.ac.jp # Date 1259153822 -32400 # Node ID 63a0cf8d67bcc986c78e2e659edad238d6b2b49c # Parent d0b8860c17f849ac48203ef9155b62e8771d16b3# Parent 0eed1fa290c1430c76f35f66aa2eb24f90f78483 merge diff -r d0b8860c17f8 -r 63a0cf8d67bc Renderer/Engine/Func.h --- a/Renderer/Engine/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/Renderer/Engine/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,40 +1,10 @@ enum { - - INIT, - SDL_INIT, - FINISH, - - Create_SGP, - Update_SGP, - CreatePolygon, - CreatePolygonFromSceneGraph, - CreateSpan, - - DrawSpan, - DrawBack, - - LoadTexture, - SetTexture, - - Move, - Draw, - - Dummy, - - UpdateKey, - InitKey, - - ShowTime, - Switch, - - ChainMove, - ChainCal, - ChainInit, - - - RUN_FINISH, - +#include "SysTasks.h" +#include "RenderingTasks.h" }; -#define DATA_ID 0 +enum { +#include "RenderingGlobal.h" +}; + diff -r d0b8860c17f8 -r 63a0cf8d67bc Renderer/Engine/RenderingGlobal.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/RenderingGlobal.h Wed Nov 25 21:57:02 2009 +0900 @@ -0,0 +1,1 @@ + DATA_ID, diff -r d0b8860c17f8 -r 63a0cf8d67bc Renderer/Engine/RenderingTasks.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Renderer/Engine/RenderingTasks.h Wed Nov 25 21:57:02 2009 +0900 @@ -0,0 +1,34 @@ + INIT, + SDL_INIT, + FINISH, + + Create_SGP, + Update_SGP, + CreatePolygon, + CreatePolygonFromSceneGraph, + CreateSpan, + + DrawSpan, + DrawBack, + + LoadTexture, + SetTexture, + + Move, + Draw, + + Dummy, + + UpdateKey, + InitKey, + + ShowTime, + Switch, + + ChainMove, + ChainCal, + ChainInit, + + + RUN_FINISH, + diff -r d0b8860c17f8 -r 63a0cf8d67bc Renderer/Engine/spe/DrawSpan.cc --- a/Renderer/Engine/spe/DrawSpan.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/Renderer/Engine/spe/DrawSpan.cc Wed Nov 25 21:57:02 2009 +0900 @@ -456,11 +456,9 @@ } SpanPtr resume_span = &nop_span; - int resume_span_x = 0; for (int t = 0; t < spack->info.size; t++) { SpanPtr next_span; - int next_span_x; span = &spack->span[t]; @@ -476,7 +474,6 @@ next_span = span; resume_span = next_span; - resume_span_x = next_span_x; tl_tag_flg1 ^= 1; tl_tag_flg2 ^= 1; diff -r d0b8860c17f8 -r 63a0cf8d67bc Renderer/Test/send_linda.cc --- a/Renderer/Test/send_linda.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/Renderer/Test/send_linda.cc Wed Nov 25 21:57:02 2009 +0900 @@ -144,7 +144,7 @@ } static char *xml; -static char *linda = HOSTNAME; +static const char *linda = HOSTNAME; MainLoopPtr send_linda::init(Viewer *sgr, int screen_w, int screen_h) diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Wed Nov 25 21:57:02 2009 +0900 @@ -135,7 +135,6 @@ CellTaskManagerImpl::run() { TaskListPtr ppeTaskList = NULL; - MailQueuePtr ppeMail = NULL; // PPE 側で動く TaskList です // FifoTaskManagerImpl::run と上手く合うように @@ -157,9 +156,9 @@ // どうかを調べる必要がある。 // do { - ppeMail = ppeManager->schedule(ppeTaskList); + ppeManager->schedule(ppeTaskList); cont: - ppeTaskList = mail_check(ppeMail); + ppeTaskList = mail_check(waitTaskQueue); } while (ppeTaskList || spe_running >0); } @@ -175,17 +174,17 @@ */ TaskListPtr -CellTaskManagerImpl::mail_check(MailQueuePtr mail_list) +CellTaskManagerImpl::mail_check(HTaskInfo *wait_queue) { // PPE Scheduler からの mail check - ppeManager->mail_check(mail_list, waitTaskQueue); + ppeManager->mail_check(waitTaskQueue); do { memaddr data; // SPE Scheduler からの mail check for (int id = 0; id < machineNum; id++) { - while (speThreads->check_mail(id, 1, &data)) { + while (speThreads->has_mail(id, 1, &data)) { /** * MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 * MY_SPE_NOP: 特に意味のないコマンド @@ -233,7 +232,7 @@ //__debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data); HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); - check_task_finish(task); + check_task_finish(task,waitTaskQueue); } } } diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Cell/CellTaskManagerImpl.h --- a/TaskManager/Cell/CellTaskManagerImpl.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Wed Nov 25 21:57:02 2009 +0900 @@ -24,7 +24,7 @@ // system void init(); void run(); - TaskListPtr mail_check(MailQueuePtr mail_list); + TaskListPtr mail_check(HTaskInfo *); void set_runTaskList(); void append_activeTask(HTaskPtr); diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Cell/SpeThreads.cc --- a/TaskManager/Cell/SpeThreads.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Cell/SpeThreads.cc Wed Nov 25 21:57:02 2009 +0900 @@ -119,7 +119,7 @@ } int -SpeThreads::check_mail(int speid, int count, memaddr *ret) +SpeThreads::has_mail(int speid, int count, memaddr *ret) { /* * spe_out_mbox_status return only 1, waiting for multiple length diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Cell/SpeThreads.h --- a/TaskManager/Cell/SpeThreads.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Cell/SpeThreads.h Wed Nov 25 21:57:02 2009 +0900 @@ -20,7 +20,7 @@ /* functions */ void init(void); int get_mail(int speid, int count, memaddr *ret); // BLOCKING - int check_mail(int speid, int count, memaddr *ret); // NONBLOCK + int has_mail(int speid, int count, memaddr *ret); // NONBLOCK void send_mail(int speid, int num, memaddr *data); // BLOCKING static void *spe_thread_run(void *arg); static void *frontend_thread_run(void *arg); diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Cell/spe/CellDmaManager.cc --- a/TaskManager/Cell/spe/CellDmaManager.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Cell/spe/CellDmaManager.cc Wed Nov 25 21:57:02 2009 +0900 @@ -90,11 +90,11 @@ memaddr CellDmaManager::mail_read() { - memaddr mail = (memaddr)spu_read_in_mbox(); + memaddr data = (memaddr)spu_read_in_mbox(); if (ABIBIT>32) { - mail += (spu_read_in_mbox()<<4); + data += (spu_read_in_mbox()<<4); } - return mail; + return data; } void diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/FifoDmaManager.cc --- a/TaskManager/Fifo/FifoDmaManager.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.cc Wed Nov 25 21:57:02 2009 +0900 @@ -25,39 +25,6 @@ { } -void -FifoDmaManager::mail_write(memaddr data) -{ - mail_sendQueue - = MailManager::append_mailQueue(mail_sendQueue, - mailManager->create(data)); -#if 0 - if (MailManager::length(mail_sendQueue)== -1) { - fprintf(stderr,"Mail Queue Error %s\n",__FUNCTION__); - exit(1); - } -#endif -} - -memaddr -FifoDmaManager::mail_read() -{ - MailQueuePtr q; - memaddr ret; - - q = mail_recvQueue; - - if (q == NULL) { - return 0; // error か 正しい値か判断できないな・・・ - } - - mail_recvQueue = mail_recvQueue->next; - - ret = q->data; - mailManager->free(q); - - return ret; -} void FifoDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/FifoDmaManager.h --- a/TaskManager/Fifo/FifoDmaManager.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/FifoDmaManager.h Wed Nov 25 21:57:02 2009 +0900 @@ -6,25 +6,40 @@ #include "MailManager.h" class FifoDmaManager : public DmaManager { + +protected: + /* variables */ + MailManagerPtr mail_queue1; + MailManagerPtr mail_queue2; + public: BASE_NEW_DELETE(FifoDmaManager); - /* variables */ - MailManager *mailManager; - MailQueuePtr mail_recvQueue; - MailQueuePtr mail_sendQueue; + FifoDmaManager() { + mail_queue1 = new MailManager(); + mail_queue2 = new MailManager(); + } + + ~FifoDmaManager() { + delete mail_queue1; + delete mail_queue2; + } /* functions */ void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask); void dma_store(void *buf, memaddr addr, uint32 size, uint32 mask); void dma_wait(uint32 mask) ; - void mail_write(memaddr data); - memaddr mail_read(void); + void mail_write(memaddr data) { mail_queue1->send(data); } + memaddr mail_read() { return mail_queue2->recv(); } + + void mail_write_from_host(memaddr data) { mail_queue2->send(data); } + memaddr mail_read_from_host() { return mail_queue1->recv(); } + int has_mail_from_host() { return mail_queue1->count(); } void dma_loadList(ListDataPtr list, void *buff, uint32 mask); void dma_storeList(ListDataPtr, void *buff, uint32 mask); - //void* dma_loadList(ListDataPtr list, void *buff, uint32 mask); + }; #endif diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Wed Nov 25 21:57:02 2009 +0900 @@ -9,7 +9,6 @@ FifoTaskManagerImpl::~FifoTaskManagerImpl() { - delete mailManager; delete mainScheduler; delete taskListImpl ; @@ -26,12 +25,8 @@ void FifoTaskManagerImpl::init() { - mailManager = new MailManager(); - mailManager->init(20); - mainScheduler = new MainScheduler(); mainScheduler->init(this); - mainScheduler->set_mailManager(mailManager); mainScheduler->id = 0; set_scheduler(mainScheduler); @@ -55,13 +50,9 @@ void FifoTaskManagerImpl::init(MainScheduler *_sched, TaskManagerImpl *tm) { - mailManager = new MailManager(); - mailManager->init(20); - //scheduler = new MainScheduler(); mainScheduler = _sched; mainScheduler->init(this); - mainScheduler->set_mailManager(mailManager); set_scheduler(mainScheduler); taskListImpl = tm-> taskListImpl ; @@ -130,16 +121,15 @@ FifoTaskManagerImpl::run() { TaskListPtr list; - MailQueuePtr mail; list = get_runTaskList(); do { // list を実行する - mail = schedule(list); + schedule(list); - // mail には、ppe scheduler からの mail がある - mail_check(mail); + // ppe scheduler からの mail を調べる + mail_check(waitTaskQueue); // 依存関係を満たしたものは実行可能キューへ wakeup_waitTask(); @@ -153,36 +143,20 @@ * * [Tasklist] -> [番兵] -> scheduler->run を抜ける */ -MailQueuePtr +void FifoTaskManagerImpl::schedule(TaskListPtr list) { - MailQueuePtr out_mail_list = NULL; if (list) { - MailQueuePtr list_mail; // task list - MailQueuePtr sentinel; // 番兵 - MailQueuePtr in_mail_list = NULL; - - // TaskList のアドレス - list_mail = mailManager->create((memaddr)list); - in_mail_list = MailManager::append_mailQueue(in_mail_list, list_mail); + // TaskList のアドレスを送る + mainScheduler->mail_write_from_host((memaddr)list); // EXIT_COMMAND (番兵的な意味で) - sentinel = mailManager->create((memaddr)MY_SPE_COMMAND_EXIT); - in_mail_list = MailManager::append_mailQueue(in_mail_list, sentinel); + // これを読むと、mainScheduler->run() から抜けて来る。 + mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); // scheduler は受け取ったメールを元に実行する - mainScheduler->send_mailList(in_mail_list); mainScheduler->run(); } - out_mail_list = mainScheduler->recv_mailList(); -#if 0 - if (MailManager::length(out_mail_list )==-1) { - fprintf(stderr, "Error on mail list %s\n",__FUNCTION__); - exit(0); - } -#endif - - return out_mail_list; } /** @@ -196,21 +170,10 @@ * NULL なら全てのタスクが実行終了したということ */ void -FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue) +FifoTaskManagerImpl::mail_check(HTaskInfo *wait_queue) { - waitTaskQueue = waitQueue; - mail_check(mail_list); -} - -void -FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list) -{ - MailQueuePtr q = mail_list; - MailQueuePtr d; - memaddr data; - - while (q) { - data = q->data; + while (mainScheduler->has_mail_from_host()) { + memaddr data = mainScheduler->mail_read_from_host(); if (data == (memaddr)MY_SPE_STATUS_READY) { __debug_ppe("mail_check(): Task List finish\n"); @@ -222,13 +185,8 @@ // 移されてから、wait_for されるという事態が起きることがある。 HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); - check_task_finish(task); + check_task_finish(task, wait_queue); } - - d = q; - q = q->next; - - mailManager->free(d); } } diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/FifoTaskManagerImpl.h --- a/TaskManager/Fifo/FifoTaskManagerImpl.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Wed Nov 25 21:57:02 2009 +0900 @@ -23,18 +23,15 @@ void init(void); void init(MainScheduler*, TaskManagerImpl*); void run(void); - void mail_check(MailQueuePtr mail_list); - void mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue); + + void mail_check(); + void mail_check(HTaskInfo *waitQueue); + TaskListPtr get_runTaskList(void); - MailQueuePtr schedule(TaskListPtr); + void schedule(TaskListPtr); // call by user - int add_data(ListDataPtr, uint32, int); -#if 0 - void* allocate(int size,int align); - void* allocate(int size); - Scheduler* get_scheduler(); -#endif + }; diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/MainScheduler.cc --- a/TaskManager/Fifo/MainScheduler.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/MainScheduler.cc Wed Nov 25 21:57:02 2009 +0900 @@ -7,40 +7,11 @@ void MainScheduler::init_impl(void) { - connector = new FifoDmaManager(); -} - -void -MainScheduler::set_mailManager(MailManager *m) -{ - ((FifoDmaManager*)connector)->mailManager = m; + fifoDmaManager = new FifoDmaManager(); + connector = fifoDmaManager; } /** - * PPE TaskManager から TaskList やその他コマンドが格納された - * メールキューが送られてくる - */ -void -MainScheduler::send_mailList(MailQueuePtr mail_list) -{ - ((FifoDmaManager*)connector)->mail_recvQueue = mail_list; -} - -/** - * PPE TaskManager が、 Task の終了やその他コマンドが格納された - * メールキューを受け取る - */ -MailQueuePtr -MainScheduler::recv_mailList(void) -{ - MailQueuePtr m = ((FifoDmaManager*)connector)->mail_sendQueue; - ((FifoDmaManager*)connector)->mail_sendQueue = 0; - return m; -} - - - -/** * メインメモリ領域を allocate する。 * Fifo バージョンだから、まあ普通に malloc でおk */ diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Fifo/MainScheduler.h --- a/TaskManager/Fifo/MainScheduler.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/Fifo/MainScheduler.h Wed Nov 25 21:57:02 2009 +0900 @@ -2,18 +2,28 @@ #define INCLUDED_MAIN_SCHEDULER #include "Scheduler.h" -#include "MailManager.h" +#include "FifoDmaManager.h" class MainScheduler : public Scheduler { +protected: + FifoDmaManager *fifoDmaManager; public: ~MainScheduler(void) {} + void init_impl(void); + void mainMem_alloc(int id, int size); - void init_impl(void); - void set_mailManager(MailManager *); - void send_mailList(MailQueuePtr mail_list); - MailQueuePtr recv_mailList(void); + void mail_write_from_host(memaddr data) { + fifoDmaManager->mail_write_from_host(data); + } - void mainMem_alloc(int id, int size); + memaddr mail_read_from_host() { + return fifoDmaManager->mail_read_from_host(); + } + + int has_mail_from_host() { + return fifoDmaManager->has_mail_from_host(); + } + }; #endif diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/Makefile.def diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/include/types.h --- a/TaskManager/include/types.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/include/types.h Wed Nov 25 21:57:02 2009 +0900 @@ -22,6 +22,10 @@ #endif +#define New(Type,Count) ((Type *)malloc(sizeof(Type)*Count)) +#define ReAlloc(Pointer,Type,Count) ((Type *)realloc((void*)Pointer,sizeof(Type)*Count)) + + #define SPE_ALIGNMENT 16 #define SPE_ALIGNMENT_FULL 128 #define SPE_ALIGN __attribute__((aligned(SPE_ALIGNMENT))) diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/ppe/HTaskInfo.cc --- a/TaskManager/kernel/ppe/HTaskInfo.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/ppe/HTaskInfo.cc Wed Nov 25 21:57:02 2009 +0900 @@ -90,6 +90,7 @@ task->set_output(wbuf, ws); return task; #else + fprintf(stderr, "TaskManager is not SIMPLE_TASK mode\n"); return 0; #endif } diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/ppe/MailManager.cc --- a/TaskManager/kernel/ppe/MailManager.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/ppe/MailManager.cc Wed Nov 25 21:57:02 2009 +0900 @@ -1,133 +1,66 @@ -#include #include #include "MailManager.h" -MailManager::MailManager(void) - :mailQueuePool(NULL), freeMailQueue(NULL) {} - -MailManager::~MailManager(void) { destroy(); } - -int -MailManager::init(int num) +void +MailManager::calc_mask(unsigned int qsize) { - if (!mailQueuePool) { - return extend_pool(num); + mask = 1; + while(qsize>mask) { + mask <<= 1; } - return 0; + size = mask; + mask--; } -int -MailManager::extend_pool(int num) -{ - MailQueuePtr q; - - q = (MailQueuePtr)malloc(sizeof(MailQueue)*(num+1)); - - if (q == NULL) { - return -1; - } - q->next = mailQueuePool; - mailQueuePool = q; - - /* Connect all free queue in the pool */ - for (q = mailQueuePool + 1; --num > 0; q++) { - q->next = q + 1; - } - q->next = freeMailQueue; - freeMailQueue = mailQueuePool + 1; - - return 0; +MailManager::MailManager(unsigned int qsize) { + calc_mask(qsize); + queue = New(memaddr,size); } -MailQueuePtr -MailManager::create(memaddr data) +MailManager::~MailManager() { free(queue); } + +int +MailManager::count() { - MailQueuePtr q; - - if (!freeMailQueue) { - extend_pool(30); - } - q = freeMailQueue; - freeMailQueue = freeMailQueue->next; - - q->data = data; - q->next = NULL; - - return q; + return (write+size-read)&mask; } -void -MailManager::free(MailQueuePtr q) +void +MailManager::extend() { -#if 0 - if (MailManager::find(q,freeMailQueue)) { - fprintf(stderr,"double free %s\n",__FUNCTION__); - return; + memaddr *newq = New(memaddr,size*2); + int i = 0; + while(inext = freeMailQueue; - freeMailQueue = q; + read = 0; write = i; + calc_mask(size*2); + free(queue); + queue = newq; } - -void -MailManager::destroy(void) +void +MailManager::send(memaddr data) { - MailQueuePtr q; - - q = mailQueuePool; - while (q) { - MailQueuePtr tmp = q->next; - free(q); - q = tmp; - } - freeMailQueue = mailQueuePool = NULL; -} - - -MailQueuePtr -MailManager::append_mailQueue(MailQueuePtr list, MailQueuePtr q) -{ - MailQueuePtr p = list; - - if (p == NULL) { - return q; - } else { - while(p->next) p = p->next; - p->next = q; - return list; + queue[write++] = data; + write &= mask; + if (write==read) { + extend(); } } -int -MailManager::length(MailQueuePtr list) +memaddr +MailManager::recv() { - MailQueuePtr p = list; - MailQueuePtr q = p; - int i = 0; - - while(p) { - i++; - p=p->next; - if (i%2==0) { - q = q->next; - } - if (p==q) - return -1; // means loop + memaddr data; + if (count()>0) { + data = queue[read++]; + read &= mask; + } else { + data = 0; } - return i; -} - -int -MailManager::find(MailQueuePtr q,MailQueuePtr list) -{ - MailQueuePtr p = list; - while(p) { - if (p==q) - return -1; - p = p->next; - } - return 0; + return data; } /* end */ diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/ppe/MailManager.h --- a/TaskManager/kernel/ppe/MailManager.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/ppe/MailManager.h Wed Nov 25 21:57:02 2009 +0900 @@ -3,33 +3,30 @@ #include "types.h" -typedef struct mail_queue { - memaddr data; - struct mail_queue *next; -} MailQueue, *MailQueuePtr; - class MailManager { public: /* constructor */ - MailManager(); + MailManager(unsigned int qsize = 32) ; + ~MailManager(); /* functions */ - int init(int num); - MailQueuePtr create(memaddr data); - void free(MailQueuePtr q); - static MailQueuePtr append_mailQueue(MailQueuePtr list, MailQueuePtr q); - static int length(MailQueuePtr list); - static int find(MailQueuePtr q,MailQueuePtr list); + void send(memaddr data); + memaddr recv(); + int count(); private: /* variables */ - MailQueuePtr mailQueuePool; - MailQueuePtr freeMailQueue; + memaddr *queue; + unsigned int size; + unsigned int read; + unsigned int write; + unsigned int mask; - /* functions */ - int extend_pool(int num); - void destroy(); + void calc_mask(unsigned int qsize); + void extend(); }; +typedef MailManager *MailManagerPtr; + #endif diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Nov 25 21:57:02 2009 +0900 @@ -136,7 +136,7 @@ * @param [task] 終了したタスク */ void -TaskManagerImpl::check_task_finish(HTaskPtr me) +TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue) { while(TaskQueue *p = me->wait_me->poll()) { @@ -148,7 +148,7 @@ wait_i->free_(p->waiter); if (wait_i->empty()) { - waitTaskQueue->remove(you); + wait_queue->remove(you); append_activeTask(you); } diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/ppe/TaskManagerImpl.h --- a/TaskManager/kernel/ppe/TaskManagerImpl.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Wed Nov 25 21:57:02 2009 +0900 @@ -37,7 +37,7 @@ virtual void append_activeTask(HTaskPtr); virtual void append_waitTask(HTaskPtr); - void check_task_finish(HTaskPtr task); + void check_task_finish(HTaskPtr task, HTaskInfo *wait_queue); void wakeup_waitTask(); void systask_init(); diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/kernel/schedule/DmaManager.h --- a/TaskManager/kernel/schedule/DmaManager.h Wed Nov 25 21:56:14 2009 +0900 +++ b/TaskManager/kernel/schedule/DmaManager.h Wed Nov 25 21:57:02 2009 +0900 @@ -27,7 +27,7 @@ // API for SPU inbound/outbound mailbox virtual void mail_write(memaddr data) {} - virtual memaddr mail_read() {return 0;} + virtual memaddr mail_read() { return 0; } // API for MFC list DMA transfer virtual void dma_loadList(ListDataPtr list, void *,uint32 mask) {} diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/test/MailManagerTest.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/test/MailManagerTest.cc Wed Nov 25 21:57:02 2009 +0900 @@ -0,0 +1,47 @@ +#include +#include "TaskManager/MailManager.h" + +static void +fail(const char *reason) +{ + printf("MailManagerTest failed %s", reason); +} + +static void +tester(MailManagerPtr m, int size) +{ + + for(int i=0;isend((memaddr)i); + } + for(int i=0;icount()==0) { + fail("early read fail\n"); break; + } + if (m->recv()!=(memaddr)i) { + fail("read data fail\n"); break; + } + } +} + +static void +test1() { + MailManagerPtr m = new MailManager(); + tester(m,16); + tester(m,32); + tester(m,48); + delete m; + MailManagerPtr m1 = new MailManager(40); + tester(m1,16); + tester(m1,48); + delete m1; +} + +int +main(int ac, const char *av[]) +{ + test1(); + printf("MailManagerTest succeed\n"); +} + +/* end */ diff -r d0b8860c17f8 -r 63a0cf8d67bc TaskManager/test/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/test/Makefile Wed Nov 25 21:57:02 2009 +0900 @@ -0,0 +1,15 @@ +include ../Makefile.def + +CPPFLAGS += -g -Wall -I../../include -m$(ABIBIT) + +TARGET=MailManagerTest + +$(TARGET) : + +LIBS += ../libFifoManager.a + +MailManagerTest : MailManagerTest.o + $(CC) $(CFLAGS) -o $@ $? $(LIBS) + +clean: + rm -rf *.o $(TARGET) diff -r d0b8860c17f8 -r 63a0cf8d67bc example/HelloWorld/Func.h --- a/example/HelloWorld/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/HelloWorld/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" HELLO_TASK, RUN_FINISH, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/HelloWorld/Makefile.def --- a/example/HelloWorld/Makefile.def Wed Nov 25 21:56:14 2009 +0900 +++ b/example/HelloWorld/Makefile.def Wed Nov 25 21:57:02 2009 +0900 @@ -7,7 +7,7 @@ # ex linux/ps3 CERIUM = ../../../Cerium -CC = g++ # -m64 +CC = g++ -m32 CFLAGS = -g -Wall -O9 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. diff -r d0b8860c17f8 -r 63a0cf8d67bc example/MemList/Func.h --- a/example/MemList/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/MemList/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" HELLO_TASK, RUN_FINISH, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/MemList/Makefile.def --- a/example/MemList/Makefile.def Wed Nov 25 21:56:14 2009 +0900 +++ b/example/MemList/Makefile.def Wed Nov 25 21:57:02 2009 +0900 @@ -5,9 +5,10 @@ # ex: linux/ps3 CERIUM = ../../../Cerium +ABIBIT=32 -CC = g++ -CFLAGS = -g -Wall -O9 +CC = g++ -m$(ABIBIT) +CFLAGS = -g -Wall -O9 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. LIBS = -L${CERIUM}/TaskManager diff -r d0b8860c17f8 -r 63a0cf8d67bc example/MemList/Makefile.macosx --- a/example/MemList/Makefile.macosx Wed Nov 25 21:56:14 2009 +0900 +++ b/example/MemList/Makefile.macosx Wed Nov 25 21:57:02 2009 +0900 @@ -1,6 +1,5 @@ include ./Makefile.def -CC += -m64 SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) diff -r d0b8860c17f8 -r 63a0cf8d67bc example/basic/Func.h --- a/example/basic/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/basic/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" TWICE_TASK, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/dependency_task/Func.h --- a/example/dependency_task/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/dependency_task/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" TASK_EXEC, TASK_PRINT, RUN_FINISH, diff -r d0b8860c17f8 -r 63a0cf8d67bc example/dependency_task/Makefile.def --- a/example/dependency_task/Makefile.def Wed Nov 25 21:56:14 2009 +0900 +++ b/example/dependency_task/Makefile.def Wed Nov 25 21:57:02 2009 +0900 @@ -7,7 +7,9 @@ # ex: linux/ps3 CERIUM = ../../../Cerium -CC = g++ +ABIBIT=32 + +CC = g++ -m$(ABIBIT) CFLAGS = -g -Wall -O9 INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. diff -r d0b8860c17f8 -r 63a0cf8d67bc example/dependency_task/Makefile.macosx --- a/example/dependency_task/Makefile.macosx Wed Nov 25 21:56:14 2009 +0900 +++ b/example/dependency_task/Makefile.macosx Wed Nov 25 21:57:02 2009 +0900 @@ -1,7 +1,5 @@ include ./Makefile.def -CC += -m64 - SRCS_TMP = $(wildcard *.cc) SRCS_EXCLUDE = # ե SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) diff -r d0b8860c17f8 -r 63a0cf8d67bc example/get_segment/Func.h --- a/example/get_segment/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/get_segment/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" RUN_FINISH, HELLO_TASK, HELLO_TASK1, diff -r d0b8860c17f8 -r 63a0cf8d67bc example/mainMem/Func.h --- a/example/mainMem/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/mainMem/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" HELLO_TASK, RUN_FINISH, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/many_task/Func.h --- a/example/many_task/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/many_task/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,3 +1,4 @@ enum { +#include "SysTasks.h" QUICK_SORT, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/many_task/README --- a/example/many_task/README Wed Nov 25 21:56:14 2009 +0900 +++ b/example/many_task/README Wed Nov 25 21:57:02 2009 +0900 @@ -10,3 +10,5 @@ がんばって解読してください。 わからないことがあれば前期ゲーム班に聞いてください。 e065723 Kinjo とか e065748 Nunota がわかると思います。 + + diff -r d0b8860c17f8 -r 63a0cf8d67bc example/many_task/sort.cc --- a/example/many_task/sort.cc Wed Nov 25 21:56:14 2009 +0900 +++ b/example/many_task/sort.cc Wed Nov 25 21:57:02 2009 +0900 @@ -12,7 +12,7 @@ static int last_block_num; static int half_block_num; static int last_half_block_num; -static TaskManager *manager; +static TaskManger *manager; static void sort_restart(SchedTask *, void *, void *); static void sort_start(); @@ -62,6 +62,8 @@ if (--sort_count < 0) { return; } +#ifdef SIMPLE_TASK +#endif HTaskPtr fsort[split_num]; @@ -123,9 +125,10 @@ } void -sort_init(TaskManager *manager_, int cpuNum, int length) +sort_init(TaskManager *_manager, int cpuNum , int length ) { - manager = manager_; + + manager = _manager; data = (DataPtr)manager->allocate(sizeof(Data)*length); data_length = length; @@ -148,3 +151,4 @@ sort_start(); } +/* end */ diff -r d0b8860c17f8 -r 63a0cf8d67bc example/many_task/sort.h --- a/example/many_task/sort.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/many_task/sort.h Wed Nov 25 21:57:02 2009 +0900 @@ -7,7 +7,7 @@ int pad[2]; } Data, *DataPtr; -extern void sort_init(TaskManager *,int, int); +extern void sort_init(SchedTask *,void *, void *); #define MAX_BLOCK_SIZE (int)(1024*16/(sizeof(Data))) diff -r d0b8860c17f8 -r 63a0cf8d67bc example/post_function/Func.h --- a/example/post_function/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/post_function/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,5 +1,6 @@ enum { - HELLO_TASK = 0, +#include "SysTasks.h" + HELLO_TASK, }; #define DATA_NUM 12 diff -r d0b8860c17f8 -r 63a0cf8d67bc example/renew_task/Func.h --- a/example/renew_task/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/renew_task/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,5 +1,6 @@ enum { - RENEW_START = 0, +#include "SysTasks.h" + RENEW_START, RENEW_REPEAT, RENEW1, RENEW2, diff -r d0b8860c17f8 -r 63a0cf8d67bc example/share_task/Func.h --- a/example/share_task/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/share_task/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" TASK_LOAD, TASK_EXEC, RUN_FINISH, diff -r d0b8860c17f8 -r 63a0cf8d67bc example/task_queue/Func.h --- a/example/task_queue/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/task_queue/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" HELLO_TASK, RUN_FINISH, }; diff -r d0b8860c17f8 -r 63a0cf8d67bc example/word_count/Func.h --- a/example/word_count/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/word_count/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" TASK_EXEC, TASK_PRINT, RUN_FINISH, diff -r d0b8860c17f8 -r 63a0cf8d67bc example/word_count/Makefile.macosx --- a/example/word_count/Makefile.macosx Wed Nov 25 21:56:14 2009 +0900 +++ b/example/word_count/Makefile.macosx Wed Nov 25 21:57:02 2009 +0900 @@ -12,7 +12,7 @@ TASK_OBJS = $(TASK_SRCS:.cc=.o) LIBS += -lFifoManager `sdl-config --libs` -CC += -m64 +CC += -m32 .SUFFIXES: .cc .o diff -r d0b8860c17f8 -r 63a0cf8d67bc example/word_count3/Func.h --- a/example/word_count3/Func.h Wed Nov 25 21:56:14 2009 +0900 +++ b/example/word_count3/Func.h Wed Nov 25 21:57:02 2009 +0900 @@ -1,4 +1,5 @@ enum { +#include "SysTasks.h" HELLO_TASK = 0, WAIT_TASK, EXEC_TASK,