From ec02769a58bb58b4bb20394d6f8107a3c53de15f Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Wed, 6 Jan 2016 22:37:35 +0100 Subject: [PATCH] media_server: Replace ping/pong with notifications --- src/kits/media/MediaRoster.cpp | 9 ---- src/servers/media/AppManager.cpp | 67 ------------------------------ src/servers/media/AppManager.h | 6 --- src/servers/media/media_server.cpp | 35 +++++++++------- 4 files changed, 21 insertions(+), 96 deletions(-) diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp index 95b37e6cb1..61d8509b38 100644 --- a/src/kits/media/MediaRoster.cpp +++ b/src/kits/media/MediaRoster.cpp @@ -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(NULL), 2000000); - return; - } - case MEDIA_ROSTER_REQUEST_NOTIFICATIONS: { RosterNotification notification; diff --git a/src/servers/media/AppManager.cpp b/src/servers/media/AppManager.cpp index e998f7cec2..761ddef7c8 100644 --- a/src/servers/media/AppManager.cpp +++ b/src/servers/media/AppManager.cpp @@ -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(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); -} diff --git a/src/servers/media/AppManager.h b/src/servers/media/AppManager.h index 1f865a4218..0bc57fb239 100644 --- a/src/servers/media/AppManager.h +++ b/src/servers/media/AppManager.h @@ -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 AppMap; AppMap fMap; - thread_id fBigBrother; - sem_id fQuit; }; diff --git a/src/servers/media/media_server.cpp b/src/servers/media/media_server.cpp index 241c1148e5..f4d7dd60dc 100644 --- a/src/servers/media/media_server.cpp +++ b/src/servers/media/media_server.cpp @@ -43,7 +43,6 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002, 2003 " #include #include #include -#include #include #include @@ -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);