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

169 lines
5.9 KiB
C++

// -*- C++ -*-
//=============================================================================
/**
* @file Activation_Queue.h
*
* @author Andres Kruse <Andres.Kruse@cern.ch>
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
*/
//=============================================================================
#ifndef ACE_ACTIVATION_QUEUE_H
#define ACE_ACTIVATION_QUEUE_H
#include /**/ "ace/pre.h"
#include /**/ "ace/ACE_export.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/Message_Queue.h"
#include "ace/Copy_Disabled.h"
#include "ace/Condition_Thread_Mutex.h"
/// Define to be compatible with the terminology in the POSA2 book!
#define ACE_Activation_List ACE_Activation_Queue
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Method_Request;
/**
* @class ACE_Activation_Queue
*
* @brief
* Reifies a method into a request. Subclasses typically
* represent necessary state and behavior.
*
* Maintains a priority-ordered queue of ACE_Method_Request objects.
* A scheduler class (often derived from ACE_Task) subsequently removes
* each method request and invokes its @c call() method.
*
* This class is discussed in depth in the Active Object chapter
* of POSA2. In that book, it is referred to as an Activation List.
*
* @sa ACE_Method_Request
*/
class ACE_Export ACE_Activation_Queue
{
public:
/// Constructor.
/**
* Initializes a new activation queue.
*
* @param new_queue The activation queue uses an ACE_Message_Queue to
* queue and order the method requests. If this argument
* is 0, a new ACE_Message_Queue is created for this
* object's use and will be deleted when this object is
* destroyed. If a non-zero pointer is supplied, the
* passed object will be used and will not be deleted when
* this object is destroyed. If an ACE_Task is being created
* to act as the scheduler, for instance, its
* ACE_Message_Queue pointer can be passed to this object.
* @param alloc Optional, the allocator to use when allocating
* ACE_Message_Block instances that wrap the method requests
* queued to this activation queue. Defaults to
* ACE_Allocator::instance().
* @param db_alloc Optional, the allocator to use when allocating
* data blocks for the ACE_Message_Block instances that
* wrap the method requests queued to this activation queue.
* Defaults to ACE_Allocator::instance().
*/
ACE_Activation_Queue (ACE_Message_Queue<ACE_SYNCH> *new_queue = 0,
ACE_Allocator *alloc = 0,
ACE_Allocator *db_alloc = 0);
/// Destructor.
virtual ~ACE_Activation_Queue (void);
// = Activate Queue operations.
/// Dequeue the next available ACE_Method_Request.
/**
* @param tv If 0, the method will block until a method request is
* available, else will wait until the absolute time specified
* in the referenced ACE_Time_Value. This method will return,
* earlier, however, if queue is closed, deactivated, or when
* a signal occurs.
*
* @retval Pointer to the dequeued ACE_Method_Request object.
* @retval 0 an error occurs; errno contains further information. If
* the specified timeout elapses, errno will be @c EWOULDBLOCK.
*/
ACE_Method_Request *dequeue (ACE_Time_Value *tv = 0);
/// Enqueue the ACE_Method_Request in priority order.
/**
* The priority of the method request is obtained via the @c priority()
* method of the queued method request. Priority ordering is determined
* by the ACE_Message_Queue class; 0 is the lowest priority.
*
* @param new_method_request Pointer to the ACE_Method_Request object to
* queue. This object's @c priority() method is called to obtain
* the priority.
* @param tv If 0, the method will block until the method request can
* be queued, else will wait until the absolute time specified
* in the referenced ACE_Time_Value. This method will return,
* earlier, however, if queue is closed, deactivated, or when
* a signal occurs.
*
* @retval >0 The number of method requests on the queue after adding
* the specified request.
* @retval -1 if an error occurs; errno contains further information. If
* the specified timeout elapses, errno will be @c EWOULDBLOCK.
*/
int enqueue (ACE_Method_Request *new_method_request, ACE_Time_Value *tv = 0);
/// Get the current number of method objects in the queue.
size_t method_count (void) const;
/// Returns 1 if the queue is empty, 0 otherwise.
int is_empty (void) const;
/// Returns 1 if the queue is full, 0 otherwise.
int is_full (void) const;
/// Dump the state of an request.
void dump (void) const;
/// Get a pointer to the underlying queue.
ACE_Message_Queue<ACE_SYNCH> *queue (void) const;
/// Set the pointer to the underlying queue.
void queue (ACE_Message_Queue<ACE_SYNCH> *q);
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Stores the Method_Requests.
ACE_Message_Queue<ACE_SYNCH> *queue_;
/// Keeps track of whether we need to delete the queue.
bool delete_queue_;
private:
/// Allocation strategy of the queue.
ACE_Allocator *allocator_;
/// Allocation strategy of the message blocks.
ACE_Allocator *data_block_allocator_;
ACE_UNIMPLEMENTED_FUNC (void operator= (const ACE_Activation_Queue &))
ACE_UNIMPLEMENTED_FUNC (ACE_Activation_Queue (const ACE_Activation_Queue &))
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "ace/Activation_Queue.inl"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* ACE_ACTIVATION_QUEUE_H */