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;


}