From 634f747e2979b7d12f338e4534fc87efe4ab7506 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 29 Jan 2005 17:49:32 +0000 Subject: [PATCH] Now we use the MessageDeliverer to send asynchronous messages to other apps. Seems to work when the target port is not full. The other case has not been tested yet. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11133 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../registrar/MessageRunnerManager.cpp | 20 +++++++++- src/servers/registrar/TRoster.cpp | 39 ++++++++++++++++--- src/servers/registrar/Watcher.cpp | 3 +- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/servers/registrar/MessageRunnerManager.cpp b/src/servers/registrar/MessageRunnerManager.cpp index f1b5aa3692..7f8cd80751 100644 --- a/src/servers/registrar/MessageRunnerManager.cpp +++ b/src/servers/registrar/MessageRunnerManager.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,7 @@ #include "Debug.h" #include "Event.h" #include "EventQueue.h" +#include "MessageDeliverer.h" #include "MessageRunnerManager.h" /*! \class MessageRunnerManager @@ -163,7 +165,23 @@ struct MessageRunnerManager::RunnerInfo { { if (count > 0) count--; - status_t error = target.SendMessage(message, replyTarget, 0); + + // set the reply target + BMessage::Private(message).SetReply(replyTarget); + + // deliver the message: We use the MessageDeliverer to allow the + // message to be delivered, even if the target port is temporarily + // full. For periodic message runners, that have to deliver further + // messages, we restrict the delivery timeout to the message interval. + status_t error; + if (count > 0) { + error = MessageDeliverer::Default()->DeliverMessage(message, target, + interval); + } else { + error = MessageDeliverer::Default()->DeliverMessage(message, + target); + } + // B_WOULD_BLOCK is as good as B_OK. We return an error only, if // there are serious problems with the target, i.e. if it doesn't // exist anymore for instance. A full message port is harmless. diff --git a/src/servers/registrar/TRoster.cpp b/src/servers/registrar/TRoster.cpp index b6691f01e4..365df2d418 100644 --- a/src/servers/registrar/TRoster.cpp +++ b/src/servers/registrar/TRoster.cpp @@ -29,8 +29,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -39,11 +41,12 @@ #include #include "Debug.h" +#include "EventMaskWatcher.h" +#include "MessageDeliverer.h" #include "RegistrarDefs.h" #include "RosterAppInfo.h" #include "RosterSettingsCharStream.h" #include "TRoster.h" -#include "EventMaskWatcher.h" using namespace BPrivate; @@ -717,6 +720,16 @@ TRoster::HandleBroadcast(BMessage *request) && request->FindMessenger("reply_target", &replyTarget) != B_OK) { error = B_BAD_VALUE; } + + // allocate an error for the message targets + BMessenger *targets = NULL; + if (error == B_OK) { + targets = new(nothrow) BMessenger[fRegisteredApps.CountInfos()]; + if (!targets) + error = B_NO_MEMORY; + } + ArrayDeleter targetsDeleter(targets); + // reply to the request -- do this first, don't let the inquirer wait if (error == B_OK) { BMessage reply(B_REG_SUCCESS); @@ -726,20 +739,31 @@ TRoster::HandleBroadcast(BMessage *request) reply.AddInt32("error", error); request->SendReply(&reply); } + // broadcast the message team_id registrarTeam = BPrivate::current_team(); if (error == B_OK) { + // get the list of targets + int32 targetCount = 0; for (AppInfoList::Iterator it = fRegisteredApps.It(); it.IsValid(); ++it) { // don't send the message to the requesting team or the registrar if ((*it)->team != team && (*it)->team != registrarTeam) { - BMessenger messenger; - BMessenger::Private messengerPrivate(messenger); + BMessenger::Private messengerPrivate(targets[targetCount]); messengerPrivate.SetTo((*it)->team, (*it)->port, 0, true); - messenger.SendMessage(&message, replyTarget, 0); + targetCount++; } } + + if (targetCount > 0) { + // set the reply target + BMessage::Private(message).SetReply(replyTarget); + + // send the messages + MessageDeliverer::Default()->DeliverMessage(&message, targets, + targetCount); + } } FUNCTION_END(); @@ -1208,7 +1232,9 @@ TRoster::_AppActivated(RosterAppInfo *info) messengerPrivate.SetTo(info->team, info->port, 0, true); BMessage message(B_APP_ACTIVATED); message.AddBool("active", true); - messenger.SendMessage(&message); + // not sure, if it makes sense to use the MessageDeliverer here + MessageDeliverer::Default()->DeliverMessage(&message, messenger); + // notify the watchers BMessage watcherMessage(B_SOME_APP_ACTIVATED); _AddMessageWatchingInfo(&watcherMessage, info); @@ -1234,7 +1260,8 @@ TRoster::_AppDeactivated(RosterAppInfo *info) messengerPrivate.SetTo(info->team, info->port, 0, true); BMessage message(B_APP_ACTIVATED); message.AddBool("active", false); - messenger.SendMessage(&message); + // not sure, if it makes sense to use the MessageDeliverer here + MessageDeliverer::Default()->DeliverMessage(&message, messenger); } } } diff --git a/src/servers/registrar/Watcher.cpp b/src/servers/registrar/Watcher.cpp index 41aabf6b3c..4cfc356155 100644 --- a/src/servers/registrar/Watcher.cpp +++ b/src/servers/registrar/Watcher.cpp @@ -27,6 +27,7 @@ #include +#include "MessageDeliverer.h" #include "Watcher.h" // Watcher @@ -88,7 +89,7 @@ Watcher::Target() const status_t Watcher::SendMessage(BMessage *message) { - return fTarget.SendMessage(message, (BHandler*)NULL, 0); + return MessageDeliverer::Default()->DeliverMessage(message, fTarget); }