1 // $Id: Stream_Modules.cpp 80826 2008-03-04 14:51:23Z wotte $
3 #ifndef ACE_STREAM_MODULES_CPP
4 #define ACE_STREAM_MODULES_CPP
6 #include "ace/Stream_Modules.h"
7 #include "ace/OS_NS_string.h"
9 #if !defined (ACE_LACKS_PRAGMA_ONCE)
11 #endif /* ACE_LACKS_PRAGMA_ONCE */
14 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
16 ACE_ALLOC_HOOK_DEFINE(ACE_Stream_Head
)
18 template <ACE_SYNCH_DECL
>
19 ACE_Stream_Head
<ACE_SYNCH_USE
>::ACE_Stream_Head (void)
21 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::ACE_Stream_Head");
24 template <ACE_SYNCH_DECL
>
25 ACE_Stream_Head
<ACE_SYNCH_USE
>::~ACE_Stream_Head (void)
27 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::~ACE_Stream_Head");
30 template <ACE_SYNCH_DECL
> void
31 ACE_Stream_Head
<ACE_SYNCH_USE
>::dump (void) const
33 #if defined (ACE_HAS_DUMP)
34 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::dump");
35 #endif /* ACE_HAS_DUMP */
38 // ACE_Module that act as the head and tail of a Stream.
40 template <ACE_SYNCH_DECL
> int
41 ACE_Stream_Head
<ACE_SYNCH_USE
>::open (void *)
43 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::open");
47 template <ACE_SYNCH_DECL
> int
48 ACE_Stream_Head
<ACE_SYNCH_USE
>::close (u_long
)
50 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::close");
54 template <ACE_SYNCH_DECL
> int
55 ACE_Stream_Head
<ACE_SYNCH_USE
>::svc (void)
57 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::svc");
61 template <ACE_SYNCH_DECL
> int
62 ACE_Stream_Head
<ACE_SYNCH_USE
>::control (ACE_Message_Block
*mb
)
64 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::control");
65 ACE_IO_Cntl_Msg
*ioc
= (ACE_IO_Cntl_Msg
*) mb
->rd_ptr ();
66 ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd
;
68 switch (cmd
= ioc
->cmd ())
70 case ACE_IO_Cntl_Msg::SET_LWM
:
71 case ACE_IO_Cntl_Msg::SET_HWM
:
72 this->water_marks (cmd
, *(size_t *) mb
->cont ()->rd_ptr ());
81 // Performs canonical flushing at the ACE_Stream Head.
83 template <ACE_SYNCH_DECL
> int
84 ACE_Stream_Head
<ACE_SYNCH_USE
>::canonical_flush (ACE_Message_Block
*mb
)
86 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::canonical_flush");
87 char *cp
= mb
->rd_ptr ();
89 if (ACE_BIT_ENABLED (*cp
, ACE_Task_Flags::ACE_FLUSHR
))
91 this->flush (ACE_Task_Flags::ACE_FLUSHALL
);
92 ACE_CLR_BITS (*cp
, ACE_Task_Flags::ACE_FLUSHR
);
95 if (ACE_BIT_ENABLED (*cp
, ACE_Task_Flags::ACE_FLUSHW
))
96 return this->reply (mb
);
102 template <ACE_SYNCH_DECL
> int
103 ACE_Stream_Head
<ACE_SYNCH_USE
>::put (ACE_Message_Block
*mb
,
106 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::put");
109 if (mb
->msg_type () == ACE_Message_Block::MB_IOCTL
110 && (res
= this->control (mb
)) == -1)
113 if (this->is_writer ())
114 return this->put_next (mb
, tv
);
115 else // this->is_reader ()
117 switch (mb
->msg_type ())
119 case ACE_Message_Block::MB_FLUSH
:
120 return this->canonical_flush (mb
);
125 return this->putq (mb
, tv
);
129 template <ACE_SYNCH_DECL
> int
130 ACE_Stream_Head
<ACE_SYNCH_USE
>::init (int, ACE_TCHAR
*[])
132 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::init");
136 template <ACE_SYNCH_DECL
> int
137 ACE_Stream_Head
<ACE_SYNCH_USE
>::info (ACE_TCHAR
**strp
, size_t length
) const
139 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::info");
140 const ACE_TCHAR
*name
= this->name ();
142 if (*strp
== 0 && (*strp
= ACE_OS::strdup (name
)) == 0)
145 ACE_OS::strsncpy (*strp
, name
, length
);
146 return static_cast<int> (ACE_OS::strlen (name
));
149 template <ACE_SYNCH_DECL
> int
150 ACE_Stream_Head
<ACE_SYNCH_USE
>::fini (void)
152 ACE_TRACE ("ACE_Stream_Head<ACE_SYNCH_USE>::fini");
156 ACE_ALLOC_HOOK_DEFINE(ACE_Stream_Tail
)
158 template <ACE_SYNCH_DECL
>
159 ACE_Stream_Tail
<ACE_SYNCH_USE
>::ACE_Stream_Tail (void)
161 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::ACE_Stream_Tail");
164 template <ACE_SYNCH_DECL
>
165 ACE_Stream_Tail
<ACE_SYNCH_USE
>::~ACE_Stream_Tail (void)
167 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::~ACE_Stream_Tail");
170 template <ACE_SYNCH_DECL
> void
171 ACE_Stream_Tail
<ACE_SYNCH_USE
>::dump (void) const
173 #if defined (ACE_HAS_DUMP)
174 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::dump");
175 #endif /* ACE_HAS_DUMP */
178 template <ACE_SYNCH_DECL
> int
179 ACE_Stream_Tail
<ACE_SYNCH_USE
>::open (void *)
181 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::open");
185 template <ACE_SYNCH_DECL
> int
186 ACE_Stream_Tail
<ACE_SYNCH_USE
>::close (u_long
)
188 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::close");
192 template <ACE_SYNCH_DECL
> int
193 ACE_Stream_Tail
<ACE_SYNCH_USE
>::svc (void)
195 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::svc");
199 template <ACE_SYNCH_DECL
> int
200 ACE_Stream_Tail
<ACE_SYNCH_USE
>::control (ACE_Message_Block
*mb
)
202 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::control");
203 ACE_IO_Cntl_Msg
*ioc
= (ACE_IO_Cntl_Msg
*) mb
->rd_ptr ();
204 ACE_IO_Cntl_Msg::ACE_IO_Cntl_Cmds cmd
;
206 switch (cmd
= ioc
->cmd ())
208 case ACE_IO_Cntl_Msg::SET_LWM
:
209 case ACE_IO_Cntl_Msg::SET_HWM
:
211 size_t wm_size
= *(size_t *) mb
->cont ()->rd_ptr ();
213 this->water_marks (cmd
, wm_size
);
214 this->sibling ()->water_marks (cmd
, wm_size
);
219 mb
->msg_type (ACE_Message_Block::MB_IOCNAK
);
221 return this->reply (mb
);
224 // Perform flush algorithm as though we were the driver.
226 template <ACE_SYNCH_DECL
> int
227 ACE_Stream_Tail
<ACE_SYNCH_USE
>::canonical_flush (ACE_Message_Block
*mb
)
229 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::canonical_flush");
230 char *cp
= mb
->rd_ptr ();
232 if (ACE_BIT_ENABLED (*cp
, ACE_Task_Flags::ACE_FLUSHW
))
234 this->flush (ACE_Task_Flags::ACE_FLUSHALL
);
235 ACE_CLR_BITS (*cp
, ACE_Task_Flags::ACE_FLUSHW
);
238 if (ACE_BIT_ENABLED (*cp
, ACE_Task_Flags::ACE_FLUSHR
))
240 this->sibling ()->flush (ACE_Task_Flags::ACE_FLUSHALL
);
241 return this->reply (mb
);
249 template <ACE_SYNCH_DECL
> int
250 ACE_Stream_Tail
<ACE_SYNCH_USE
>::put (ACE_Message_Block
*mb
,
253 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::put");
255 if (this->is_writer ())
257 switch (mb
->msg_type ())
259 case ACE_Message_Block::MB_IOCTL
:
260 return this->control (mb
);
272 template <ACE_SYNCH_DECL
> int
273 ACE_Stream_Tail
<ACE_SYNCH_USE
>::init (int, ACE_TCHAR
*[])
275 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::init");
279 template <ACE_SYNCH_DECL
> int
280 ACE_Stream_Tail
<ACE_SYNCH_USE
>::info (ACE_TCHAR
**strp
, size_t length
) const
282 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::info");
283 const ACE_TCHAR
*name
= this->name ();
285 if (*strp
== 0 && (*strp
= ACE_OS::strdup (name
)) == 0)
288 ACE_OS::strsncpy (*strp
, name
, length
);
289 return static_cast<int> (ACE_OS::strlen (name
));
292 template <ACE_SYNCH_DECL
> int
293 ACE_Stream_Tail
<ACE_SYNCH_USE
>::fini (void)
295 ACE_TRACE ("ACE_Stream_Tail<ACE_SYNCH_USE>::fini");
299 ACE_ALLOC_HOOK_DEFINE(ACE_Thru_Task
)
301 template <ACE_SYNCH_DECL
>
302 ACE_Thru_Task
<ACE_SYNCH_USE
>::ACE_Thru_Task (void)
304 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::ACE_Thru_Task");
307 template <ACE_SYNCH_DECL
>
308 ACE_Thru_Task
<ACE_SYNCH_USE
>::~ACE_Thru_Task (void)
310 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::~ACE_Thru_Task");
313 template <ACE_SYNCH_DECL
> void
314 ACE_Thru_Task
<ACE_SYNCH_USE
>::dump (void) const
316 #if defined (ACE_HAS_DUMP)
317 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::dump");
318 #endif /* ACE_HAS_DUMP */
321 template <ACE_SYNCH_DECL
> int
322 ACE_Thru_Task
<ACE_SYNCH_USE
>::open (void *)
324 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::open");
328 template <ACE_SYNCH_DECL
> int
329 ACE_Thru_Task
<ACE_SYNCH_USE
>::close (u_long
)
331 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::close");
335 template <ACE_SYNCH_DECL
> int
336 ACE_Thru_Task
<ACE_SYNCH_USE
>::svc (void)
338 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::svc");
342 template <ACE_SYNCH_DECL
> int
343 ACE_Thru_Task
<ACE_SYNCH_USE
>::put (ACE_Message_Block
*msg
,
346 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::put");
347 return this->put_next (msg
, tv
);
350 template <ACE_SYNCH_DECL
> int
351 ACE_Thru_Task
<ACE_SYNCH_USE
>::init (int, ACE_TCHAR
*[])
353 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::init");
357 template <ACE_SYNCH_DECL
> int
358 ACE_Thru_Task
<ACE_SYNCH_USE
>::info (ACE_TCHAR
**strp
,
361 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::info");
362 const ACE_TCHAR
*name
= this->name ();
364 if (*strp
== 0 && (*strp
= ACE_OS::strdup (name
)) == 0)
367 ACE_OS::strsncpy (*strp
, name
, length
);
368 return static_cast<int> (ACE_OS::strlen (name
));
371 template <ACE_SYNCH_DECL
> int
372 ACE_Thru_Task
<ACE_SYNCH_USE
>::fini (void)
374 ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::fini");
378 ACE_END_VERSIONED_NAMESPACE_DECL
380 #endif /* ACE_STREAM_MODULES_CPP */