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