jackba / wy-internal-system

Automatically exported from code.google.com/p/wy-internal-system
0 stars 0 forks source link

Memory Reuse List #5

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Memory Reuse List

Original issue reported on code.google.com by Giggs...@gmail.com on 23 Feb 2012 at 6:59

GoogleCodeExporter commented 9 years ago
#include "stdafx.h"
#include "TaskQueue.h"

//iCount > 1
TaskManager::TaskManager(int iCount) : head(NULL), nail(NULL), producePos(NULL)
{
    //new the queue
    //
    head = new TaskQueue;
    memset(head, 0, sizeof(TaskQueue));
    TaskQueue *temp = NULL, *last = head;
    for (int i = 1; i < iCount; i++)
    {
        temp = new TaskQueue;
        memset(temp, 0, sizeof(TaskQueue));
        last->next = temp;
        last = temp;
    }
    nail = last;
    producePos = head;
}
TaskManager::~TaskManager()
{
    //delete the queue.MUST wait to consume up
    TaskQueue *temp = head->next;
    while (head)
    {
        delete head;
        head = temp;
        if (temp) temp = temp->next;
    }
} 

void *TaskManager::Pop()
{
    if (!head || !head->pData)
    {
        return NULL;
    }
    //new head
    //
    void *temp = head->pData;
    TaskQueue *p = head;
    head = head->next;
    //add head to nail then
    //
    memset (p, 0, sizeof(TaskQueue));
    nail->next = p;
    nail = p;
//  printf("popped:%d\n", temp);

    return temp;
}

 void TaskManager::Push(void *pData)
{
//  printf("pushed:%d\n", pData);
    producePos->pData = pData;
    if (!producePos->next)
    {
        producePos->next = new TaskQueue;
        memset(producePos->next, 0, sizeof(TaskQueue));
        nail = producePos->next;
    }
    producePos = producePos->next;
}

////////////////////////////////

#pragma once

//FIFO:consume the head & push the head to nail for reuse, produce in the nail 
typedef struct _TaskQueue
{
    void *pData;
    _TaskQueue *next;
} TaskQueue;

class TaskManager
{
public:
    TaskManager(int iCount = 2 ^ 6);
    ~TaskManager();

    void Push(void *pData);
    void *Pop();
private:
    TaskQueue *head;
    TaskQueue *nail;
    TaskQueue *producePos;
};

Original comment by Giggs...@gmail.com on 24 Feb 2012 at 12:59