Initialize BRoster's MIME messenger lazily.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34402 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,9 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2007, Haiku.
|
* Copyright 2001-2009, Haiku, Inc.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Ingo Weinhold ([email protected])
|
|
||||||
*/
|
*/
|
||||||
#ifndef _ROSTER_H
|
#ifndef _ROSTER_H
|
||||||
#define _ROSTER_H
|
#define _ROSTER_H
|
||||||
@@ -166,7 +163,9 @@ class BRoster {
|
|||||||
status_t _SendToRunning(team_id team, int argc, const char *const *args,
|
status_t _SendToRunning(team_id team, int argc, const char *const *args,
|
||||||
const BList *messageList, const entry_ref *ref,
|
const BList *messageList, const entry_ref *ref,
|
||||||
bool readyToRun) const;
|
bool readyToRun) const;
|
||||||
void _InitMessengers();
|
void _InitMessenger();
|
||||||
|
static status_t _InitMimeMessenger(void* data);
|
||||||
|
BMessenger& _MimeMessenger();
|
||||||
void _AddToRecentApps(const char *appSig) const;
|
void _AddToRecentApps(const char *appSig) const;
|
||||||
void _ClearRecentDocuments() const;
|
void _ClearRecentDocuments() const;
|
||||||
void _ClearRecentFolders() const;
|
void _ClearRecentFolders() const;
|
||||||
@@ -176,7 +175,8 @@ class BRoster {
|
|||||||
|
|
||||||
BMessenger fMessenger;
|
BMessenger fMessenger;
|
||||||
BMessenger fMimeMessenger;
|
BMessenger fMimeMessenger;
|
||||||
uint32 _reserved[3];
|
int32 fMimeMessengerInitOnce;
|
||||||
|
uint32 _reserved[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
// global BRoster instance
|
// global BRoster instance
|
||||||
|
|||||||
+43
-23
@@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2001-2009, Haiku.
|
* Copyright 2001-2009, Haiku, Inc.
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Authors:
|
* Authors:
|
||||||
* Ingo Weinhold ([email protected])
|
* Ingo Weinhold ([email protected])
|
||||||
* Axel Dörfler, [email protected]
|
* Axel Dörfler, [email protected]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -42,6 +42,8 @@
|
|||||||
#include <Volume.h>
|
#include <Volume.h>
|
||||||
#include <VolumeRoster.h>
|
#include <VolumeRoster.h>
|
||||||
|
|
||||||
|
#include <locks.h>
|
||||||
|
|
||||||
#include <AppMisc.h>
|
#include <AppMisc.h>
|
||||||
#include <DesktopLink.h>
|
#include <DesktopLink.h>
|
||||||
#include <MessengerPrivate.h>
|
#include <MessengerPrivate.h>
|
||||||
@@ -534,9 +536,10 @@ BRoster::ArgVector::Unset()
|
|||||||
BRoster::BRoster()
|
BRoster::BRoster()
|
||||||
:
|
:
|
||||||
fMessenger(),
|
fMessenger(),
|
||||||
fMimeMessenger()
|
fMimeMessenger(),
|
||||||
|
fMimeMessengerInitOnce(INIT_ONCE_UNINITIALIZED)
|
||||||
{
|
{
|
||||||
_InitMessengers();
|
_InitMessenger();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2769,7 +2772,7 @@ BRoster::_SendToRunning(team_id team, int argc, const char* const* args,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BRoster::_InitMessengers()
|
BRoster::_InitMessenger()
|
||||||
{
|
{
|
||||||
DBG(OUT("BRoster::InitMessengers()\n"));
|
DBG(OUT("BRoster::InitMessengers()\n"));
|
||||||
|
|
||||||
@@ -2781,29 +2784,46 @@ BRoster::_InitMessengers()
|
|||||||
|
|
||||||
BMessenger::Private(fMessenger).SetTo(info.team, rosterPort,
|
BMessenger::Private(fMessenger).SetTo(info.team, rosterPort,
|
||||||
B_PREFERRED_TOKEN);
|
B_PREFERRED_TOKEN);
|
||||||
|
|
||||||
// ask for the MIME messenger
|
|
||||||
// Generous 1s + 5s timeouts. It could actually be synchronous, but
|
|
||||||
// timeouts allow us to debug the registrar main thread.
|
|
||||||
BMessage request(B_REG_GET_MIME_MESSENGER);
|
|
||||||
BMessage reply;
|
|
||||||
status_t error = fMessenger.SendMessage(&request, &reply, 1000000LL,
|
|
||||||
5000000LL);
|
|
||||||
if (error == B_OK && reply.what == B_REG_SUCCESS) {
|
|
||||||
DBG(OUT(" got reply from roster\n"));
|
|
||||||
reply.FindMessenger("messenger", &fMimeMessenger);
|
|
||||||
} else {
|
|
||||||
DBG(OUT(" no (useful) reply from roster: error: %lx: %s\n", error,
|
|
||||||
strerror(error)));
|
|
||||||
if (error == B_OK)
|
|
||||||
DBG(reply.PrintToStream());
|
|
||||||
fMessenger = BMessenger();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBG(OUT("BRoster::InitMessengers() done\n"));
|
DBG(OUT("BRoster::InitMessengers() done\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ status_t
|
||||||
|
BRoster::_InitMimeMessenger(void* data)
|
||||||
|
{
|
||||||
|
BRoster* roster = (BRoster*)data;
|
||||||
|
|
||||||
|
// ask for the MIME messenger
|
||||||
|
// Generous 1s + 5s timeouts. It could actually be synchronous, but
|
||||||
|
// timeouts allow us to debug the registrar main thread.
|
||||||
|
BMessage request(B_REG_GET_MIME_MESSENGER);
|
||||||
|
BMessage reply;
|
||||||
|
status_t error = roster->fMessenger.SendMessage(&request, &reply, 1000000LL,
|
||||||
|
5000000LL);
|
||||||
|
if (error == B_OK && reply.what == B_REG_SUCCESS) {
|
||||||
|
DBG(OUT(" got reply from roster\n"));
|
||||||
|
reply.FindMessenger("messenger", &roster->fMimeMessenger);
|
||||||
|
} else {
|
||||||
|
DBG(OUT(" no (useful) reply from roster: error: %lx: %s\n", error,
|
||||||
|
strerror(error)));
|
||||||
|
if (error == B_OK)
|
||||||
|
DBG(reply.PrintToStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BMessenger&
|
||||||
|
BRoster::_MimeMessenger()
|
||||||
|
{
|
||||||
|
__init_once(&fMimeMessengerInitOnce, &_InitMimeMessenger, this);
|
||||||
|
return fMimeMessenger;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Sends a request to the roster to add the application with the
|
/*! \brief Sends a request to the roster to add the application with the
|
||||||
given signature to the front of the recent apps list.
|
given signature to the front of the recent apps list.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -11,8 +11,11 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <RosterPrivate.h>
|
#include <RosterPrivate.h>
|
||||||
|
|
||||||
#include <Roster.h>
|
#include <Roster.h>
|
||||||
|
|
||||||
|
#include <locks.h>
|
||||||
|
|
||||||
|
|
||||||
/*! \class BRoster::Private
|
/*! \class BRoster::Private
|
||||||
\brief Class used to access private BRoster members.
|
\brief Class used to access private BRoster members.
|
||||||
@@ -32,6 +35,7 @@ BRoster::Private::SetTo(BMessenger mainMessenger, BMessenger mimeMessenger)
|
|||||||
if (fRoster != NULL) {
|
if (fRoster != NULL) {
|
||||||
fRoster->fMessenger = mainMessenger;
|
fRoster->fMessenger = mainMessenger;
|
||||||
fRoster->fMimeMessenger = mimeMessenger;
|
fRoster->fMimeMessenger = mimeMessenger;
|
||||||
|
fRoster->fMimeMessengerInitOnce = INIT_ONCE_INITIALIZED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +66,7 @@ BRoster::Private::SendTo(BMessage *message, BMessage *reply, bool mime)
|
|||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
|
|
||||||
if (mime)
|
if (mime)
|
||||||
return fRoster->fMimeMessenger.SendMessage(message, reply);
|
return fRoster->_MimeMessenger().SendMessage(message, reply);
|
||||||
|
|
||||||
return fRoster->fMessenger.SendMessage(message, reply);
|
return fRoster->fMessenger.SendMessage(message, reply);
|
||||||
}
|
}
|
||||||
@@ -80,7 +84,7 @@ BRoster::Private::SendTo(BMessage *message, BMessage *reply, bool mime)
|
|||||||
bool
|
bool
|
||||||
BRoster::Private::IsMessengerValid(bool mime) const
|
BRoster::Private::IsMessengerValid(bool mime) const
|
||||||
{
|
{
|
||||||
return fRoster != NULL && (mime ? fRoster->fMimeMessenger.IsValid()
|
return fRoster != NULL && (mime ? fRoster->_MimeMessenger().IsValid()
|
||||||
: fRoster->fMessenger.IsValid());
|
: fRoster->fMessenger.IsValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user