diff --git a/headers/os/app/Roster.h b/headers/os/app/Roster.h index 8b3b664ca0..50a6612b0e 100644 --- a/headers/os/app/Roster.h +++ b/headers/os/app/Roster.h @@ -1,9 +1,6 @@ /* - * Copyright 2001-2007, Haiku. + * Copyright 2001-2009, Haiku, Inc. * Distributed under the terms of the MIT License. - * - * Authors: - * Ingo Weinhold (bonefish@users.sf.net) */ #ifndef _ROSTER_H #define _ROSTER_H @@ -166,7 +163,9 @@ class BRoster { status_t _SendToRunning(team_id team, int argc, const char *const *args, const BList *messageList, const entry_ref *ref, bool readyToRun) const; - void _InitMessengers(); + void _InitMessenger(); + static status_t _InitMimeMessenger(void* data); + BMessenger& _MimeMessenger(); void _AddToRecentApps(const char *appSig) const; void _ClearRecentDocuments() const; void _ClearRecentFolders() const; @@ -176,7 +175,8 @@ class BRoster { BMessenger fMessenger; BMessenger fMimeMessenger; - uint32 _reserved[3]; + int32 fMimeMessengerInitOnce; + uint32 _reserved[2]; }; // global BRoster instance diff --git a/src/kits/app/Roster.cpp b/src/kits/app/Roster.cpp index 1c2f6bb6da..3d7df462ed 100644 --- a/src/kits/app/Roster.cpp +++ b/src/kits/app/Roster.cpp @@ -1,9 +1,9 @@ /* - * Copyright 2001-2009, Haiku. + * Copyright 2001-2009, Haiku, Inc. * Distributed under the terms of the MIT License. * * Authors: - * Ingo Weinhold (bonefish@users.sf.net) + * Ingo Weinhold (ingo_weinhold@gmx.de) * Axel Dörfler, axeld@pinc-software.de */ @@ -42,6 +42,8 @@ #include #include +#include + #include #include #include @@ -534,9 +536,10 @@ BRoster::ArgVector::Unset() BRoster::BRoster() : 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 -BRoster::_InitMessengers() +BRoster::_InitMessenger() { DBG(OUT("BRoster::InitMessengers()\n")); @@ -2781,29 +2784,46 @@ BRoster::_InitMessengers() BMessenger::Private(fMessenger).SetTo(info.team, rosterPort, 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")); } +/*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 given signature to the front of the recent apps list. */ diff --git a/src/kits/app/RosterPrivate.cpp b/src/kits/app/RosterPrivate.cpp index 3e8d9bff5c..06f730c540 100644 --- a/src/kits/app/RosterPrivate.cpp +++ b/src/kits/app/RosterPrivate.cpp @@ -11,8 +11,11 @@ #include + #include +#include + /*! \class BRoster::Private \brief Class used to access private BRoster members. @@ -32,6 +35,7 @@ BRoster::Private::SetTo(BMessenger mainMessenger, BMessenger mimeMessenger) if (fRoster != NULL) { fRoster->fMessenger = mainMessenger; 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; if (mime) - return fRoster->fMimeMessenger.SendMessage(message, reply); + return fRoster->_MimeMessenger().SendMessage(message, reply); return fRoster->fMessenger.SendMessage(message, reply); } @@ -80,7 +84,7 @@ BRoster::Private::SendTo(BMessage *message, BMessage *reply, bool mime) bool BRoster::Private::IsMessengerValid(bool mime) const { - return fRoster != NULL && (mime ? fRoster->fMimeMessenger.IsValid() + return fRoster != NULL && (mime ? fRoster->_MimeMessenger().IsValid() : fRoster->fMessenger.IsValid()); }