media_server: Replace ping/pong with notifications

This commit is contained in:
Dario Casalinuovo 2016-01-06 22:37:35 +01:00
parent 1d11475790
commit ec02769a58
4 changed files with 21 additions and 96 deletions

View File

@ -3385,15 +3385,6 @@ void
BMediaRoster::MessageReceived(BMessage* message)
{
switch (message->what) {
case 'PING':
{
// media_server plays ping-pong with the BMediaRosters
// to detect dead teams. Normal communication uses ports.
static BMessage pong('PONG');
message->SendReply(&pong, static_cast<BHandler *>(NULL), 2000000);
return;
}
case MEDIA_ROSTER_REQUEST_NOTIFICATIONS:
{
RosterNotification notification;

View File

@ -50,17 +50,11 @@ AppManager::AppManager()
:
BLocker("media app manager")
{
fQuit = create_sem(0, "big brother waits");
fBigBrother = spawn_thread(_BigBrotherEntry, "big brother is watching you",
B_NORMAL_PRIORITY, this);
resume_thread(fBigBrother);
}
AppManager::~AppManager()
{
delete_sem(fQuit);
wait_for_thread(fBigBrother, NULL);
}
@ -167,64 +161,3 @@ AppManager::_CleanupTeam(team_id team)
gBufferManager->CleanupTeam(team);
gNotificationManager->CleanupTeam(team);
}
void
AppManager::_TeamDied(team_id team)
{
UnregisterTeam(team);
}
status_t
AppManager::_BigBrotherEntry(void* self)
{
static_cast<AppManager*>(self)->_BigBrother();
return 0;
}
/*! The BigBrother thread send ping messages to the BMediaRoster of
all currently running teams. If the reply times out or is wrong,
the team cleanup function _TeamDied() will be called.
*/
void
AppManager::_BigBrother()
{
status_t status = B_TIMED_OUT;
do {
if (!Lock())
break;
bool startOver = false;
AppMap::iterator iterator = fMap.begin();
for (; iterator != fMap.end(); iterator++) {
// No need to send the alive message
// if the team died.
if (iterator->second.IsValid() == true) {
BMessage ping('PING');
BMessage reply;
reply.what = 0;
status = iterator->second.SendMessage(&ping, &reply, 5000000,
2000000);
if (status != B_OK || reply.what != 'PONG') {
startOver = true;
break;
}
} else {
startOver = true;
break;
}
}
if (startOver == true) {
Unlock();
_TeamDied(iterator->first);
continue;
}
Unlock();
status = acquire_sem_etc(fQuit, 1, B_RELATIVE_TIMEOUT, 2000000);
} while (status == B_TIMED_OUT || status == B_INTERRUPTED);
}

View File

@ -30,17 +30,11 @@ public:
private:
void _CleanupTeam(team_id team);
void _TeamDied(team_id team);
static status_t _BigBrotherEntry(void* self);
void _BigBrother();
private:
typedef std::map<team_id, BMessenger> AppMap;
AppMap fMap;
thread_id fBigBrother;
sem_id fQuit;
};

View File

@ -43,7 +43,6 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002, 2003 "
#include <Roster.h>
#include <MediaDefs.h>
#include <MediaFormats.h>
#include <MediaRoster.h>
#include <Messenger.h>
#include <syscalls.h>
@ -114,15 +113,13 @@ ServerApp::ServerApp()
this);
resume_thread(fControlThread);
BMediaRoster* roster = BMediaRoster::Roster();
if (roster->StartWatching(BMessenger(this, this),
B_MEDIA_SERVER_QUIT) != B_OK) {
TRACE("ServerApp: can't watch for B_MEDIA_SERVER_QUIT");
if (be_roster->StartWatching(BMessenger(this, this),
B_REQUEST_QUIT) != B_OK) {
TRACE("ServerApp: Can't find the registrar.");
}
}
ServerApp::~ServerApp()
{
TRACE("ServerApp::~ServerApp()\n");
@ -130,17 +127,14 @@ ServerApp::~ServerApp()
delete_port(fControlPort);
wait_for_thread(fControlThread, NULL);
if (be_roster->StopWatching(BMessenger(this, this)) != B_OK)
TRACE("ServerApp: Can't unregister roster notifications.");
delete gNotificationManager;
delete gBufferManager;
delete gAppManager;
delete gNodeManager;
delete gMediaFilesManager;
BMediaRoster* roster = BMediaRoster::CurrentRoster();
if (roster->StopWatching(BMessenger(this, this),
B_MEDIA_SERVER_QUIT) != B_OK) {
TRACE("ServerApp: can't unwatch for B_MEDIA_SERVER_QUIT");
}
}
@ -944,9 +938,22 @@ ServerApp::MessageReceived(BMessage* msg)
gMediaFilesManager->HandleAddSystemBeepEvent(msg);
break;
case B_MEDIA_SERVER_QUIT:
gNodeManager->CleanupDormantFlavorInfos();
case B_SOME_APP_QUIT:
{
BString mimeSig;
if (msg->FindString("be:signature", &mimeSig) != B_OK)
return;
if (mimeSig == B_MEDIA_ADDON_SERVER_SIGNATURE)
gNodeManager->CleanupDormantFlavorInfos();
team_id id;
if (msg->FindInt32("team", &id) == B_OK
&& gAppManager->HasTeam(id)) {
gAppManager->UnregisterTeam(id);
}
break;
}
default:
BApplication::MessageReceived(msg);