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:
Ingo Weinhold
2009-12-01 09:36:23 +00:00
parent f39f7a05a2
commit f8ec4c04a0
3 changed files with 55 additions and 31 deletions
+6 -6
View File
@@ -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
View File
@@ -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.
*/ */
+6 -2
View File
@@ -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());
} }