#include <ace/Stream.h>
template<ACE_SYNCH_DECL> class ACE_Stream {
public:
friend class ACE_Stream_Iterator<ACE_SYNCH_USE>;
enum{ M_DELETE = 3 };
ACE_Stream ( void *arg = 0, ACE_Module<ACE_SYNCH_USE> *head = 0, ACE_Module<ACE_SYNCH_USE> *tail = 0 );
virtual int open ( void *arg, ACE_Module<ACE_SYNCH_USE> *head = 0, ACE_Module<ACE_SYNCH_USE> *tail = 0 );
virtual int close (int flags = M_DELETE);
virtual ~ACE_Stream (void);
virtual int push (ACE_Module<ACE_SYNCH_USE> *mod);
virtual int pop (int flags = M_DELETE);
virtual int top (ACE_Module<ACE_SYNCH_USE> *&mod);
virtual int remove (const ASYS_TCHAR *mod, int flags = M_DELETE);
virtual ACE_Module<ACE_SYNCH_USE> *head (void);
virtual ACE_Module<ACE_SYNCH_USE> *tail (void);
virtual ACE_Module<ACE_SYNCH_USE> *find (const ASYS_TCHAR *mod);
virtual int link (ACE_Stream<ACE_SYNCH_USE> &);
virtual int unlink (void);
virtual int put ( ACE_Message_Block *mb, ACE_Time_Value *timeout = 0 );
virtual int get ( ACE_Message_Block *&mb, ACE_Time_Value *timeout = 0 );
virtual int control ( ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd, void *args );
virtual int wait (void);
virtual void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
private:
int unlink_i (void);
int link_i (ACE_Stream<ACE_SYNCH_USE> &);
int push_module ( ACE_Module<ACE_SYNCH_USE> *, ACE_Module<ACE_SYNCH_USE> * = 0, ACE_Module<ACE_SYNCH_USE> * = 0 );
ACE_Module<ACE_SYNCH_USE> *stream_head_;
ACE_Module<ACE_SYNCH_USE> *stream_tail_;
ACE_Stream<ACE_SYNCH_USE> *linked_us_;
ACE_SYNCH_MUTEX_T lock_;
ACE_SYNCH_CONDITION_T final_close_;
};
ACE_Modules
, each of which
contains two ACE_Tasks
. Even though the methods in this
class are virtual, this class isn't really intended for
subclassing unless you know what you are doing. In
particular, the ACE_Stream
destructor calls close
, which
won't be overridden properly unless you call it in a subclass
destructor.
ACE_Stream (
void *arg = 0,
ACE_Module<ACE_SYNCH_USE> *head = 0,
ACE_Module<ACE_SYNCH_USE> *tail = 0
);
head
and tail
as the Stream
head and Stream tail, respectively. If these are 0 then the
ACE_Stream_Head
and ACE_Stream_Tail
are used, respectively.
arg
is the value past in to the open
methods of the tasks.
virtual int open (
void *arg,
ACE_Module<ACE_SYNCH_USE> *head = 0,
ACE_Module<ACE_SYNCH_USE> *tail = 0
);
head
and tail
as the Stream
head and Stream tail, respectively. If these are 0 then the
ACE_Stream_Head
and ACE_Stream_Tail
are used, respectively.
arg
is the value past in to the open
methods of the tasks.
virtual int close (int flags = M_DELETE);
virtual ~ACE_Stream (void);
virtual int push (ACE_Module<ACE_SYNCH_USE> *mod);
mod
right below the Stream head.
virtual int pop (int flags = M_DELETE);
mod
right below the Stream head and close it down.
virtual int top (ACE_Module<ACE_SYNCH_USE> *&mod);
virtual int remove (const ASYS_TCHAR *mod, int flags = M_DELETE);
mod
from the stream. This bypasses the
strict LIFO ordering of push
and pop
.
virtual ACE_Module<ACE_SYNCH_USE> *head (void);
virtual ACE_Module<ACE_SYNCH_USE> *tail (void);
virtual ACE_Module<ACE_SYNCH_USE> *find (const ASYS_TCHAR *mod);
virtual int link (ACE_Stream<ACE_SYNCH_USE> &);
virtual int unlink (void);
virtual int put (ACE_Message_Block *mb, ACE_Time_Value *timeout = 0);
mb
down the stream, starting at the Module
below the Stream head. Wait for upto timeout
amount of time
for the operation to complete (or block forever if timeout
==
0).
virtual int get (ACE_Message_Block *&mb, ACE_Time_Value *timeout = 0);
mb
that is stored in the the stream head.
Wait for upto timeout
amount of time for the operation to
complete (or block forever if timeout
== 0).
virtual int control (
ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd,
void *args
);
virtual int wait (void);
virtual void dump (void) const;
ACE_ALLOC_HOOK_DECLARE;
ACE_SYNCH_MUTEX_T lock_;
ACE_SYNCH_CONDITION_T final_close_;