a implementation of template class that is used for create event-driven task thread.

Actor.cpp

Committer:
mzta
Date:
2015-05-20
Revision:
0:1f4516e81c1b

File content as of revision 0:1f4516e81c1b:

#include "Actor.h"

Actor::Actor() :
    thread(&Actor::threadKicker, this, osPriorityNormal, STACK_SIZE)
{
    thread.signal_set(START_THREAD);
}

Actor::~Actor()
{
}

void Actor::threadMain()
{
    printf("thread main\n");
    osEvent event;
    while(true) {
        event = mbox.get();
        if (event.status == osEventMail) {
            MailPacket *mail = (MailPacket*)event.value.p;
            if (joblist[mail->messageId] != NULL) {
                joblist[mail->messageId](mail->packet);
            }
            mbox.free(mail);
        }
    }
}

void Actor::subscribe(MessageID msg, void(*task)(void *))
{
    printf("subsc\n");
    joblist[msg] = task;
}

void Actor::unsubscribe(MessageID msg)
{
    printf("unsub\n");
    joblist.erase(msg);
}

void Actor::sendMail(Actor *dest, MessageID msg, void *pkt)
{
    printf("sendMail\n");
    MailPacket *mail = dest->mbox.alloc();
    mail->messageId  = msg;
    mail->packet     = pkt;
    dest->mbox.put(mail);
}

void Actor::threadKicker(void const *p)
{
    printf("thread kicker\n");
    Actor *instance = (Actor*)p;
    instance->threadMain();
}