a implementation of template class that is used for create event-driven task thread.
Actor.cpp@0:1f4516e81c1b, 2015-05-20 (annotated)
- Committer:
- mzta
- Date:
- Wed May 20 08:11:04 2015 +0000
- Revision:
- 0:1f4516e81c1b
initial commit.
Who changed what in which revision?
User | Revision | Line number | New 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 | } |