view TaskManager/Cell/CellTaskInfo.cc @ 32:f7fd92a1d7bb

*** empty log message ***
author gongo
date Tue, 12 Feb 2008 14:48:35 +0900
parents
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include "CellTaskInfo.h"

#define ROUND_UP_ALIGN(value, alignment) \
    (((value) + ((alignment) - 1))&(~((alignment)-1)))

#define NEXT_ADDR(addr, size) \
    (TaskListPtr)((int)(addr) + (size))
int
CellTaskInfo::extend_pool_taskList(int num)
{
    TaskListPtr q, p;
    int unit_size;

    
    unit_size = (ROUND_UP_ALIGN(sizeof(TaskList), 16));
    posix_memalign((void**)&q, 16, unit_size*(num+1));

    if (q == NULL) {
	return -1;
    }
    
    q->next = taskListPool;
    taskListPool = q;
    
    /* Connect all free pack_list in the pool */
    q = NEXT_ADDR(taskListPool,unit_size); // q = taskListPool + 1;
    for (; --num > 0; q = NEXT_ADDR(q + unit_size)) {
	q->next = NEXT_ADDR(q, unit_size) // q->next = q + 1;
    }
    q->next = freeTaskList;
    freeTaskList = NEXT_ADDR(taskListPool, unit_size);

    return 0;
}

TaskListPtr
CellTaskInfo::get_available_taskList(void)
{
    TaskListPtr list, q;

    list = machineTaskList[0];

    while (list->next) list = list->next;

    if (list->length < TASK_MAX_SIZE) {
	return list;
    } else {
	q = get_free_taskList();
	machineTaskList[0] = append_taskList(machineTaskList[0], q);
	return q;
    }
}

void
CellTaskInfo::clear_taskList(void)
{
    TaskListPtr p, p1;

    machineTaskList[0]->length = 0;

    p = machineTaskList[0]->next;
    while (p) {
	p1 = p;
	p = p->next;
	free_taskList(p1);
    }
}