* 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). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34906 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -16,6 +16,8 @@ namespace media {
|
||||
namespace dataexchange {
|
||||
|
||||
|
||||
void InitDataExchange();
|
||||
|
||||
// BMessage based data exchange with the media_server
|
||||
status_t SendToServer(BMessage* msg);
|
||||
status_t QueryServer(BMessage& request, BMessage& reply);
|
||||
|
||||
@@ -24,36 +24,13 @@ namespace media {
|
||||
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 @@ find_media_addon_server_port()
|
||||
// #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 @@ SendToServer(BMessage* msg)
|
||||
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));
|
||||
|
||||
@@ -66,8 +66,8 @@ namespace BPrivate {
|
||||
namespace media {
|
||||
|
||||
|
||||
static DormantNodeManager sManager;
|
||||
DormantNodeManager* gDormantNodeManager = &sManager;
|
||||
DormantNodeManager* gDormantNodeManager;
|
||||
// initialized by BMediaRoster.
|
||||
|
||||
|
||||
DormantNodeManager::DormantNodeManager()
|
||||
|
||||
@@ -69,36 +69,45 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002-2006 Marcus "
|
||||
#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 @@ BMediaRoster::~BMediaRoster()
|
||||
{
|
||||
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 @@ BMediaRoster::~BMediaRoster()
|
||||
// #pragma mark - private BMediaRoster
|
||||
|
||||
|
||||
// deprecated call
|
||||
//! Deprecated call.
|
||||
status_t
|
||||
BMediaRoster::SetOutputBuffersFor(const media_source& output,
|
||||
BBufferGroup* group, bool willReclaim)
|
||||
@@ -3174,15 +3186,15 @@ BMediaRoster::SetOutputBuffersFor(const media_source& output,
|
||||
}
|
||||
|
||||
|
||||
/* 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()
|
||||
|
||||
@@ -26,8 +26,8 @@ namespace BPrivate {
|
||||
namespace media {
|
||||
|
||||
|
||||
static TimeSourceObjectManager sManager;
|
||||
TimeSourceObjectManager* gTimeSourceObjectManager = &sManager;
|
||||
TimeSourceObjectManager* gTimeSourceObjectManager;
|
||||
// initialized by BMediaRoster.
|
||||
|
||||
|
||||
TimeSourceObjectManager::TimeSourceObjectManager()
|
||||
|
||||
Reference in New Issue
Block a user