// Stream_Modules.cpp // $Id$ #ifndef ACE_STREAM_MODULES_C #define ACE_STREAM_MODULES_C #include "ace/Stream_Modules.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ ACE_RCSID(ace, Stream_Modules, "$Id$") ACE_ALLOC_HOOK_DEFINE(ACE_Stream_Head) template ACE_Stream_Head::ACE_Stream_Head (void) { ACE_TRACE ("ACE_Stream_Head::ACE_Stream_Head"); } template ACE_Stream_Head::~ACE_Stream_Head (void) { ACE_TRACE ("ACE_Stream_Head::~ACE_Stream_Head"); } template void ACE_Stream_Head::dump (void) const { ACE_TRACE ("ACE_Stream_Head::dump"); } // ACE_Module that act as the head and tail of a Stream. template int ACE_Stream_Head::open (void *) { ACE_TRACE ("ACE_Stream_Head::open"); return 0; } template int ACE_Stream_Head::close (u_long) { ACE_TRACE ("ACE_Stream_Head::close"); return 0; } template int ACE_Stream_Head::svc (void) { ACE_TRACE ("ACE_Stream_Head::svc"); return -1; } template int ACE_Stream_Head::control (ACE_Message_Block *mb) { ACE_TRACE ("ACE_Stream_Head::control"); ACE_IO_Cntl_Msg *ioc = (ACE_IO_Cntl_Msg *) mb->rd_ptr (); ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd; switch (cmd = ioc->cmd ()) { case ACE_IO_Cntl_Msg::SET_LWM: case ACE_IO_Cntl_Msg::SET_HWM: this->water_marks (cmd, *(size_t *) mb->cont ()->rd_ptr ()); ioc->rval (0); break; default: return 0; } return ioc->rval (); } // Performs canonical flushing at the ACE_Stream Head. template int ACE_Stream_Head::canonical_flush (ACE_Message_Block *mb) { ACE_TRACE ("ACE_Stream_Head::canonical_flush"); char *cp = mb->rd_ptr (); if (ACE_BIT_ENABLED (*cp, ACE_Task_Flags::ACE_FLUSHR)) { this->flush (ACE_Task_Flags::ACE_FLUSHALL); ACE_CLR_BITS (*cp, ACE_Task_Flags::ACE_FLUSHR); } if (ACE_BIT_ENABLED (*cp, ACE_Task_Flags::ACE_FLUSHW)) return this->reply (mb); else mb->release (); return 0; } template int ACE_Stream_Head::put (ACE_Message_Block *mb, ACE_Time_Value *tv) { ACE_TRACE ("ACE_Stream_Head::put"); int res = 0; if (mb->msg_type () == ACE_Message_Block::MB_IOCTL && (res = this->control (mb)) == -1) return res; if (this->is_writer ()) return this->put_next (mb, tv); else // this->is_reader () { switch (mb->msg_type ()) { case ACE_Message_Block::MB_FLUSH: return this->canonical_flush (mb); default: break; } return this->putq (mb, tv); } } template int ACE_Stream_Head::init (int, ACE_TCHAR *[]) { ACE_TRACE ("ACE_Stream_Head::init"); return 0; } template int ACE_Stream_Head::info (ACE_TCHAR **strp, size_t length) const { ACE_TRACE ("ACE_Stream_Head::info"); const ACE_TCHAR *name = this->name (); if (*strp == 0 && (*strp = ACE_OS::strdup (name)) == 0) return -1; else ACE_OS::strncpy (*strp, name, length); return ACE_OS::strlen (name); } template int ACE_Stream_Head::fini (void) { ACE_TRACE ("ACE_Stream_Head::fini"); return 0; } ACE_ALLOC_HOOK_DEFINE(ACE_Stream_Tail) template ACE_Stream_Tail::ACE_Stream_Tail (void) { ACE_TRACE ("ACE_Stream_Tail::ACE_Stream_Tail"); } template ACE_Stream_Tail::~ACE_Stream_Tail (void) { ACE_TRACE ("ACE_Stream_Tail::~ACE_Stream_Tail"); } template void ACE_Stream_Tail::dump (void) const { ACE_TRACE ("ACE_Stream_Tail::dump"); } template int ACE_Stream_Tail::open (void *) { ACE_TRACE ("ACE_Stream_Tail::open"); return 0; } template int ACE_Stream_Tail::close (u_long) { ACE_TRACE ("ACE_Stream_Tail::close"); return 0; } template int ACE_Stream_Tail::svc (void) { ACE_TRACE ("ACE_Stream_Tail::svc"); return -1; } template int ACE_Stream_Tail::control (ACE_Message_Block *mb) { ACE_TRACE ("ACE_Stream_Tail::control"); ACE_IO_Cntl_Msg *ioc = (ACE_IO_Cntl_Msg *) mb->rd_ptr (); ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd; switch (cmd = ioc->cmd ()) { case ACE_IO_Cntl_Msg::SET_LWM: case ACE_IO_Cntl_Msg::SET_HWM: { size_t wm_size = *(size_t *) mb->cont ()->rd_ptr (); this->water_marks (cmd, wm_size); this->sibling ()->water_marks (cmd, wm_size); ioc->rval (0); break; } default: mb->msg_type (ACE_Message_Block::MB_IOCNAK); } return this->reply (mb); } // Perform flush algorithm as though we were the driver. template int ACE_Stream_Tail::canonical_flush (ACE_Message_Block *mb) { ACE_TRACE ("ACE_Stream_Tail::canonical_flush"); char *cp = mb->rd_ptr (); if (ACE_BIT_ENABLED (*cp, ACE_Task_Flags::ACE_FLUSHW)) { this->flush (ACE_Task_Flags::ACE_FLUSHALL); ACE_CLR_BITS (*cp, ACE_Task_Flags::ACE_FLUSHW); } if (ACE_BIT_ENABLED (*cp, ACE_Task_Flags::ACE_FLUSHR)) { this->sibling ()->flush (ACE_Task_Flags::ACE_FLUSHALL); return this->reply (mb); } else mb->release (); return 0; } template int ACE_Stream_Tail::put (ACE_Message_Block *mb, ACE_Time_Value *) { ACE_TRACE ("ACE_Stream_Tail::put"); if (this->is_writer ()) { switch (mb->msg_type ()) { case ACE_Message_Block::MB_IOCTL: return this->control (mb); /* NOTREACHED */ default: mb->release (); } } return -1; } template int ACE_Stream_Tail::init (int, ACE_TCHAR *[]) { ACE_TRACE ("ACE_Stream_Tail::init"); return 0; } template int ACE_Stream_Tail::info (ACE_TCHAR **strp, size_t length) const { ACE_TRACE ("ACE_Stream_Tail::info"); const ACE_TCHAR *name = this->name (); if (*strp == 0 && (*strp = ACE_OS::strdup (name)) == 0) return -1; else ACE_OS::strncpy (*strp, name, length); return ACE_OS::strlen (name); } template int ACE_Stream_Tail::fini (void) { ACE_TRACE ("ACE_Stream_Tail::fini"); return 0; } ACE_ALLOC_HOOK_DEFINE(ACE_Thru_Task) template ACE_Thru_Task::ACE_Thru_Task (void) { ACE_TRACE ("ACE_Thru_Task::ACE_Thru_Task"); } template ACE_Thru_Task::~ACE_Thru_Task (void) { ACE_TRACE ("ACE_Thru_Task::~ACE_Thru_Task"); } template void ACE_Thru_Task::dump (void) const { ACE_TRACE ("ACE_Thru_Task::dump"); } template int ACE_Thru_Task::open (void *) { ACE_TRACE ("ACE_Thru_Task::open"); return 0; } template int ACE_Thru_Task::close (u_long) { ACE_TRACE ("ACE_Thru_Task::close"); return 0; } template int ACE_Thru_Task::svc (void) { ACE_TRACE ("ACE_Thru_Task::svc"); return -1; } template int ACE_Thru_Task::put (ACE_Message_Block *msg, ACE_Time_Value *tv) { ACE_TRACE ("ACE_Thru_Task::put"); return this->put_next (msg, tv); } template int ACE_Thru_Task::init (int, ACE_TCHAR *[]) { ACE_TRACE ("ACE_Thru_Task::init"); return 0; } template int ACE_Thru_Task::info (ACE_TCHAR **strp, size_t length) const { ACE_TRACE ("ACE_Thru_Task::info"); const ACE_TCHAR *name = this->name (); if (*strp == 0 && (*strp = ACE_OS::strdup (name)) == 0) return -1; else ACE_OS::strncpy (*strp, name, length); return ACE_OS::strlen (name); } template int ACE_Thru_Task::fini (void) { ACE_TRACE ("ACE_Thru_Task::fini"); return 0; } #endif /* ACE_STREAM_MODULES_C */