diff options
author | schmidt <douglascraigschmidt@users.noreply.github.com> | 2000-06-08 18:48:35 +0000 |
---|---|---|
committer | schmidt <douglascraigschmidt@users.noreply.github.com> | 2000-06-08 18:48:35 +0000 |
commit | bb73c00e2a8b9248a80a108e56f6d3da906d7173 (patch) | |
tree | a7dfcb5e5b0373ec0802370684b427eeca72f911 /ace/Stream.cpp | |
parent | 79184c87f98d600259d0462d66a0a19d31a4553b (diff) | |
download | ATCD-bb73c00e2a8b9248a80a108e56f6d3da906d7173.tar.gz |
ChangeLogTag:Thu Jun 8 13:00:38 2000 Toshio Hori <toshi@etl.go.jp>
Diffstat (limited to 'ace/Stream.cpp')
-rw-r--r-- | ace/Stream.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/ace/Stream.cpp b/ace/Stream.cpp index 3e5b138a98a..09a3cc25f76 100644 --- a/ace/Stream.cpp +++ b/ace/Stream.cpp @@ -110,6 +110,93 @@ ACE_Stream<ACE_SYNCH_USE>::top (ACE_Module<ACE_SYNCH_USE> *&m) } } +template <ACE_SYNCH_DECL> int +ACE_Stream<ACE_SYNCH_USE>::insert (const ACE_TCHAR *prev_name, + ACE_Module<ACE_SYNCH_USE> *mod) +{ + ACE_TRACE ("ACE_Stream<ACE_SYNCH_USE>::insert"); + + for (ACE_Module<ACE_SYNCH_USE> *prev_mod = this->stream_head_; + prev_mod != 0; + prev_mod = prev_mod->next ()) + if (ACE_OS::strcmp (prev_mod->name (), prev_name) == 0) + { + ACE_Module<ACE_SYNCH_USE> *next_mod = prev_mod->next (); + ACE_Task<ACE_SYNCH_USE> *m_reader = mod->reader (); + ACE_Task<ACE_SYNCH_USE> *m_writer = mod->writer (); + + next_mod->reader ()->next (m_reader); + m_writer->next (next_mod->writer ()); + + prev_mod->next (mod); + prev_mod->writer ()->next (m_writer); + m_reader->next (prev_mod->reader ()); + + mod->next (next_mod); + + if (m_reader->open (mod->arg ()) == -1) + return -1; + + if (m_writer->open (mod->arg ()) == -1) + return -1; + + return 0; + } + + return -1; +} + +template <ACE_SYNCH_DECL> int +ACE_Stream<ACE_SYNCH_USE>::replace (const ACE_TCHAR *replace_name, + ACE_Module<ACE_SYNCH_USE> *mod, + int flags) +{ + ACE_TRACE ("ACE_Stream<ACE_SYNCH_USE>::replace"); + ACE_Module<ACE_SYNCH_USE> *prev_mod = 0; + + for (ACE_Module<ACE_SYNCH_USE> *rep_mod = this->stream_head_; + rep_mod != 0; + rep_mod = rep_mod->next ()) + if (ACE_OS::strcmp (rep_mod->name (), replace_name) == 0) + { + if (prev_mod == 0) // Do you want to replace <stream_head_>? + return -1; // Might be modified? + else + { + ACE_Module<ACE_SYNCH_USE> *next_mod = rep_mod->next (); + ACE_Task<ACE_SYNCH_USE> *m_reader = mod->reader (); + ACE_Task<ACE_SYNCH_USE> *m_writer = mod->writer (); + + next_mod->reader ()->next (m_reader); + m_writer->next (next_mod->writer ()); + + prev_mod->next (mod); + prev_mod->writer ()->next (m_writer); + m_reader->next (prev_mod->reader ()); + + mod->next (next_mod); + + if (m_reader->open (mod->arg ()) == -1) + return -1; + + if (m_writer->open (mod->arg ()) == -1) + return -1; + } + + if (flags != ACE_Module<ACE_SYNCH_USE>::M_DELETE_NONE) + { + rep_mod->close (flags); + delete rep_mod; + } + + return 0; + } + else + prev_mod = rep_mod; + + return -1; +} + // Remove the "top" ACE_Module in a ACE_Stream, skipping over the // stream_head. |