64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
//////////////////////////////////////////////////
|
|
// Message Repeater [MessageRepeater.cpp]
|
|
//////////////////////////////////////////////////
|
|
|
|
#ifndef MESSAGE_REPEATER_H
|
|
#include "MessageRepeater.h"
|
|
#endif
|
|
|
|
MessageRepeater *MessageRepeater::_instance = NULL;
|
|
|
|
MessageRepeater *MessageRepeater::Instance() {
|
|
if (_instance == NULL) {
|
|
_instance = new MessageRepeater();
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
|
|
MessageRepeater::~MessageRepeater() {
|
|
// destroy semaphore
|
|
delete_sem(_looper_lock);
|
|
|
|
_instance = NULL;
|
|
}
|
|
|
|
void MessageRepeater::MessageReceived(BMessage *msg) {
|
|
_Broadcast(msg);
|
|
}
|
|
|
|
void MessageRepeater::AddTarget(BLooper *added_looper) {
|
|
acquire_sem(_looper_lock);
|
|
_looper_list.push_back(added_looper);
|
|
release_sem(_looper_lock);
|
|
}
|
|
|
|
void MessageRepeater::RemoveTarget(BLooper *removed_looper) {
|
|
acquire_sem(_looper_lock);
|
|
|
|
for (LooperIter i = _looper_list.begin(); i != _looper_list.end(); ++i) {
|
|
if ((*i) == removed_looper) {
|
|
_looper_list.erase(i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
release_sem(_looper_lock);
|
|
}
|
|
|
|
MessageRepeater::MessageRepeater()
|
|
: BLooper() {
|
|
// create semaphore
|
|
_looper_lock = create_sem(1, "looper sempahore");
|
|
}
|
|
|
|
void MessageRepeater::_Broadcast(BMessage *msg) {
|
|
acquire_sem(_looper_lock);
|
|
|
|
for (ConstLooperIter i = _looper_list.begin(); i != _looper_list.end(); ++i) {
|
|
(*i)->PostMessage(msg);
|
|
}
|
|
|
|
release_sem(_looper_lock);
|
|
}
|