Mercurial > hg > Members > kono > Cerium
view TaskManager/kernel/ppe/TaskQueueInfo.cc @ 414:b24ea9ca59fd
ChainCal.cpp indent-region
author | kazz@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Wed, 23 Sep 2009 20:42:10 +0900 |
parents | 5c194c71eca8 |
children | 5bda98b0b56d |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include "TaskQueueInfo.h" TaskQueueInfo::TaskQueueInfo(void) :taskQueuePool(NULL), freeTaskQueue(NULL) {} TaskQueueInfo::~TaskQueueInfo(void) { destroy(); } int TaskQueueInfo::init(int num) { if (taskQueuePool == NULL) { return extend_pool(num); } return 0; } int TaskQueueInfo::extend_pool(int num) { TaskQueuePtr q = NULL; q = (TaskQueuePtr)malloc(sizeof(TaskQueue)*(num+1)); if (q == NULL) { return -1; } q->next = taskQueuePool; taskQueuePool = q; /* Connect all free queue in the pool */ for (q = taskQueuePool + 1; --num > 0; q++) { q->next = q + 1; } q->next = freeTaskQueue; freeTaskQueue = taskQueuePool + 1; return 0; } TaskQueuePtr TaskQueueInfo::create(TaskPtr task) { TaskQueuePtr q; if (freeTaskQueue == NULL) { extend_pool(100); } q = freeTaskQueue; freeTaskQueue = freeTaskQueue->next; q->task = task; q->next = NULL; return q; } void TaskQueueInfo::free(TaskQueuePtr q) { q->next = freeTaskQueue; freeTaskQueue = q; } void TaskQueueInfo::destroy(void) { TaskQueuePtr q, tmp; #if 1 q = taskQueuePool; while (q) { tmp = q->next; free(q); q = tmp; } #else for (q = taskQueuePool; q; q = q->next) { free(q); } #endif freeTaskQueue = taskQueuePool = NULL; }