Files
azerothcore-wotlk-pbot/modules/dep/acelite/ace/Message_Queue.h

227 lines
7.1 KiB
C++

// -*- C++ -*-
//=============================================================================
/**
* @file Message_Queue.h
*
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
*/
//=============================================================================
#ifndef ACE_MESSAGE_QUEUE_H
#define ACE_MESSAGE_QUEUE_H
#include /**/ "ace/pre.h"
#include "ace/Message_Block.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/IO_Cntl_Msg.h"
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
// Forward decls.
class ACE_Notification_Strategy;
template <ACE_SYNCH_DECL, class TIME_POLICY> class ACE_Message_Queue_Iterator;
template <ACE_SYNCH_DECL, class TIME_POLICY> class ACE_Message_Queue_Reverse_Iterator;
/**
* @class ACE_Message_Queue_Base
*
* @brief Base class for ACE_Message_Queue, which is the central
* queuing facility for messages in the ACE framework.
*
* For all the ACE_Time_Value pointer parameters the caller will
* block until action is possible if @a timeout == 0. Otherwise, it
* will wait until the absolute time specified in *@a timeout
* elapses.
*
* A queue is always in one of three states:
* . ACTIVATED
* . DEACTIVATED
* . PULSED
*/
class ACE_Export ACE_Message_Queue_Base
{
public:
enum
{
// Default high and low watermarks.
/// Default high watermark (16 K).
DEFAULT_HWM = 16 * 1024,
/// Default low watermark (same as high water mark).
DEFAULT_LWM = 16 * 1024,
// Queue states. Before PULSED state was added, the activate()
// and deactivate() methods returned WAS_INACTIVE or WAS_ACTIVE
// to indicate the previous condition. Now those methods
// return the state the queue was previously in. WAS_ACTIVE
// and WAS_INACTIVE are defined to match previous semantics for
// applications that don't use the PULSED state.
/// Message queue is active and processing normally
ACTIVATED = 1,
/// Queue is deactivated; no enqueue or dequeue operations allowed.
DEACTIVATED = 2,
/// Message queue was pulsed; enqueue and dequeue may proceed normally.
PULSED = 3
};
ACE_Message_Queue_Base (void);
/// Close down the message queue and release all resources.
virtual int close (void) = 0;
/// Close down the message queue and release all resources.
virtual ~ACE_Message_Queue_Base (void);
// = Enqueue and dequeue methods.
/**
* Retrieve the first ACE_Message_Block without removing it. Note
* that @a timeout uses <{absolute}> time rather than <{relative}>
* time. If the @a timeout elapses without receiving a message -1 is
* returned and @c errno is set to @c EWOULDBLOCK. If the queue is
* deactivated -1 is returned and @c errno is set to @c ESHUTDOWN.
* Otherwise, returns -1 on failure, else the number of items still
* on the queue.
*/
virtual int peek_dequeue_head (ACE_Message_Block *&first_item,
ACE_Time_Value *timeout = 0) = 0;
/**
* Enqueue a <ACE_Message_Block *> into the tail of the queue.
* Returns number of items in queue if the call succeeds or -1
* otherwise. These calls return -1 when queue is closed,
* deactivated (in which case @c errno == @c ESHUTDOWN), when a signal
* occurs (in which case @c errno == @c EINTR, or if the time
* specified in timeout elapses (in which case @c errno ==
* @c EWOULDBLOCK).
*/
virtual int enqueue_tail (ACE_Message_Block *new_item,
ACE_Time_Value *timeout = 0) = 0;
virtual int enqueue (ACE_Message_Block *new_item,
ACE_Time_Value *timeout = 0) = 0;
/**
* Dequeue and return the <ACE_Message_Block *> at the head of the
* queue. Returns number of items in queue if the call succeeds or
* -1 otherwise. These calls return -1 when queue is closed,
* deactivated (in which case @c errno == @c ESHUTDOWN), when a signal
* occurs (in which case @c errno == @c EINTR, or if the time
* specified in timeout elapses (in which case @c errno ==
* @c EWOULDBLOCK).
*/
virtual int dequeue_head (ACE_Message_Block *&first_item,
ACE_Time_Value *timeout = 0) = 0;
virtual int dequeue (ACE_Message_Block *&first_item,
ACE_Time_Value *timeout = 0) = 0;
// = Check if queue is full/empty.
/// True if queue is full, else false.
virtual bool is_full (void) = 0;
/// True if queue is empty, else false.
virtual bool is_empty (void) = 0;
// = Queue statistic methods.
/// Number of total bytes on the queue, i.e., sum of the message
/// block sizes.
virtual size_t message_bytes (void) = 0;
/// Number of total length on the queue, i.e., sum of the message
/// block lengths.
virtual size_t message_length (void) = 0;
/// Number of total messages on the queue.
virtual size_t message_count (void) = 0;
/// New value of the number of total bytes on the queue, i.e.,
/// sum of the message block sizes.
virtual void message_bytes (size_t new_size) = 0;
/// New value of the number of total length on the queue, i.e.,
/// sum of the message block lengths.
virtual void message_length (size_t new_length) = 0;
// = Activation control methods.
/**
* Deactivate the queue and wake up all threads waiting on the queue
* so they can continue. No messages are removed from the queue,
* however. Any other operations called until the queue is
* activated again will immediately return -1 with @c errno
* ESHUTDOWN.
*
* @retval The queue's state before this call.
*/
virtual int deactivate (void) = 0;
/**
* Reactivate the queue so that threads can enqueue and dequeue
* messages again.
*
* @retval The queue's state before this call.
*/
virtual int activate (void) = 0;
/**
* Pulse the queue to wake up any waiting threads. Changes the
* queue state to PULSED; future enqueue/dequeue operations proceed
* as in ACTIVATED state.
*
* @retval The queue's state before this call.
*/
virtual int pulse (void) = 0;
/// Returns the current state of the queue.
virtual int state (void);
/// Returns 1 if the state of the queue is DEACTIVATED,
/// and 0 if the queue's state is ACTIVATED or PULSED.
virtual int deactivated (void) = 0;
/// Get the notification strategy for the Message_Queue
virtual ACE_Notification_Strategy *notification_strategy (void) = 0;
/// Set the notification strategy for the Message_Queue
virtual void notification_strategy (ACE_Notification_Strategy *s) = 0;
// = Notification hook.
/// Dump the state of an object.
virtual void dump (void) const = 0;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
private:
// = Disallow copying and assignment.
ACE_Message_Queue_Base (const ACE_Message_Queue_Base &);
void operator= (const ACE_Message_Queue_Base &);
protected:
/// Indicates the state of the queue, which can be
/// <ACTIVATED>, <DEACTIVATED>, or <PULSED>.
int state_;
};
ACE_END_VERSIONED_NAMESPACE_DECL
// Include the templates here.
#include "ace/Message_Queue_T.h"
#if defined (__ACE_INLINE__)
#include "ace/Message_Queue.inl"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* ACE_MESSAGE_QUEUE_H */