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

Committer:
mzta
Date:
Wed May 20 08:11:04 2015 +0000
Revision:
0:1f4516e81c1b
initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzta 0:1f4516e81c1b 1 #include "Actor.h"
mzta 0:1f4516e81c1b 2
mzta 0:1f4516e81c1b 3 Actor::Actor() :
mzta 0:1f4516e81c1b 4 thread(&Actor::threadKicker, this, osPriorityNormal, STACK_SIZE)
mzta 0:1f4516e81c1b 5 {
mzta 0:1f4516e81c1b 6 thread.signal_set(START_THREAD);
mzta 0:1f4516e81c1b 7 }
mzta 0:1f4516e81c1b 8
mzta 0:1f4516e81c1b 9 Actor::~Actor()
mzta 0:1f4516e81c1b 10 {
mzta 0:1f4516e81c1b 11 }
mzta 0:1f4516e81c1b 12
mzta 0:1f4516e81c1b 13 void Actor::threadMain()
mzta 0:1f4516e81c1b 14 {
mzta 0:1f4516e81c1b 15 printf("thread main\n");
mzta 0:1f4516e81c1b 16 osEvent event;
mzta 0:1f4516e81c1b 17 while(true) {
mzta 0:1f4516e81c1b 18 event = mbox.get();
mzta 0:1f4516e81c1b 19 if (event.status == osEventMail) {
mzta 0:1f4516e81c1b 20 MailPacket *mail = (MailPacket*)event.value.p;
mzta 0:1f4516e81c1b 21 if (joblist[mail->messageId] != NULL) {
mzta 0:1f4516e81c1b 22 joblist[mail->messageId](mail->packet);
mzta 0:1f4516e81c1b 23 }
mzta 0:1f4516e81c1b 24 mbox.free(mail);
mzta 0:1f4516e81c1b 25 }
mzta 0:1f4516e81c1b 26 }
mzta 0:1f4516e81c1b 27 }
mzta 0:1f4516e81c1b 28
mzta 0:1f4516e81c1b 29 void Actor::subscribe(MessageID msg, void(*task)(void *))
mzta 0:1f4516e81c1b 30 {
mzta 0:1f4516e81c1b 31 printf("subsc\n");
mzta 0:1f4516e81c1b 32 joblist[msg] = task;
mzta 0:1f4516e81c1b 33 }
mzta 0:1f4516e81c1b 34
mzta 0:1f4516e81c1b 35 void Actor::unsubscribe(MessageID msg)
mzta 0:1f4516e81c1b 36 {
mzta 0:1f4516e81c1b 37 printf("unsub\n");
mzta 0:1f4516e81c1b 38 joblist.erase(msg);
mzta 0:1f4516e81c1b 39 }
mzta 0:1f4516e81c1b 40
mzta 0:1f4516e81c1b 41 void Actor::sendMail(Actor *dest, MessageID msg, void *pkt)
mzta 0:1f4516e81c1b 42 {
mzta 0:1f4516e81c1b 43 printf("sendMail\n");
mzta 0:1f4516e81c1b 44 MailPacket *mail = dest->mbox.alloc();
mzta 0:1f4516e81c1b 45 mail->messageId = msg;
mzta 0:1f4516e81c1b 46 mail->packet = pkt;
mzta 0:1f4516e81c1b 47 dest->mbox.put(mail);
mzta 0:1f4516e81c1b 48 }
mzta 0:1f4516e81c1b 49
mzta 0:1f4516e81c1b 50 void Actor::threadKicker(void const *p)
mzta 0:1f4516e81c1b 51 {
mzta 0:1f4516e81c1b 52 printf("thread kicker\n");
mzta 0:1f4516e81c1b 53 Actor *instance = (Actor*)p;
mzta 0:1f4516e81c1b 54 instance->threadMain();
mzta 0:1f4516e81c1b 55 }