From 67060664c9b136574a9272dc34e209c9d5f99ba4 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Sat, 28 Nov 2015 16:28:10 +0100 Subject: [PATCH] Allow BMediaRoster to log local nodes * BMediaRoster is now capable to know which nodes are instantiated in this team. This is also a first step to make them survive after media_server crashes. * A control at BMediaRoster::Quit can notify if all nodes were correctly released. Ideally at this point the local nodes list should be empty. --- headers/private/media/MediaRosterEx.h | 3 ++ src/kits/media/MediaRoster.cpp | 49 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/headers/private/media/MediaRosterEx.h b/headers/private/media/MediaRosterEx.h index 74bec127e5..da50ddc730 100644 --- a/headers/private/media/MediaRosterEx.h +++ b/headers/private/media/MediaRosterEx.h @@ -92,6 +92,9 @@ public: status_t BuildConnections(); + void RegisterLocalNode(BMediaNode* node); + void UnregisterLocalNode(BMediaNode* node); + private: friend class BMediaRoster; }; diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp index 12a948a2e5..2577719032 100644 --- a/src/kits/media/MediaRoster.cpp +++ b/src/kits/media/MediaRoster.cpp @@ -83,9 +83,30 @@ struct RosterNotification { }; +struct LocalNode { + LocalNode(BMediaNode* local_node) + : + node(local_node) {} + + LocalNode() + : + node(NULL) {} + + bool operator==(const LocalNode& a) + { + if (a.node == this->node) + return true; + return false; + } + + BMediaNode* node; +}; + + static bool sServerIsUp = false; static List sNotificationList; static BLocker sInitLocker("BMediaRoster::Roster locker"); +static List sRegisteredNodes; class MediaRosterUndertaker { @@ -96,6 +117,18 @@ public: if (BMediaRoster::CurrentRoster() != NULL && BMediaRoster::CurrentRoster()->Lock()) { + // Detect any forgotten node + if (sRegisteredNodes.CountItems() > 0) { + for (int32 i = 0; i < sRegisteredNodes.CountItems(); i++) { + LocalNode* node = NULL; + sRegisteredNodes.Get(i, &node); + if (node != NULL) { + ERROR("BMediaRoster: Node with ID %" B_PRId32 + " was not released correctly\n", node->node->ID()); + } + } + } + if (be_app != NULL) be_app->UnregisterLooper(BMediaRoster::CurrentRoster()); @@ -181,6 +214,22 @@ BMediaRosterEx::~BMediaRosterEx() } +void +BMediaRosterEx::RegisterLocalNode(BMediaNode* node) +{ + sRegisteredNodes.Insert(LocalNode(node)); +} + + +void +BMediaRosterEx::UnregisterLocalNode(BMediaNode* node) +{ + int32 index = sRegisteredNodes.Find(LocalNode(node)); + if (index != -1) + sRegisteredNodes.Remove(index); +} + + status_t BMediaRosterEx::SaveNodeConfiguration(BMediaNode* node) {