00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef ACE_POSIX_PROACTOR_H
00018 #define ACE_POSIX_PROACTOR_H
00019 
00020 #include  "ace/config-all.h"
00021 
00022 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00023 #pragma once
00024 #endif 
00025 
00026 #if defined (ACE_HAS_AIO_CALLS)
00027 
00028 
00029 
00030 #include "ace/Proactor_Impl.h"
00031 #include "ace/Free_List.h"
00032 #include "ace/Pipe.h"
00033 #include "ace/POSIX_Asynch_IO.h"
00034 #include "ace/Asynch_Pseudo_Task.h"
00035 
00036 #define ACE_AIO_MAX_SIZE     2048
00037 #define ACE_AIO_DEFAULT_SIZE 1024
00038 
00039 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 class ACE_Export ACE_POSIX_Proactor : public ACE_Proactor_Impl
00056 {
00057 public:
00058   enum Proactor_Type
00059   {
00060 
00061     PROACTOR_POSIX  = 0,
00062 
00063 
00064     PROACTOR_AIOCB  = 1,
00065 
00066 
00067     PROACTOR_SIG    = 2,
00068 
00069 
00070     PROACTOR_SUN    = 3,
00071 
00072 
00073     PROACTOR_CB     = 4
00074   };
00075 
00076 
00077   enum SystemType  
00078   {
00079     ACE_OS_UNDEFINED= 0x0000,
00080     ACE_OS_WIN      = 0x0100,          
00081     ACE_OS_WIN_NT   = ACE_OS_WIN | 0x0001,
00082     ACE_OS_WIN_2000 = ACE_OS_WIN | 0x0002,
00083     ACE_OS_SUN      = 0x0200,          
00084     ACE_OS_SUN_55   = ACE_OS_SUN | 0x0001,
00085     ACE_OS_SUN_56   = ACE_OS_SUN | 0x0002,
00086     ACE_OS_SUN_57   = ACE_OS_SUN | 0x0004,
00087     ACE_OS_SUN_58   = ACE_OS_SUN | 0x0008,
00088     ACE_OS_HPUX     = 0x0400,          
00089     ACE_OS_HPUX_11  = ACE_OS_HPUX | 0x0001,
00090     ACE_OS_LINUX    = 0x0800,          
00091     ACE_OS_FREEBSD  = 0x1000,          
00092     ACE_OS_IRIX     = 0x2000,          
00093     ACE_OS_OPENBSD  = 0x4000           
00094   };
00095 
00096   enum Opcode {
00097     ACE_OPCODE_READ = 1,
00098     ACE_OPCODE_WRITE = 2
00099   };
00100 
00101   virtual Proactor_Type  get_impl_type (void);
00102 
00103 
00104   virtual ~ACE_POSIX_Proactor (void);
00105 
00106 
00107   virtual int close (void);
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115   virtual int handle_events (ACE_Time_Value &wait_time) = 0;
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123   virtual int handle_events (void) = 0;
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133   virtual int post_completion (ACE_POSIX_Asynch_Result *result) = 0;
00134 
00135   virtual int start_aio (ACE_POSIX_Asynch_Result *result, Opcode op) = 0;
00136 
00137   virtual int cancel_aio (ACE_HANDLE h) = 0;
00138 
00139 
00140   ACE_Asynch_Pseudo_Task &get_asynch_pseudo_task ();
00141 
00142 
00143   virtual int register_handle (ACE_HANDLE handle,
00144                                const void *completion_key);
00145 
00146 
00147   int wake_up_dispatch_threads (void);
00148 
00149 
00150   int close_dispatch_threads (int wait);
00151 
00152 
00153   size_t number_of_threads (void) const;
00154   void number_of_threads (size_t threads);
00155 
00156 
00157   virtual ACE_HANDLE get_handle (void) const;
00158 
00159   
00160   
00161 
00162   virtual ACE_Asynch_Read_Stream_Impl *create_asynch_read_stream (void);
00163   virtual ACE_Asynch_Read_Stream_Result_Impl *
00164     create_asynch_read_stream_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00165                                       ACE_HANDLE handle,
00166                                       ACE_Message_Block &message_block,
00167                                       size_t bytes_to_read,
00168                                       const void *act,
00169                                       ACE_HANDLE event = ACE_INVALID_HANDLE,
00170                                       int priority = 0,
00171                                       int signal_number = ACE_SIGRTMIN);
00172 
00173   virtual ACE_Asynch_Write_Stream_Impl *create_asynch_write_stream (void);
00174   virtual ACE_Asynch_Write_Stream_Result_Impl *
00175     create_asynch_write_stream_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00176                                        ACE_HANDLE handle,
00177                                        ACE_Message_Block &message_block,
00178                                        size_t bytes_to_write,
00179                                        const void *act,
00180                                        ACE_HANDLE event = ACE_INVALID_HANDLE,
00181                                        int priority = 0,
00182                                        int signal_number = ACE_SIGRTMIN);
00183 
00184   virtual ACE_Asynch_Read_File_Impl *create_asynch_read_file (void);
00185   virtual ACE_Asynch_Read_File_Result_Impl *
00186     create_asynch_read_file_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00187                                     ACE_HANDLE handle,
00188                                     ACE_Message_Block &message_block,
00189                                     size_t bytes_to_read,
00190                                     const void *act,
00191                                     u_long offset,
00192                                     u_long offset_high,
00193                                     ACE_HANDLE event = ACE_INVALID_HANDLE,
00194                                     int priority = 0,
00195                                     int signal_number = ACE_SIGRTMIN);
00196 
00197   virtual ACE_Asynch_Write_File_Impl *create_asynch_write_file (void);
00198   virtual ACE_Asynch_Write_File_Result_Impl *
00199     create_asynch_write_file_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00200                                      ACE_HANDLE handle,
00201                                      ACE_Message_Block &message_block,
00202                                      size_t bytes_to_write,
00203                                      const void *act,
00204                                      u_long offset,
00205                                      u_long offset_high,
00206                                      ACE_HANDLE event = ACE_INVALID_HANDLE,
00207                                      int priority = 0,
00208                                      int signal_number = ACE_SIGRTMIN);
00209 
00210   virtual ACE_Asynch_Read_Dgram_Impl *create_asynch_read_dgram (void);
00211   virtual ACE_Asynch_Read_Dgram_Result_Impl *
00212     create_asynch_read_dgram_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00213                                      ACE_HANDLE handle,
00214                                      ACE_Message_Block *message_block,
00215                                      size_t bytes_to_read,
00216                                      int flags,
00217                                      int protocol_family,
00218                                      const void* act,
00219                                      ACE_HANDLE event = ACE_INVALID_HANDLE,
00220                                      int priority = 0,
00221                                      int signal_number = ACE_SIGRTMIN);
00222 
00223   virtual ACE_Asynch_Write_Dgram_Impl *create_asynch_write_dgram (void);
00224   virtual ACE_Asynch_Write_Dgram_Result_Impl *
00225     create_asynch_write_dgram_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00226                                       ACE_HANDLE handle,
00227                                       ACE_Message_Block *message_block,
00228                                       size_t bytes_to_write,
00229                                       int flags,
00230                                       const void* act,
00231                                       ACE_HANDLE event = ACE_INVALID_HANDLE,
00232                                       int priority = 0,
00233                                       int signal_number = ACE_SIGRTMIN);
00234 
00235   virtual ACE_Asynch_Accept_Impl *create_asynch_accept (void);
00236   virtual ACE_Asynch_Accept_Result_Impl *
00237     create_asynch_accept_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00238                                  ACE_HANDLE listen_handle,
00239                                  ACE_HANDLE accept_handle,
00240                                  ACE_Message_Block &message_block,
00241                                  size_t bytes_to_read,
00242                                  const void *act,
00243                                  ACE_HANDLE event = ACE_INVALID_HANDLE,
00244                                  int priority = 0,
00245                                  int signal_number = ACE_SIGRTMIN);
00246 
00247   virtual ACE_Asynch_Connect_Impl *create_asynch_connect (void);
00248   virtual ACE_Asynch_Connect_Result_Impl *
00249     create_asynch_connect_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00250                                   ACE_HANDLE connect_handle,
00251                                   const void *act,
00252                                   ACE_HANDLE event = ACE_INVALID_HANDLE,
00253                                   int priority = 0,
00254                                   int signal_number = ACE_SIGRTMIN);
00255 
00256   virtual ACE_Asynch_Transmit_File_Impl *create_asynch_transmit_file (void);
00257   virtual ACE_Asynch_Transmit_File_Result_Impl *
00258     create_asynch_transmit_file_result (const ACE_Handler::Proxy_Ptr &handler_proxy,
00259                                         ACE_HANDLE socket,
00260                                         ACE_HANDLE file,
00261                                         ACE_Asynch_Transmit_File::Header_And_Trailer *header_and_trailer,
00262                                         size_t bytes_to_write,
00263                                         u_long offset,
00264                                         u_long offset_high,
00265                                         size_t bytes_per_send,
00266                                         u_long flags,
00267                                         const void *act,
00268                                         ACE_HANDLE event = ACE_INVALID_HANDLE,
00269                                         int priority = 0,
00270                                         int signal_number = ACE_SIGRTMIN);
00271 
00272 
00273 
00274   virtual ACE_Asynch_Result_Impl *
00275     create_asynch_timer (const ACE_Handler::Proxy_Ptr &handler_proxy,
00276                          const void *act,
00277                          const ACE_Time_Value &tv,
00278                          ACE_HANDLE event = ACE_INVALID_HANDLE,
00279                          int priority = 0,
00280                          int signal_number = ACE_SIGRTMIN);
00281 
00282 protected:
00283 
00284   ACE_POSIX_Proactor (void);
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293   void application_specific_code (ACE_POSIX_Asynch_Result *asynch_result,
00294                                   size_t bytes_transferred,
00295                                   const void *completion_key,
00296                                   u_long error);
00297 
00298 
00299 
00300 
00301 
00302 
00303   virtual int post_wakeup_completions (int how_many);
00304 
00305 protected:
00306 
00307 
00308   ACE_Handler wakeup_handler_;
00309   int os_id_;
00310 
00311 private:
00312 
00313   ACE_Asynch_Pseudo_Task  pseudo_task_;
00314 
00315 };
00316 
00317 
00318 class ACE_AIOCB_Notify_Pipe_Manager;
00319 
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 class ACE_Export ACE_POSIX_AIOCB_Proactor : public ACE_POSIX_Proactor
00328 {
00329 
00330 
00331   friend class ACE_AIOCB_Notify_Pipe_Manager;
00332 
00333 
00334 
00335   friend class ACE_POSIX_Asynch_Operation;
00336   friend class ACE_POSIX_Asynch_Accept;
00337   friend class ACE_POSIX_Asynch_Connect;
00338 
00339 
00340 public:
00341 
00342 
00343   ACE_POSIX_AIOCB_Proactor (size_t nmaxop = ACE_AIO_DEFAULT_SIZE);
00344 
00345   virtual Proactor_Type  get_impl_type (void);
00346 
00347 
00348   virtual ~ACE_POSIX_AIOCB_Proactor (void);
00349 
00350 
00351   virtual int close (void);
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359   virtual int handle_events (ACE_Time_Value &wait_time);
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368   virtual int handle_events (void);
00369 
00370 
00371   virtual int post_completion (ACE_POSIX_Asynch_Result *result);
00372 
00373   virtual int start_aio (ACE_POSIX_Asynch_Result *result,
00374                          ACE_POSIX_Proactor::Opcode op);
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387   virtual int cancel_aio (ACE_HANDLE h);
00388 
00389 protected:
00390 
00391 
00392 
00393   ACE_POSIX_AIOCB_Proactor (size_t nmaxop,
00394                             ACE_POSIX_Proactor::Proactor_Type ptype);
00395 
00396 
00397 
00398   virtual int get_result_status (ACE_POSIX_Asynch_Result *asynch_result,
00399                                  int &error_status,
00400                                  size_t &transfer_count);
00401 
00402 
00403   int create_result_aiocb_list (void);
00404 
00405 
00406 
00407   int delete_result_aiocb_list (void);
00408 
00409 
00410 
00411   void create_notify_manager (void);
00412   void delete_notify_manager (void);
00413 
00414 
00415 
00416   void check_max_aio_num (void) ;
00417 
00418 
00419   void set_notify_handle (ACE_HANDLE h);
00420 
00421 
00422 
00423 
00424 
00425 
00426   int handle_events_i (u_long milli_seconds);
00427 
00428 
00429   int start_deferred_aio (void);
00430 
00431 
00432   virtual int cancel_aiocb (ACE_POSIX_Asynch_Result * result);
00433 
00434 
00435   ACE_POSIX_Asynch_Result *find_completed_aio (int &error_status,
00436                                                size_t &transfer_count,
00437                                                size_t &index,
00438                                                size_t &count);
00439 
00440 
00441   virtual ssize_t allocate_aio_slot (ACE_POSIX_Asynch_Result *result);
00442 
00443 
00444   virtual int start_aio_i (ACE_POSIX_Asynch_Result *result);
00445 
00446 
00447 
00448   virtual int notify_completion (int sig_num);
00449 
00450 
00451   int  putq_result (ACE_POSIX_Asynch_Result *result);
00452 
00453 
00454   ACE_POSIX_Asynch_Result * getq_result (void);
00455 
00456 
00457   int clear_result_queue (void);
00458 
00459 
00460   int process_result_queue (void);
00461 
00462 
00463 
00464 
00465   ACE_AIOCB_Notify_Pipe_Manager *aiocb_notify_pipe_manager_;
00466 
00467 
00468 
00469   aiocb **aiocb_list_;
00470   ACE_POSIX_Asynch_Result **result_list_;
00471 
00472 
00473   size_t aiocb_list_max_size_;
00474 
00475 
00476   size_t aiocb_list_cur_size_;
00477 
00478 
00479   ACE_SYNCH_MUTEX mutex_;
00480 
00481 
00482 
00483 
00484   ACE_HANDLE notify_pipe_read_handle_ ;
00485 
00486 
00487 
00488   size_t num_deferred_aiocb_ ;
00489 
00490 
00491   size_t num_started_aio_ ;
00492 
00493 
00494   ACE_Unbounded_Queue<ACE_POSIX_Asynch_Result *> result_queue_;
00495 };
00496 
00497 #if defined(ACE_HAS_POSIX_REALTIME_SIGNALS)
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508 class ACE_Export ACE_POSIX_SIG_Proactor : public ACE_POSIX_AIOCB_Proactor
00509 {
00510 
00511 
00512 
00513 
00514 
00515 
00516   friend class ACE_POSIX_SIG_Asynch_Operation;
00517 
00518 public:
00519 
00520 
00521 
00522 
00523 
00524   ACE_POSIX_SIG_Proactor (size_t nmaxop = ACE_AIO_DEFAULT_SIZE);
00525 
00526   virtual Proactor_Type get_impl_type (void);
00527 
00528 
00529 
00530 
00531 
00532 
00533 
00534   ACE_POSIX_SIG_Proactor (const sigset_t mask_set,
00535                           size_t nmaxop = ACE_AIO_DEFAULT_SIZE);
00536 
00537 
00538   virtual ~ACE_POSIX_SIG_Proactor (void);
00539 
00540 
00541 
00542 
00543 
00544 
00545 
00546   virtual int handle_events (ACE_Time_Value &wait_time);
00547 
00548 
00549 
00550 
00551 
00552 
00553 
00554 
00555   virtual int handle_events (void);
00556 
00557 
00558 
00559 
00560 
00561 
00562 
00563 
00564 
00565 
00566 
00567   virtual ACE_Asynch_Result_Impl *create_asynch_timer
00568     (const ACE_Handler::Proxy_Ptr &handler_proxy,
00569      const void *act,
00570      const ACE_Time_Value &tv,
00571      ACE_HANDLE event = ACE_INVALID_HANDLE,
00572      int priority = 0,
00573      int signal_number = ACE_SIGRTMIN);
00574 
00575 protected:
00576 
00577   int setup_signal_handler (int signal_number) const;
00578 
00579 
00580   int block_signals (void) const;
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591   virtual int handle_events_i (const ACE_Time_Value *timeout);
00592 
00593 
00594   virtual ssize_t allocate_aio_slot (ACE_POSIX_Asynch_Result *result);
00595 
00596 
00597 
00598 
00599   virtual int notify_completion (int sig_num);
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607   sigset_t RT_completion_signals_;
00608 };
00609 
00610 
00611 #endif 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 class ACE_Export ACE_POSIX_Asynch_Timer : public ACE_POSIX_Asynch_Result
00622 {
00623 
00624 
00625 
00626   friend class ACE_POSIX_Proactor;
00627 #if defined(ACE_HAS_POSIX_REALTIME_SIGNALS)
00628   friend class ACE_POSIX_SIG_Proactor;
00629 #endif
00630 
00631 protected:
00632 
00633   ACE_POSIX_Asynch_Timer (const ACE_Handler::Proxy_Ptr &handler_proxy,
00634                           const void *act,
00635                           const ACE_Time_Value &tv,
00636                           ACE_HANDLE event = ACE_INVALID_HANDLE,
00637                           int priority = 0,
00638                           int signal_number = ACE_SIGRTMIN);
00639 
00640 
00641   virtual ~ACE_POSIX_Asynch_Timer (void) {}
00642 
00643 
00644   virtual void complete (size_t bytes_transferred,
00645                          int success,
00646                          const void *completion_key,
00647                          u_long error = 0);
00648 
00649 
00650   ACE_Time_Value time_;
00651 };
00652 
00653 ACE_END_VERSIONED_NAMESPACE_DECL
00654 
00655 #if defined (__ACE_INLINE__)
00656 #include "ace/POSIX_Proactor.inl"
00657 #endif 
00658 
00659 #endif 
00660 #endif