diff options
Diffstat (limited to 'ACE/examples/APG/Streams/BasicTask.h')
-rw-r--r-- | ACE/examples/APG/Streams/BasicTask.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/ACE/examples/APG/Streams/BasicTask.h b/ACE/examples/APG/Streams/BasicTask.h new file mode 100644 index 00000000000..edebc397998 --- /dev/null +++ b/ACE/examples/APG/Streams/BasicTask.h @@ -0,0 +1,143 @@ +/* -*- C++ -*- */ +// $Id$ + +#ifndef BASIC_TASK_H +#define BASIC_TASK_H + +#include "ace/Task_T.h" +#include "ace/ace_wchar.h" + +// Listing 100 code/ch18 +class BasicTask : public ACE_Task<ACE_MT_SYNCH> +{ +public: + typedef ACE_Task<ACE_MT_SYNCH> inherited; + + BasicTask () : inherited() + { } + + virtual int open (void * = 0) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("BasicTask::open() starting ") + ACE_TEXT ("%d threads\n"), + this->desired_threads ())); + + return this->activate (THR_NEW_LWP | THR_JOINABLE, + this->desired_threads ()); + } + // Listing 100 + + // Listing 101 code/ch18 + int put (ACE_Message_Block *message, + ACE_Time_Value *timeout) + { + return this->putq (message, timeout); + } + // Listing 101 + + // Listing 1020 code/ch18 + virtual int svc (void) + { + for (ACE_Message_Block *message = 0; ; ) + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("BasicTask::svc() - ") + ACE_TEXT ("waiting for work\n" ))); + + if (this->getq (message) == -1) + ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), + ACE_TEXT ("getq")), + -1); + // Listing 1020 + + // Listing 1021 code/ch18 + if (message->msg_type () == ACE_Message_Block::MB_HANGUP) + { + if (this->putq (message) == -1) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("Task::svc() putq"))); + message->release (); + } + break; + } + // Listing 1021 + + // Listing 1022 code/ch18 + Message *recordedMessage = + (Message *)message->rd_ptr (); + + if (this->process (recordedMessage) == -1) + { + message->release (); + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("process")), + -1); + } + // Listing 1022 + + // Listing 1023 code/ch18 + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("BasicTask::svc() - ") + ACE_TEXT ("Continue to next stage\n" ))); + if (this->next_step (message) < 0) + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("put_next failed"))); + message->release (); + break; + } + // Listing 1023 + } + + return 0; + } + + // Listing 103 code/ch18 + virtual int close (u_long flags) + { + int rval = 0; + + if (flags == 1) + { + ACE_Message_Block *hangup = new ACE_Message_Block (); + hangup->msg_type (ACE_Message_Block::MB_HANGUP); + if (this->putq (hangup) == -1) + { + hangup->release (); + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("Task::close() putq")), + -1); + } + + rval = this->wait (); + } + + return rval; + } + // Listing 103 + + // Listing 105 code/ch18 +protected: + virtual int next_step (ACE_Message_Block *message_block) + { + return this->put_next (message_block); + } + // Listing 105 + + // Listing 104 code/ch18 + virtual int process (Message *message) = 0; + + virtual int desired_threads (void) + { + return 1; + } +}; +// Listing 104 + +#endif /* BASIC_TASK_H */ |