add some framework to broadcast and manage notification messages

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1301 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2002-09-30 00:12:11 +00:00
parent 01cf44b71c
commit 682db4a4c5
4 changed files with 99 additions and 14 deletions
+1
View File
@@ -7,6 +7,7 @@ Server media_server :
AppManager.cpp
BufferManager.cpp
NodeManager.cpp
NotificationProcessor.cpp
Queue.cpp
;
LinkSharedOSLibs media_server : be libmedia.so root ;
@@ -0,0 +1,67 @@
#include <OS.h>
#include <Message.h>
#include "NotificationProcessor.h"
#include "Queue.h"
#define NOTIFICATION_THREAD_PRIORITY 19
NotificationProcessor::NotificationProcessor()
: fNotificationQueue(new Queue),
fNotificationThreadId(-1)
{
fNotificationThreadId = spawn_thread(NotificationProcessor::worker_thread, "notification broadcast", NOTIFICATION_THREAD_PRIORITY, this);
resume_thread(fNotificationThreadId);
}
NotificationProcessor::~NotificationProcessor()
{
// properly terminate the queue and wait until the worker thread has finished
status_t dummy;
fNotificationQueue->Terminate();
wait_for_thread(fNotificationThreadId, &dummy);
delete fNotificationQueue;
}
void
NotificationProcessor::RequestNotifications(BMessage *msg)
{
}
void
NotificationProcessor::CancelNotifications(BMessage *msg)
{
}
void
NotificationProcessor::SendNotifications(BMessage *msg)
{
// queue a copy of the message to be processed later
fNotificationQueue->AddItem(new BMessage(*msg));
}
void
NotificationProcessor::CleanupTeam(team_id team)
{
}
void
NotificationProcessor::BroadcastMessages(BMessage *msg)
{
}
void
NotificationProcessor::WorkerThread()
{
BMessage *msg;
while (NULL != (msg = static_cast<BMessage *>(fNotificationQueue->RemoveItem()))) {
BroadcastMessages(msg);
delete msg;
}
}
int32
NotificationProcessor::worker_thread(void *arg)
{
static_cast<NotificationProcessor *>(arg)->WorkerThread();
return 0;
}
+24
View File
@@ -0,0 +1,24 @@
class Queue;
class NotificationProcessor
{
public:
NotificationProcessor();
~NotificationProcessor();
void RequestNotifications(BMessage *msg);
void CancelNotifications(BMessage *msg);
void SendNotifications(BMessage *msg);
void CleanupTeam(team_id team);
private:
void BroadcastMessages(BMessage *msg);
void WorkerThread();
static int32 worker_thread(void *arg);
private:
Queue * fNotificationQueue;
thread_id fNotificationThreadId;
};
+7 -14
View File
@@ -4,6 +4,7 @@
#include <MediaDefs.h>
#include <MediaFormats.h>
#include <Autolock.h>
#include "NotificationProcessor.h"
#include "ServerInterface.h"
#include "BufferManager.h"
#include "NodeManager.h"
@@ -64,8 +65,6 @@ public:
void UnregisterNode(BMessage *);
void SetDefault(BMessage *);
void AcquireNodeReference(BMessage *);
void RequestNotifications(BMessage *);
void CancelNotifications(BMessage *);
void SetOutputBuffers(BMessage *);
void ReclaimOutputBuffers(BMessage *);
void OrphanReclaimableBuffers(BMessage *);
@@ -107,6 +106,7 @@ private:
port_id control_port;
thread_id control_thread;
NotificationProcessor *fNotificationProcessor;
BufferManager *fBufferManager;
AppManager *fAppManager;
NodeManager *fNodeManager;
@@ -121,6 +121,7 @@ private:
ServerApp::ServerApp()
: BApplication(NEW_MEDIA_SERVER_SIGNATURE),
fNotificationProcessor(new NotificationProcessor),
fBufferManager(new BufferManager),
fAppManager(new AppManager),
fNodeManager(new NodeManager),
@@ -138,6 +139,7 @@ ServerApp::ServerApp()
ServerApp::~ServerApp()
{
delete fNotificationProcessor;
delete fBufferManager;
delete fAppManager;
delete fNodeManager;
@@ -447,16 +449,6 @@ void ServerApp::AcquireNodeReference(BMessage *msg)
}
void ServerApp::RequestNotifications(BMessage *msg)
{
}
void ServerApp::CancelNotifications(BMessage *msg)
{
}
void ServerApp::SetOutputBuffers(BMessage *msg)
{
}
@@ -555,6 +547,9 @@ void ServerApp::MessageReceived(BMessage *msg)
case MEDIA_SERVER_GET_SHARED_BUFFER_AREA: GetSharedBufferArea(msg); break;
case MEDIA_SERVER_REGISTER_BUFFER: RegisterBuffer(msg); break;
case MEDIA_SERVER_UNREGISTER_BUFFER: UnregisterBuffer(msg); break;
case MEDIA_SERVER_REQUEST_NOTIFICATIONS: fNotificationProcessor->RequestNotifications(msg); break;
case MEDIA_SERVER_CANCEL_NOTIFICATIONS: fNotificationProcessor->CancelNotifications(msg); break;
case MEDIA_SERVER_SEND_NOTIFICATIONS: fNotificationProcessor->SendNotifications(msg); break;
case MEDIA_SERVER_GET_NODE_ID: GetNodeID(msg); break;
@@ -576,8 +571,6 @@ void ServerApp::MessageReceived(BMessage *msg)
case MEDIA_SERVER_UNREGISTER_NODE: UnregisterNode(msg); break;
case MEDIA_SERVER_SET_DEFAULT: SetDefault(msg); break;
case MEDIA_SERVER_ACQUIRE_NODE_REFERENCE: AcquireNodeReference(msg); break;
case MEDIA_SERVER_REQUEST_NOTIFICATIONS: RequestNotifications(msg); break;
case MEDIA_SERVER_CANCEL_NOTIFICATIONS: CancelNotifications(msg); break;
case MEDIA_SERVER_SET_OUTPUT_BUFFERS: SetOutputBuffers(msg); break;
case MEDIA_SERVER_RECLAIM_OUTPUT_BUFFERS: ReclaimOutputBuffers(msg); break;
case MEDIA_SERVER_ORPHAN_RECLAIMABLE_BUFFERS: OrphanReclaimableBuffers(msg); break;