test_aiocb_ace.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 260 行

CPP
260
字号
// $Id: test_aiocb_ace.cpp 53415 2003-11-09 04:12:10Z dhinton $// ============================================================================//// = LIBRARY//    proactor//// = FILENAME//    test_aiocb_ace.cpp//// = DESCRIPTION//    This program helps you to test the <aio_*> calls on a//    platform.////    Before running this test, make sure the platform can //    support POSIX <aio_> calls, using//    ACE_ROOT/tests/Aio_Platform_Test.// //    This program tests the AIOCB (AIO Control Blocks) based//    completion approach which uses <aio_suspend> for completion//    querying. // //    If this test is successful, ACE_POSIX_AIOCB_PROACTOR//    can be used on this platform.// // = COMPILE and RUN//    % make//    % ./test_aiocb_ace// // = AUTHOR//    Alexander Babu Arulanthu <alex@cs.wustl.edu>//// ============================================================================#include "ace/ACE.h"#include "ace/Log_Msg.h"#include "ace/os_include/os_aio.h"#include "ace/OS_NS_string.h"class Test_Aio{public:  Test_Aio (void);  // Default constructor.  int init (void);  // Initting the output file and the buffer.  int do_aio (void);  // Doing the testing stuff.  ~Test_Aio (void);  // Destructor.private:  int out_fd_;  // Output file descriptor.  struct aiocb *aiocb_write_;  // For writing to the file.  struct aiocb *aiocb_read_;  // Reading stuff from the file.  char *buffer_write_;  // The buffer to be written to the out_fd.  char *buffer_read_;  // The buffer to be read back from the file.};Test_Aio::Test_Aio (void)  : aiocb_write_ (0),    aiocb_read_ (0),    buffer_write_ (0),    buffer_read_ (0){  ACE_NEW (this->aiocb_write_,           struct aiocb);  ACE_NEW (this->aiocb_read_,           struct aiocb);}Test_Aio::~Test_Aio (void){  delete aiocb_write_;  delete aiocb_read_;  delete buffer_write_;  delete buffer_read_;}// Init the output file and init the buffer.intTest_Aio::init (void){  // Open the output file.  this->out_fd_ = ACE_OS::open ("test_aio.log",                                O_RDWR | O_CREAT | O_TRUNC,                                0666);   if (this->out_fd_ == 0)    ACE_ERROR_RETURN ((LM_ERROR,                       "Error: Opening file\n"),                      -1);  // Init the buffers.  this->buffer_write_ = ACE::strnew ("Welcome to the world of AIO... AIO Rules !!!");  ACE_DEBUG ((LM_DEBUG,              "The buffer : %s\n",              this->buffer_write_));    // Allocate memory for the read buffer.  ACE_NEW_RETURN (this->buffer_read_,                  char [ACE_OS::strlen (this->buffer_write_)],                  -1);  return 0;}// Set the necessary things for the AIO stuff.// Write the buffer asynchly.hmm Disable signals.// Go on aio_suspend. Wait for completion.// Print out the result.intTest_Aio::do_aio (void){  // = Write to the file.  // Setup AIOCB.  this->aiocb_write_->aio_fildes = this->out_fd_;  this->aiocb_write_->aio_offset = 0;  this->aiocb_write_->aio_buf = this->buffer_write_;  this->aiocb_write_->aio_nbytes = ACE_OS::strlen (this->buffer_write_);  this->aiocb_write_->aio_reqprio = 0;  this->aiocb_write_->aio_sigevent.sigev_notify = SIGEV_NONE;  //this->this->aiocb_.aio_sigevent.sigev_signo = SIGRTMAX;  this->aiocb_write_->aio_sigevent.sigev_value.sival_ptr =    (void *) this->aiocb_write_;    // Fire off the aio write.  if (aio_write (this->aiocb_write_) != 0)    ACE_ERROR_RETURN ((LM_ERROR,                       "%p\n",                       "aio_write"),                      -1);    // = Read from that file.  // Setup AIOCB.  this->aiocb_read_->aio_fildes = this->out_fd_;  this->aiocb_read_->aio_offset = 0;  this->aiocb_read_->aio_buf = this->buffer_read_;  this->aiocb_read_->aio_nbytes = ACE_OS::strlen (this->buffer_write_);  this->aiocb_read_->aio_reqprio = 0;  this->aiocb_read_->aio_sigevent.sigev_notify = SIGEV_NONE;  //this->this->aiocb_.aio_sigevent.sigev_signo = SIGRTMAX;  this->aiocb_read_->aio_sigevent.sigev_value.sival_ptr =    (void *) this->aiocb_read_;  // Fire off the aio write. If it doesnt get queued, carry on to get  // the completion for the first one.  if (aio_read (this->aiocb_read_) < 0)    ACE_ERROR_RETURN ((LM_ERROR,                       "%p\n",                       "aio_read"),                      -1);    // Wait for the completion on aio_suspend.  struct aiocb *list_aiocb[2];  list_aiocb [0] = this->aiocb_write_;  list_aiocb [1] = this->aiocb_read_;  // Do suspend till all the aiocbs in the list are done.  int to_finish = 2;  int return_val = 0;  while (to_finish > 0)    {      return_val = aio_suspend (list_aiocb,                                to_finish,                                0);      ACE_DEBUG ((LM_DEBUG,                  "Result of <aio_suspend> : %d\n",                  return_val));      // Analyze return and error values.           if (to_finish > 1)        {          if (aio_error (list_aiocb [1]) != EINPROGRESS)            {              if (aio_return (list_aiocb [1]) == -1)                ACE_ERROR_RETURN ((LM_ERROR,                                   "%p\n",                                   "aio_return, item 1"),                                  -1);              else                {                  // Successful. Remember we have one less thing to finish.                  --to_finish;                  list_aiocb [1] = 0;                }            }          else            ACE_DEBUG ((LM_DEBUG,                         "aio_error says aio 1 is in progress\n"));        }      if (aio_error (list_aiocb [0]) != EINPROGRESS)        {          if (aio_return (list_aiocb [0]) == -1)            ACE_ERROR_RETURN ((LM_ERROR,                               "%p\n",                               "aio_return, item 0"),                              -1);          else            {              // Successful. Store the pointer somewhere and bump the              // read entry up to the front, if it is still not done.              --to_finish;              list_aiocb [0] = this->aiocb_read_;            }        }      else        ACE_DEBUG ((LM_DEBUG,                     "aio_error says aio 0 is in progress\n"));    }  ACE_DEBUG ((LM_DEBUG,               "Both the AIO operations done.\n"              "The buffer is : %s\n",              this->buffer_read_));    return 0;}intmain (int argc, char **argv){  ACE_UNUSED_ARG (argc);  ACE_UNUSED_ARG (argv);  Test_Aio test_aio;  if (test_aio.init () != 0)    ACE_ERROR_RETURN ((LM_ERROR,                       "AIOCB test failed:\n"                       "ACE_POSIX_AIOCB_PROACTOR may not work in this platform\n"),                      -1);    if (test_aio.do_aio () != 0)    ACE_ERROR_RETURN ((LM_ERROR,                       "AIOCB test failed:\n"                       "ACE_POSIX_AIOCB_PROACTOR may not work in this platform\n"),                      -1);    ACE_DEBUG ((LM_DEBUG,              "AIOCB test successful:\n"              "ACE_POSIX_AIOCB_PROACTOR should work in this platform\n"));    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?