[haiku-commits] r34906 - in haiku/trunk: headers/private/media src/kits/media

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 5 Jan 2010 17:53:55 +0100 (CET)

Author: axeld
Date: 2010-01-05 17:53:55 +0100 (Tue, 05 Jan 2010)
New Revision: 34906
Changeset: http://dev.haiku-os.org/changeset/34906/haiku
Ticket: http://dev.haiku-os.org/ticket/5166
Ticket: http://dev.haiku-os.org/ticket/5120
Ticket: http://dev.haiku-os.org/ticket/5150

Modified:
   haiku/trunk/headers/private/media/DataExchange.h
   haiku/trunk/src/kits/media/DataExchange.cpp
   haiku/trunk/src/kits/media/DormantNodeManager.cpp
   haiku/trunk/src/kits/media/MediaRoster.cpp
   haiku/trunk/src/kits/media/TimeSourceObjectManager.cpp
Log:
* The static object construction and destruction is no longer random, but takes
  the internal dependencies into account. This should fix bugs #5166, #5120,
  and #5150.
* Also, the time source object manager, as well as the dormant node manager
  are now recreated on media roster restart (when the media server is
  restarted).


Modified: haiku/trunk/headers/private/media/DataExchange.h
===================================================================
--- haiku/trunk/headers/private/media/DataExchange.h    2010-01-05 16:23:58 UTC 
(rev 34905)
+++ haiku/trunk/headers/private/media/DataExchange.h    2010-01-05 16:53:55 UTC 
(rev 34906)
@@ -16,6 +16,8 @@
 namespace dataexchange {
 
 
+void InitDataExchange();
+
 // BMessage based data exchange with the media_server
 status_t SendToServer(BMessage* msg);
 status_t QueryServer(BMessage& request, BMessage& reply);

Modified: haiku/trunk/src/kits/media/DataExchange.cpp
===================================================================
--- haiku/trunk/src/kits/media/DataExchange.cpp 2010-01-05 16:23:58 UTC (rev 
34905)
+++ haiku/trunk/src/kits/media/DataExchange.cpp 2010-01-05 16:53:55 UTC (rev 
34906)
@@ -24,37 +24,14 @@
 namespace dataexchange {
 
 
-BMessenger* gMediaServerMessenger;
+static BMessenger sMediaServerMessenger;
 static port_id sMediaServerPort;
 static port_id sMediaAddonServerPort;
 
 static void find_media_server_port();
 static void find_media_addon_server_port();
 
-static BMessenger*
-GetMediaServerMessenger()
-{
-       static BMessenger* messenger = new BMessenger(B_MEDIA_SERVER_SIGNATURE);
-       return gMediaServerMessenger = messenger;
-}
 
-class initit {
-public:
-       initit()
-       {
-               gMediaServerMessenger = 0;
-               find_media_server_port();
-               find_media_addon_server_port();
-       }
-
-       ~initit()
-       {
-               delete gMediaServerMessenger;
-       }
-};
-initit _initit;
-
-
 static void
 find_media_server_port()
 {
@@ -80,11 +57,20 @@
 // #pragma mark -
 
 
+void
+InitDataExchange()
+{
+       sMediaServerMessenger = BMessenger(B_MEDIA_SERVER_SIGNATURE);
+       find_media_server_port();
+       find_media_addon_server_port();
+}
+
+
 //! BMessage based data exchange with the media_server
 status_t
 SendToServer(BMessage* msg)
 {
-       status_t status = GetMediaServerMessenger()->SendMessage(msg,
+       status_t status = sMediaServerMessenger.SendMessage(msg,
                static_cast<BHandler*>(NULL), TIMEOUT);
        if (status != B_OK) {
                ERROR("SendToServer: SendMessage failed: %s\n", 
strerror(status));
@@ -97,7 +83,7 @@
 status_t
 QueryServer(BMessage& request, BMessage& reply)
 {
-       status_t status = GetMediaServerMessenger()->SendMessage(&request, 
&reply,
+       status_t status = sMediaServerMessenger.SendMessage(&request, &reply,
                TIMEOUT, TIMEOUT);
        if (status != B_OK) {
                ERROR("QueryServer: SendMessage failed: %s\n", 
strerror(status));

Modified: haiku/trunk/src/kits/media/DormantNodeManager.cpp
===================================================================
--- haiku/trunk/src/kits/media/DormantNodeManager.cpp   2010-01-05 16:23:58 UTC 
(rev 34905)
+++ haiku/trunk/src/kits/media/DormantNodeManager.cpp   2010-01-05 16:53:55 UTC 
(rev 34906)
@@ -66,8 +66,8 @@
 namespace media {
 
 
-static DormantNodeManager sManager;
-DormantNodeManager* gDormantNodeManager = &sManager;
+DormantNodeManager* gDormantNodeManager;
+       // initialized by BMediaRoster.
 
 
 DormantNodeManager::DormantNodeManager()

Modified: haiku/trunk/src/kits/media/MediaRoster.cpp
===================================================================
--- haiku/trunk/src/kits/media/MediaRoster.cpp  2010-01-05 16:23:58 UTC (rev 
34905)
+++ haiku/trunk/src/kits/media/MediaRoster.cpp  2010-01-05 16:53:55 UTC (rev 
34906)
@@ -69,36 +69,45 @@
 #include "TimeSourceObjectManager.h"
 
 
-namespace BPrivate { namespace media {
+namespace BPrivate {
+namespace media {
 
-// the BMediaRoster destructor is private,
-// but _DefaultDeleter is a friend class of
-// the BMediaRoster an thus can delete it
-class DefaultDeleter {
+
+class MediaInitializer {
 public:
-       ~DefaultDeleter()
+       MediaInitializer()
        {
-               if (BMediaRoster::sDefaultInstance != NULL) {
-                       BMediaRoster::sDefaultInstance->Lock();
-                       BMediaRoster::sDefaultInstance->Quit();
+               InitDataExchange();
+       }
+
+       ~MediaInitializer()
+       {
+               if (BMediaRoster::CurrentRoster() != NULL) {
+                       BMediaRoster::CurrentRoster()->Lock();
+                       BMediaRoster::CurrentRoster()->Quit();
                }
        }
 };
 
+
 }      // namespace media
 }      // namespace BPrivate
 
 using namespace BPrivate::media;
 
 
-// DefaultDeleter will delete the BMediaRoster object in it's destructor.
-DefaultDeleter _deleter;
+static MediaInitializer sInitializer;
 
 
 BMediaRosterEx::BMediaRosterEx(status_t* _error)
        :
        BMediaRoster()
 {
+       InitDataExchange();
+
+       gDormantNodeManager = new DormantNodeManager;
+       gTimeSourceObjectManager = new TimeSourceObjectManager;
+
        // register this application with the media server
        server_register_app_request request;
        server_register_app_reply reply;
@@ -3145,6 +3154,9 @@
 {
        CALLED();
 
+       delete gTimeSourceObjectManager;
+       delete gDormantNodeManager;
+
        // unregister this application with the media server
        server_unregister_app_request request;
        server_unregister_app_reply reply;
@@ -3163,7 +3175,7 @@
 //     #pragma mark - private BMediaRoster
 
 
-// deprecated call
+//! Deprecated call.
 status_t
 BMediaRoster::SetOutputBuffersFor(const media_source& output,
        BBufferGroup* group, bool willReclaim)
@@ -3174,15 +3186,15 @@
 }
 
 
-/* FBC reserved virtuals */
-status_t BMediaRoster::_Reserved_MediaRoster_0(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_1(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_2(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_3(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_4(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_5(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_6(void *) { return B_ERROR; }
-status_t BMediaRoster::_Reserved_MediaRoster_7(void *) { return B_ERROR; }
+// FBC reserved virtuals
+status_t BMediaRoster::_Reserved_MediaRoster_0(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_1(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_2(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_3(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_4(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_5(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_6(void*) { return B_ERROR; }
+status_t BMediaRoster::_Reserved_MediaRoster_7(void*) { return B_ERROR; }
 
 
 BMediaRoster::BMediaRoster()

Modified: haiku/trunk/src/kits/media/TimeSourceObjectManager.cpp
===================================================================
--- haiku/trunk/src/kits/media/TimeSourceObjectManager.cpp      2010-01-05 
16:23:58 UTC (rev 34905)
+++ haiku/trunk/src/kits/media/TimeSourceObjectManager.cpp      2010-01-05 
16:53:55 UTC (rev 34906)
@@ -26,8 +26,8 @@
 namespace media {
 
 
-static TimeSourceObjectManager sManager;
-TimeSourceObjectManager* gTimeSourceObjectManager = &sManager;
+TimeSourceObjectManager* gTimeSourceObjectManager;
+       // initialized by BMediaRoster.
 
 
 TimeSourceObjectManager::TimeSourceObjectManager()


Other related posts:

  • » [haiku-commits] r34906 - in haiku/trunk: headers/private/media src/kits/media - axeld