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()