1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
// $Id: CommandTask.cpp 94310 2011-07-09 19:10:06Z schmidt $
#include "CommandTask.h"
// Listing 01 code/ch18
CommandTask::CommandTask (int command)
: inherited (), command_(command)
{ }
// Listing 01
// Listing 02 code/ch18
int CommandTask::open (void *)
{
return this->activate ();
}
// Listing 02
// Listing 03 code/ch18
int CommandTask::put (ACE_Message_Block *message,
ACE_Time_Value *timeout)
{
return this->putq (message, timeout);
}
// Listing 03
// Listing 04 code/ch18
int CommandTask::process (Command *)
{
ACE_TRACE ("CommandTask::process()");
return Command::RESULT_FAILURE;
}
// Listing 04
// Listing 05 code/ch18
int CommandTask::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->duplicate ()) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("Task::close() putq")),
-1);
}
hangup->release ();
rval = this->wait ();
}
return rval;
}
// Listing 05
// Listing 06 code/ch18
// Listing 061 code/ch18
int CommandTask::svc (void)
{
ACE_Message_Block *message;
for (;;)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("CommandTask::svc() - ")
ACE_TEXT ("%s waiting for work\n"),
this->module ()->name ()));
if (this->getq (message) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("getq")),
-1);
if (message->msg_type () == ACE_Message_Block::MB_HANGUP)
{
if (this->putq (message->duplicate ()) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"),
ACE_TEXT ("Task::svc() putq")),
-1);
}
message->release ();
break;
}
// Listing 061
// Listing 062 code/ch18
Command *command = (Command *)message->data_block ();
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("CommandTask::svc() - ")
ACE_TEXT ("%s got work request %d\n"),
this->module ()->name (),
command->command_));
if (command->command_ != this->command_)
{
this->put_next (message->duplicate ());
}
// Listing 062
// Listing 063 code/ch18
else
{
int result = this->process (command);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("CommandTask::svc() - ")
ACE_TEXT ("%s work request %d result is %d\n"),
this->module ()->name (),
command->command_,
result));
if (result == Command::RESULT_FAILURE)
{
command->numeric_result_ = -1;
}
// Listing 063
// Listing 064 code/ch18
else if (result == Command::RESULT_PASS)
{
this->put_next (message->duplicate ());
}
// Listing 064
// Listing 065 code/ch18
else // result == Command::RESULT_SUCCESS
{
if (this->is_writer ())
{
this->sibling ()->putq
(message->duplicate ());
}
// Listing 065
// Listing 066 code/ch18
else // this->is_reader ()
{
this->put_next (message->duplicate ());
}
// Listing 066
} // result == ...
} // command->command_ ? = this->command_
// Listing 067 code/ch18
message->release ();
} // for (;;)
return 0;
}
// Listing 067
// Listing 06
|