/******************************************************************

    $Header$

    Module: reaper.C

    Author: Jeff Lait

    Copyright 1997 Ytinasin.

    Description: Implementation of generic reaper task

 ******************************************************************/

/******************************************************************

  Revision Record

    Rev Date        Auth    Changes
    === ====        ====    =======

    0.0 12/8/97 jml     start

 ******************************************************************/

/******************************************************************
 * INCLUDES:
 ******************************************************************/
#include <uC++.h>
#include "reaper.h"

/******************************************************************
 * STRUCTURES:
 ******************************************************************/
struct TASK_NODE
{
    uBaseTask *task;
    TASK_NODE *next;
};


/******************************************************************
 * GLOBAL VARIABLES
 ******************************************************************/
REAPER glbReaper;

/******************************************************************
 * REAPER member funcs
 ******************************************************************/
/******************************************************************
 * REAPER::REAPER
 ******************************************************************/
REAPER::REAPER()
{
    m_killlist = NULL;
}

/******************************************************************
 * REAPER::~REAPER
 ******************************************************************/
REAPER::~REAPER()
{
}

/******************************************************************
 * REAPER::requestKill
 ******************************************************************/
void REAPER::requestKill(uBaseTask *task)
{
    TASK_NODE *node;

    node = new TASK_NODE;
    node->task = task;
    node->next = m_killlist;
    m_killlist = node;
}

/******************************************************************
 * REAPER::main
 ******************************************************************/
void REAPER::main()
{
    uBaseTask *task;
    TASK_NODE *node;

    for (;;)
    {
        // First, process all delete requests:
        while (m_killlist)
        {
            task = m_killlist->task;
            node = m_killlist;
            m_killlist = node->next;
            delete node;

            delete task;            // Possible block...
        }

        // We've pollished off the kill list, wait for destructor or another
        // request:
        uAccept (~REAPER)
        {
            break;
        }
        uOr uAccept (requestKill)
        {
        }
    }
}

