* 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 {
|
namespace dataexchange {
|
||||||
|
|
||||||
|
|
||||||
|
void InitDataExchange();
|
||||||
|
|
||||||
// BMessage based data exchange with the media_server
|
// BMessage based data exchange with the media_server
|
||||||
status_t SendToServer(BMessage* msg);
|
status_t SendToServer(BMessage* msg);
|
||||||
status_t QueryServer(BMessage& request, BMessage& reply);
|
status_t QueryServer(BMessage& request, BMessage& reply);
|
||||||
|
|||||||
@@ -24,36 +24,13 @@ namespace media {
|
|||||||
namespace dataexchange {
|
namespace dataexchange {
|
||||||
|
|
||||||
|
|
||||||
BMessenger* gMediaServerMessenger;
|
static BMessenger sMediaServerMessenger;
|
||||||
static port_id sMediaServerPort;
|
static port_id sMediaServerPort;
|
||||||
static port_id sMediaAddonServerPort;
|
static port_id sMediaAddonServerPort;
|
||||||
|
|
||||||
static void find_media_server_port();
|
static void find_media_server_port();
|
||||||
static void find_media_addon_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
|
static void
|
||||||
find_media_server_port()
|
find_media_server_port()
|
||||||
@@ -80,11 +57,20 @@ find_media_addon_server_port()
|
|||||||
// #pragma mark -
|
// #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
|
//! BMessage based data exchange with the media_server
|
||||||
status_t
|
status_t
|
||||||
SendToServer(BMessage* msg)
|
SendToServer(BMessage* msg)
|
||||||
{
|
{
|
||||||
status_t status = GetMediaServerMessenger()->SendMessage(msg,
|
status_t status = sMediaServerMessenger.SendMessage(msg,
|
||||||
static_cast<BHandler*>(NULL), TIMEOUT);
|
static_cast<BHandler*>(NULL), TIMEOUT);
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
ERROR("SendToServer: SendMessage failed: %s\n", strerror(status));
|
ERROR("SendToServer: SendMessage failed: %s\n", strerror(status));
|
||||||
@@ -97,7 +83,7 @@ SendToServer(BMessage* msg)
|
|||||||
status_t
|
status_t
|
||||||
QueryServer(BMessage& request, BMessage& reply)
|
QueryServer(BMessage& request, BMessage& reply)
|
||||||
{
|
{
|
||||||
status_t status = GetMediaServerMessenger()->SendMessage(&request, &reply,
|
status_t status = sMediaServerMessenger.SendMessage(&request, &reply,
|
||||||
TIMEOUT, TIMEOUT);
|
TIMEOUT, TIMEOUT);
|
||||||
if (status != B_OK) {
|
if (status != B_OK) {
|
||||||
ERROR("QueryServer: SendMessage failed: %s\n", strerror(status));
|
ERROR("QueryServer: SendMessage failed: %s\n", strerror(status));
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ namespace BPrivate {
|
|||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
|
|
||||||
static DormantNodeManager sManager;
|
DormantNodeManager* gDormantNodeManager;
|
||||||
DormantNodeManager* gDormantNodeManager = &sManager;
|
// initialized by BMediaRoster.
|
||||||
|
|
||||||
|
|
||||||
DormantNodeManager::DormantNodeManager()
|
DormantNodeManager::DormantNodeManager()
|
||||||
|
|||||||
@@ -69,36 +69,45 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002-2006 Marcus "
|
|||||||
#include "TimeSourceObjectManager.h"
|
#include "TimeSourceObjectManager.h"
|
||||||
|
|
||||||
|
|
||||||
namespace BPrivate { namespace media {
|
namespace BPrivate {
|
||||||
|
namespace media {
|
||||||
|
|
||||||
// the BMediaRoster destructor is private,
|
|
||||||
// but _DefaultDeleter is a friend class of
|
class MediaInitializer {
|
||||||
// the BMediaRoster an thus can delete it
|
|
||||||
class DefaultDeleter {
|
|
||||||
public:
|
public:
|
||||||
~DefaultDeleter()
|
MediaInitializer()
|
||||||
{
|
{
|
||||||
if (BMediaRoster::sDefaultInstance != NULL) {
|
InitDataExchange();
|
||||||
BMediaRoster::sDefaultInstance->Lock();
|
}
|
||||||
BMediaRoster::sDefaultInstance->Quit();
|
|
||||||
|
~MediaInitializer()
|
||||||
|
{
|
||||||
|
if (BMediaRoster::CurrentRoster() != NULL) {
|
||||||
|
BMediaRoster::CurrentRoster()->Lock();
|
||||||
|
BMediaRoster::CurrentRoster()->Quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
} // namespace BPrivate
|
} // namespace BPrivate
|
||||||
|
|
||||||
using namespace BPrivate::media;
|
using namespace BPrivate::media;
|
||||||
|
|
||||||
|
|
||||||
// DefaultDeleter will delete the BMediaRoster object in it's destructor.
|
static MediaInitializer sInitializer;
|
||||||
DefaultDeleter _deleter;
|
|
||||||
|
|
||||||
|
|
||||||
BMediaRosterEx::BMediaRosterEx(status_t* _error)
|
BMediaRosterEx::BMediaRosterEx(status_t* _error)
|
||||||
:
|
:
|
||||||
BMediaRoster()
|
BMediaRoster()
|
||||||
{
|
{
|
||||||
|
InitDataExchange();
|
||||||
|
|
||||||
|
gDormantNodeManager = new DormantNodeManager;
|
||||||
|
gTimeSourceObjectManager = new TimeSourceObjectManager;
|
||||||
|
|
||||||
// register this application with the media server
|
// register this application with the media server
|
||||||
server_register_app_request request;
|
server_register_app_request request;
|
||||||
server_register_app_reply reply;
|
server_register_app_reply reply;
|
||||||
@@ -3145,6 +3154,9 @@ BMediaRoster::~BMediaRoster()
|
|||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
|
||||||
|
delete gTimeSourceObjectManager;
|
||||||
|
delete gDormantNodeManager;
|
||||||
|
|
||||||
// unregister this application with the media server
|
// unregister this application with the media server
|
||||||
server_unregister_app_request request;
|
server_unregister_app_request request;
|
||||||
server_unregister_app_reply reply;
|
server_unregister_app_reply reply;
|
||||||
@@ -3163,7 +3175,7 @@ BMediaRoster::~BMediaRoster()
|
|||||||
// #pragma mark - private BMediaRoster
|
// #pragma mark - private BMediaRoster
|
||||||
|
|
||||||
|
|
||||||
// deprecated call
|
//! Deprecated call.
|
||||||
status_t
|
status_t
|
||||||
BMediaRoster::SetOutputBuffersFor(const media_source& output,
|
BMediaRoster::SetOutputBuffersFor(const media_source& output,
|
||||||
BBufferGroup* group, bool willReclaim)
|
BBufferGroup* group, bool willReclaim)
|
||||||
@@ -3174,15 +3186,15 @@ BMediaRoster::SetOutputBuffersFor(const media_source& output,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FBC reserved virtuals */
|
// FBC reserved virtuals
|
||||||
status_t BMediaRoster::_Reserved_MediaRoster_0(void *) { return B_ERROR; }
|
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_1(void*) { return B_ERROR; }
|
||||||
status_t BMediaRoster::_Reserved_MediaRoster_2(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_3(void*) { return B_ERROR; }
|
||||||
status_t BMediaRoster::_Reserved_MediaRoster_4(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_5(void*) { return B_ERROR; }
|
||||||
status_t BMediaRoster::_Reserved_MediaRoster_6(void *) { return B_ERROR; }
|
status_t BMediaRoster::_Reserved_MediaRoster_6(void*) { return B_ERROR; }
|
||||||
status_t BMediaRoster::_Reserved_MediaRoster_7(void *) { return B_ERROR; }
|
status_t BMediaRoster::_Reserved_MediaRoster_7(void*) { return B_ERROR; }
|
||||||
|
|
||||||
|
|
||||||
BMediaRoster::BMediaRoster()
|
BMediaRoster::BMediaRoster()
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ namespace BPrivate {
|
|||||||
namespace media {
|
namespace media {
|
||||||
|
|
||||||
|
|
||||||
static TimeSourceObjectManager sManager;
|
TimeSourceObjectManager* gTimeSourceObjectManager;
|
||||||
TimeSourceObjectManager* gTimeSourceObjectManager = &sManager;
|
// initialized by BMediaRoster.
|
||||||
|
|
||||||
|
|
||||||
TimeSourceObjectManager::TimeSourceObjectManager()
|
TimeSourceObjectManager::TimeSourceObjectManager()
|
||||||
|
|||||||
Reference in New Issue
Block a user