haiku/src/servers/registrar/MessageDeliverer.h
Ingo Weinhold c6dbc50e2b * Added per-port sanity limits. We limit the number and summed size of
messages.
* We now maintain a second message list per port, which is sorted by
  timeout time. Thus we can drop timed out messages as early as possible.
* Fixed a bug which caused messages to disappear in the port list.
* Now delete a port not only when an error occurred when delivering a
  message, but also when it is empty.
* More debug output.

Seems to be working well now.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11142 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-01-30 00:54:59 +00:00

66 lines
1.8 KiB
C++

/*
* Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef MESSAGE_DELIVERER_H
#define MESSAGE_DELIVERER_H
#include <Locker.h>
#include <Messenger.h>
struct messaging_target;
class MessageDeliverer {
private:
MessageDeliverer();
~MessageDeliverer();
status_t Init();
public:
static status_t CreateDefault();
static void DeleteDefault();
static MessageDeliverer *Default();
status_t DeliverMessage(BMessage *message, BMessenger target,
bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(BMessage *message, port_id port, int32 token,
bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(const void *message, int32 messageSize,
BMessenger target, bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(const void *message, int32 messageSize,
port_id port, int32 token, bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(BMessage *message, const BMessenger *targets,
int32 targetCount,
bigtime_t timeout = B_INFINITE_TIMEOUT);
status_t DeliverMessage(const void *message, int32 messageSize,
const messaging_target *targets, int32 targetCount,
bigtime_t timeout = B_INFINITE_TIMEOUT);
private:
class Message;
class TargetMessage;
class TargetMessageHandle;
class TargetPort;
struct TargetPortMap;
TargetPort *_GetTargetPort(port_id portID, bool create = false);
void _PutTargetPort(TargetPort *port);
status_t _SendMessage(Message *message, port_id portID, int32 token);
static int32 _DelivererThreadEntry(void *data);
int32 _DelivererThread();
static MessageDeliverer *sDeliverer;
BLocker fLock;
TargetPortMap *fTargetPorts;
thread_id fDelivererThread;
volatile bool fTerminating;
};
#endif // MESSAGE_DELIVERER_H