#include <POSIX_Asynch_IO.h>
Inheritance diagram for ACE_POSIX_Asynch_Connect:
Public Member Functions | |
ACE_POSIX_Asynch_Connect (ACE_POSIX_Proactor *posix_proactor) | |
Constructor. | |
virtual | ~ACE_POSIX_Asynch_Connect (void) |
Destructor. | |
int | open (const ACE_Handler::Proxy_Ptr &handler_proxy, ACE_HANDLE handle, const void *completion_key, ACE_Proactor *proactor=0) |
int | connect (ACE_HANDLE connect_handle, const ACE_Addr &remote_sap, const ACE_Addr &local_sap, int reuse_addr, const void *act, int priority, int signal_number=0) |
int | cancel (void) |
int | close (void) |
ACE_HANDLE | get_handle (void) const |
virtual from ACE_Event_Handler | |
void | set_handle (ACE_HANDLE handle) |
virtual from ACE_Event_Handler | |
int | handle_output (ACE_HANDLE handle) |
int | handle_close (ACE_HANDLE handle, ACE_Reactor_Mask close_mask) |
virtual from ACE_Event_Handler | |
Private Types | |
typedef ACE_Map_Manager< ACE_HANDLE, ACE_POSIX_Asynch_Connect_Result *, ACE_SYNCH_NULL_MUTEX > | MAP_MANAGER |
typedef MAP_MANAGER::ITERATOR | MAP_ITERATOR |
typedef MAP_MANAGER::ENTRY | MAP_ENTRY |
Private Member Functions | |
int | connect_i (ACE_POSIX_Asynch_Connect_Result *result, const ACE_Addr &remote_sap, const ACE_Addr &local_sap, int reuse_addr) |
int | post_result (ACE_POSIX_Asynch_Connect_Result *result, bool flg_post) |
int | cancel_uncompleted (bool flg_notify, ACE_Handle_Set &set) |
Cancel uncompleted connect operations. | |
Private Attributes | |
bool | flg_open_ |
MAP_MANAGER | result_map_ |
Map of Result pointers that correspond to all the pending connects. | |
ACE_SYNCH_MUTEX | lock_ |
|
Definition at line 899 of file POSIX_Asynch_IO.h. |
|
Definition at line 898 of file POSIX_Asynch_IO.h. |
|
true - Connect is registered in ACE_Asynch_Pseudo_Task false - Aceept is deregisted in ACE_Asynch_Pseudo_Task Definition at line 895 of file POSIX_Asynch_IO.h. |
|
Constructor.
Definition at line 1192 of file POSIX_Asynch_IO.cpp.
01193 : ACE_POSIX_Asynch_Operation (posix_proactor), 01194 flg_open_ (false) 01195 { 01196 } |
|
Destructor.
Definition at line 1198 of file POSIX_Asynch_IO.cpp. References close(), and ACE_Event_Handler::reactor().
|
|
Cancel all pending pseudo-asynchronus requests Behavior as usual AIO request Reimplemented from ACE_POSIX_Asynch_Operation. Definition at line 1499 of file POSIX_Asynch_IO.cpp. References ACE_GUARD_RETURN, ACE_SYNCH_MUTEX, ACE_TRACE, cancel_uncompleted(), ACE_POSIX_Proactor::get_asynch_pseudo_task(), ACE_POSIX_Asynch_Operation::posix_proactor(), and ACE_Asynch_Pseudo_Task::remove_io_handler().
01500 { 01501 ACE_TRACE ("ACE_POSIX_Asynch_Connect::cancel"); 01502 01503 // Since this is not a real asynch I/O operation, we can't just call 01504 // ::aiocancel () or ACE_POSIX_Asynch_Operation::cancel (). 01505 // Delegate real cancelation to cancel_uncompleted (1) 01506 01507 int rc = -1 ; // ERRORS 01508 01509 ACE_Handle_Set set; 01510 int num_cancelled = 0; 01511 { 01512 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1)); 01513 num_cancelled = cancel_uncompleted (flg_open_, set); 01514 } 01515 if (num_cancelled == 0) 01516 rc = 1 ; // AIO_ALLDONE 01517 else if (num_cancelled > 0) 01518 rc = 0 ; // AIO_CANCELED 01519 01520 if (!this->flg_open_) 01521 return rc ; 01522 01523 ACE_Asynch_Pseudo_Task & task = 01524 this->posix_proactor ()->get_asynch_pseudo_task (); 01525 01526 task.remove_io_handler (set); 01527 return rc; 01528 } |
|
Cancel uncompleted connect operations.
Definition at line 1469 of file POSIX_Asynch_IO.cpp. References ACE_TRACE, post_result(), ACE_Handle_Set::reset(), result_map_, ACE_Handle_Set::set_bit(), ACE_POSIX_Asynch_Result::set_bytes_transferred(), and ACE_POSIX_Asynch_Result::set_error(). Referenced by cancel(), and close().
01471 { 01472 ACE_TRACE ("ACE_POSIX_Asynch_Connect::cancel_uncompleted"); 01473 01474 int retval = 0; 01475 01476 MAP_MANAGER::ITERATOR iter (result_map_); 01477 MAP_MANAGER::ENTRY * me = 0; 01478 01479 set.reset (); 01480 01481 for (; iter.next (me) != 0; retval++ , iter.advance ()) 01482 { 01483 ACE_HANDLE handle = me->ext_id_; 01484 ACE_POSIX_Asynch_Connect_Result* result = me->int_id_ ; 01485 01486 set.set_bit (handle); 01487 01488 result->set_bytes_transferred (0); 01489 result->set_error (ECANCELED); 01490 this->post_result (result, flg_notify); 01491 } 01492 01493 result_map_.unbind_all (); 01494 01495 return retval; 01496 } |
|
Close performs cancellation of all pending requests. Definition at line 1531 of file POSIX_Asynch_IO.cpp. References ACE_GUARD_RETURN, ACE_SYNCH_MUTEX, ACE_TRACE, cancel_uncompleted(), ACE_POSIX_Proactor::get_asynch_pseudo_task(), ACE_POSIX_Asynch_Operation::posix_proactor(), and ACE_Asynch_Pseudo_Task::remove_io_handler(). Referenced by ~ACE_POSIX_Asynch_Connect().
01532 { 01533 ACE_TRACE ("ACE_POSIX_Asynch_Connect::close"); 01534 01535 ACE_Handle_Set set ; 01536 int num_cancelled = 0; 01537 { 01538 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1)); 01539 num_cancelled = cancel_uncompleted (flg_open_, set); 01540 } 01541 01542 if (num_cancelled == 0 || !this->flg_open_) 01543 { 01544 this->flg_open_ = false; 01545 return 0; 01546 } 01547 01548 ACE_Asynch_Pseudo_Task & task = 01549 this->posix_proactor ()->get_asynch_pseudo_task (); 01550 01551 task.remove_io_handler (set); 01552 this->flg_open_ = false; 01553 01554 return 0; 01555 } |
|
This starts off an asynchronous connect.
Implements ACE_Asynch_Connect_Impl. Definition at line 1244 of file POSIX_Asynch_IO.cpp. References ACE_ERROR, ACE_ERROR_RETURN, ACE_GUARD_RETURN, ACE_LIB_TEXT, ACE_NEW_RETURN, ACE_SYNCH_MUTEX, ACE_TRACE, ACE_POSIX_Asynch_Connect_Result::connect_handle(), connect_i(), ACE_POSIX_Proactor::get_asynch_pseudo_task(), LM_ERROR, ACE_POSIX_Asynch_Operation::posix_proactor(), post_result(), ACE_Asynch_Pseudo_Task::register_io_handler(), result_map_, and ACE_POSIX_Asynch_Result::set_error().
01251 { 01252 ACE_TRACE ("ACE_POSIX_Asynch_Connect::connect"); 01253 01254 if (this->flg_open_ == 0) 01255 ACE_ERROR_RETURN ((LM_ERROR, 01256 ACE_LIB_TEXT("%N:%l:ACE_POSIX_Asynch_Connect::connect") 01257 ACE_LIB_TEXT("connector was not opened before\n")), 01258 -1); 01259 01260 // Common code for both WIN and POSIX. 01261 // Create future Asynch_Connect_Result 01262 ACE_POSIX_Asynch_Connect_Result *result = 0; 01263 ACE_NEW_RETURN (result, 01264 ACE_POSIX_Asynch_Connect_Result (this->handler_proxy_, 01265 connect_handle, 01266 act, 01267 this->posix_proactor ()->get_handle (), 01268 priority, 01269 signal_number), 01270 -1); 01271 01272 int rc = connect_i (result, 01273 remote_sap, 01274 local_sap, 01275 reuse_addr); 01276 01277 // update handle 01278 connect_handle = result->connect_handle (); 01279 01280 if (rc != 0) 01281 return post_result (result, true); 01282 01283 // Enqueue result we will wait for completion 01284 { 01285 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1)); 01286 01287 if (this->result_map_.bind (connect_handle, result) == -1) 01288 { 01289 ACE_ERROR ((LM_ERROR, 01290 ACE_LIB_TEXT ("%N:%l:%p\n"), 01291 ACE_LIB_TEXT ("ACE_POSIX_Asynch_Connect::connect:") 01292 ACE_LIB_TEXT ("bind"))); 01293 01294 result->set_error (EFAULT); 01295 return post_result (result, true); 01296 } 01297 } 01298 01299 ACE_Asynch_Pseudo_Task & task = 01300 this->posix_proactor ()->get_asynch_pseudo_task (); 01301 01302 rc = task.register_io_handler (connect_handle, 01303 this, 01304 ACE_Event_Handler::CONNECT_MASK, 01305 0); // don't suspend after register 01306 if (rc < 0) 01307 { 01308 { 01309 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, -1)); 01310 01311 this->result_map_.unbind (connect_handle, result); 01312 } 01313 if (result != 0) 01314 { 01315 result->set_error (EFAULT); 01316 this->post_result (result, true); 01317 } 01318 return -1; 01319 } 01320 else 01321 result = 0; 01322 01323 01324 return 0; 01325 } |
|
Definition at line 1358 of file POSIX_Asynch_IO.cpp. References ACE_ERROR_RETURN, ACE_LIB_TEXT, ACE_NONBLOCK, ACE_OS::bind(), ACE_POSIX_Asynch_Connect_Result::connect_handle(), EINPROGRESS, EWOULDBLOCK, ACE_Addr::get_addr(), ACE_Addr::get_size(), ACE_Addr::get_type(), LM_ERROR, ACE_POSIX_Asynch_Result::set_bytes_transferred(), ACE_POSIX_Asynch_Result::set_error(), ACE::set_flags(), ACE_OS::setsockopt(), and ACE_OS::socket(). Referenced by connect().
01362 { 01363 result->set_bytes_transferred (0); 01364 01365 ACE_HANDLE handle = result->connect_handle (); 01366 01367 if (handle == ACE_INVALID_HANDLE) 01368 { 01369 int protocol_family = remote_sap.get_type (); 01370 01371 handle = ACE_OS::socket (protocol_family, 01372 SOCK_STREAM, 01373 0); 01374 // save it 01375 result->connect_handle (handle); 01376 if (handle == ACE_INVALID_HANDLE) 01377 { 01378 result->set_error (errno); 01379 ACE_ERROR_RETURN 01380 ((LM_ERROR, 01381 ACE_LIB_TEXT("ACE_POSIX_Asynch_Connect::connect_i: %p\n"), 01382 ACE_LIB_TEXT("socket")), 01383 -1); 01384 } 01385 01386 // Reuse the address 01387 int one = 1; 01388 if (protocol_family != PF_UNIX && 01389 reuse_addr != 0 && 01390 ACE_OS::setsockopt (handle, 01391 SOL_SOCKET, 01392 SO_REUSEADDR, 01393 (const char*) &one, 01394 sizeof one) == -1 ) 01395 { 01396 result->set_error (errno); 01397 ACE_ERROR_RETURN 01398 ((LM_ERROR, 01399 ACE_LIB_TEXT("ACE_POSIX_Asynch_Connect::connect_i: %p\n"), 01400 ACE_LIB_TEXT("setsockopt")), 01401 -1); 01402 } 01403 } 01404 01405 if (local_sap != ACE_Addr::sap_any) 01406 { 01407 sockaddr * laddr = reinterpret_cast<sockaddr *> (local_sap.get_addr ()); 01408 size_t size = local_sap.get_size (); 01409 01410 if (ACE_OS::bind (handle, laddr, size) == -1) 01411 { 01412 result->set_error (errno); 01413 ACE_ERROR_RETURN 01414 ((LM_ERROR, 01415 ACE_LIB_TEXT("ACE_POSIX_Asynch_Connect::connect_i: %p\n"), 01416 ACE_LIB_TEXT("bind")), 01417 -1); 01418 } 01419 } 01420 01421 // set non blocking mode 01422 if (ACE::set_flags (handle, ACE_NONBLOCK) != 0) 01423 { 01424 result->set_error (errno); 01425 ACE_ERROR_RETURN 01426 ((LM_ERROR, 01427 ACE_LIB_TEXT("ACE_POSIX_Asynch_Connect::connect_i: %p\n") 01428 ACE_LIB_TEXT("set_flags")), 01429 -1); 01430 } 01431 01432 for (;;) 01433 { 01434 int rc = ACE_OS::connect 01435 (handle, 01436 reinterpret_cast<sockaddr *> (remote_sap.get_addr ()), 01437 remote_sap.get_size ()); 01438 if (rc < 0) // failure 01439 { 01440 if (errno == EWOULDBLOCK || errno == EINPROGRESS) 01441 return 0; // connect started 01442 01443 if (errno == EINTR) 01444 continue; 01445 01446 result->set_error (errno); 01447 } 01448 01449 return 1 ; // connect finished 01450 } 01451 01452 ACE_NOTREACHED (return 0); 01453 } |
|
virtual from ACE_Event_Handler
Reimplemented from ACE_Event_Handler. Definition at line 1205 of file POSIX_Asynch_IO.cpp. References ACE_ASSERT.
01206 { 01207 ACE_ASSERT (0); 01208 return ACE_INVALID_HANDLE; 01209 } |
|
virtual from ACE_Event_Handler
Reimplemented from ACE_Event_Handler. Definition at line 1594 of file POSIX_Asynch_IO.cpp. References ACE_GUARD_RETURN, ACE_Reactor_Mask, ACE_SYNCH_MUTEX, ACE_TRACE, ACE_POSIX_Proactor::get_asynch_pseudo_task(), ACE_POSIX_Asynch_Operation::posix_proactor(), post_result(), ACE_Asynch_Pseudo_Task::remove_io_handler(), result_map_, ACE_POSIX_Asynch_Result::set_bytes_transferred(), and ACE_POSIX_Asynch_Result::set_error().
01595 { 01596 ACE_TRACE ("ACE_POSIX_Asynch_Connect::handle_close"); 01597 01598 ACE_Asynch_Pseudo_Task &task = 01599 this->posix_proactor ()->get_asynch_pseudo_task (); 01600 01601 task.remove_io_handler (fd); 01602 01603 ACE_POSIX_Asynch_Connect_Result* result = 0; 01604 01605 { 01606 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0)); 01607 if (this->result_map_.unbind (fd, result) != 0) // not found 01608 return -1; 01609 } 01610 01611 result->set_bytes_transferred (0); 01612 result->set_error (ECANCELED); 01613 this->post_result (result, this->flg_open_); 01614 01615 return 0; 01616 } |
|
virtual from ACE_Event_Handler The default action on handle_input() and handle_exception is to return -1. Since that's what we want to do, just reuse them. handle_output(), however, is where successful connects are reported. Reimplemented from ACE_Event_Handler. Definition at line 1558 of file POSIX_Asynch_IO.cpp. References ACE_GUARD_RETURN, ACE_SYNCH_MUTEX, ACE_TRACE, ACE_POSIX_Proactor::get_asynch_pseudo_task(), ACE_OS::getsockopt(), ACE_POSIX_Asynch_Operation::posix_proactor(), post_result(), ACE_Asynch_Pseudo_Task::remove_io_handler(), result_map_, ACE_POSIX_Asynch_Result::set_bytes_transferred(), and ACE_POSIX_Asynch_Result::set_error().
01559 { 01560 ACE_TRACE ("ACE_POSIX_Asynch_Connect::handle_output"); 01561 01562 ACE_POSIX_Asynch_Connect_Result* result = 0; 01563 01564 { 01565 ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0)); 01566 if (this->result_map_.unbind (fd, result) != 0) // not found 01567 return -1; 01568 } 01569 01570 int sockerror = 0 ; 01571 int lsockerror = sizeof sockerror; 01572 01573 ACE_OS::getsockopt (fd, 01574 SOL_SOCKET, 01575 SO_ERROR, 01576 (char*) &sockerror, 01577 &lsockerror); 01578 01579 result->set_bytes_transferred (0); 01580 result->set_error (sockerror); 01581 01582 // This previously just did a "return -1" and let handle_close() clean 01583 // things up. However, this entire object may be gone as a result of 01584 // the application's completion handler, so don't count on 'this' being 01585 // legitimate on return from post_result(). 01586 // remove_io_handler() contains flag DONT_CALL 01587 this->posix_proactor ()->get_asynch_pseudo_task ().remove_io_handler (fd); 01588 this->post_result (result, this->flg_open_); 01589 return 0; 01590 } |
|
This belongs to ACE_POSIX_Asynch_Operation. We forward this call to that method. We have put this here to avoid the compiler warnings. Reimplemented from ACE_POSIX_Asynch_Operation. Definition at line 1218 of file POSIX_Asynch_IO.cpp. References ACE_TRACE, ACE_POSIX_Asynch_Operation::open(), and ACE_Handler::Proxy_Ptr.
01222 { 01223 ACE_TRACE ("ACE_POSIX_Asynch_Connect::open"); 01224 01225 if (this->flg_open_) 01226 return -1; 01227 01228 //int result = 01229 ACE_POSIX_Asynch_Operation::open (handler_proxy, 01230 handle, 01231 completion_key, 01232 proactor); 01233 01234 // Ignore result as we pass ACE_INVALID_HANDLE 01235 //if (result == -1) 01236 // return result; 01237 01238 this->flg_open_ = true; 01239 01240 return 0; 01241 } |
|
Definition at line 1327 of file POSIX_Asynch_IO.cpp. References ACE_ERROR, ACE_LIB_TEXT, ACE_OS::closesocket(), ACE_POSIX_Asynch_Connect_Result::connect_handle(), LM_ERROR, ACE_POSIX_Asynch_Operation::posix_proactor(), and ACE_POSIX_Proactor::post_completion(). Referenced by cancel_uncompleted(), connect(), handle_close(), and handle_output().
01329 { 01330 if (this->flg_open_ && post_enable != 0) 01331 { 01332 if (this->posix_proactor ()->post_completion (result) == 0) 01333 return 0; 01334 01335 ACE_ERROR ((LM_ERROR, 01336 ACE_LIB_TEXT("Error:(%P | %t):%p\n"), 01337 ACE_LIB_TEXT("ACE_POSIX_Asynch_Connect::post_result: ") 01338 ACE_LIB_TEXT(" <post_completion> failed"))); 01339 } 01340 01341 ACE_HANDLE handle = result->connect_handle (); 01342 01343 if (handle != ACE_INVALID_HANDLE) 01344 ACE_OS::closesocket (handle); 01345 01346 delete result; 01347 01348 return -1; 01349 } |
|
virtual from ACE_Event_Handler
Reimplemented from ACE_Event_Handler. Definition at line 1212 of file POSIX_Asynch_IO.cpp. References ACE_ASSERT.
01213 { 01214 ACE_ASSERT (0) ; 01215 } |
|
Definition at line 890 of file POSIX_Asynch_IO.h. |
|
The lock to protect the result map which is shared. The queue is updated by main thread in the register function call and through the auxillary thread in the asynch pseudo task. Definition at line 907 of file POSIX_Asynch_IO.h. |
|
Map of Result pointers that correspond to all the pending connects.
Definition at line 902 of file POSIX_Asynch_IO.h. Referenced by cancel_uncompleted(), connect(), handle_close(), and handle_output(). |