* 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:
Axel Dörfler
2010-01-05 16:53:55 +00:00
parent 675d0b6264
commit f0a1eb2dba
5 changed files with 51 additions and 51 deletions
+2
View File
@@ -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);
+12 -26
View File
@@ -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));
+2 -2
View File
@@ -66,8 +66,8 @@ namespace BPrivate {
namespace media {
static DormantNodeManager sManager;
DormantNodeManager* gDormantNodeManager = &sManager;
DormantNodeManager* gDormantNodeManager;
// initialized by BMediaRoster.
DormantNodeManager::DormantNodeManager()
+33 -21
View File
@@ -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()
+2 -2
View File
@@ -26,8 +26,8 @@ namespace BPrivate {
namespace media {
static TimeSourceObjectManager sManager;
TimeSourceObjectManager* gTimeSourceObjectManager = &sManager;
TimeSourceObjectManager* gTimeSourceObjectManager;
// initialized by BMediaRoster.
TimeSourceObjectManager::TimeSourceObjectManager()