int main (int, char *[]) { Timeout_Handler handler; ACE_WIN32_Proactor win32_proactor (0, 1); ACE_Proactor proactor (&win32_proactor, 0, 0); ACE_Reactor::instance ()->register_handler (proactor.implementation ()); // Register a 2 second timer. ACE_Time_Value foo_tv (2); if (proactor.schedule_timer (handler, (void *) "Proactor", ACE_Time_Value::zero, foo_tv) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "schedule_timer"), -1); // Register a 3 second timer. ACE_Time_Value bar_tv (3); if (ACE_Reactor::instance ()->schedule_timer (&handler, (void *) "Reactor", ACE_Time_Value::zero, bar_tv) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "schedule_timer"), -1); Worker worker; if (worker.activate (THR_NEW_LWP, 10) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "main"), -1); ACE_Thread_Manager::instance ()->wait (); // Remove from reactor ACE_Reactor::instance ()->remove_handler (&proactor, ACE_Event_Handler::DONT_CALL); return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { ACE_UNUSED_ARG (argc); ACE_UNUSED_ARG (argv); ACE_DEBUG ((LM_DEBUG, "(%P | %t):Test starts\n")); // = Get two POSIX_SIG_Proactors, one with SIGRTMIN and one with // SIGRTMAX. ACE_Proactor proactor1; // Proactor1. SIGRTMIN Proactor. (default). // = Proactor2. SIGRTMAX Proactor. #if defined (ACE_HAS_AIO_CALLS) && defined (ACE_HAS_POSIX_REALTIME_SIGNALS) ACE_DEBUG ((LM_DEBUG, "Using ACE_POSIX_SIG_Proactor\n")); sigset_t signal_set; // Signal set that we want to mask. // Clear the signal set. if (ACE_OS::sigemptyset (&signal_set) == -1) ACE_ERROR_RETURN ((LM_ERROR, "Error:%p\n", "sigemptyset failed"), 1); // Add the SIGRTMAX to the signal set. if (ACE_OS::sigaddset (&signal_set, ACE_SIGRTMAX) == -1) ACE_ERROR_RETURN ((LM_ERROR, "Error:%p\n", "sigaddset failed"), 1); // Make the POSIX Proactor. ACE_POSIX_SIG_Proactor posix_proactor (signal_set); // Get the Proactor interface out of it. ACE_Proactor proactor2 (&posix_proactor); #else /* ACE_HAS_AIO_CALLS && ACE_HAS_POSIX_REALTIME_SIGNALS */ ACE_Proactor proactor2; #endif /* ACE_HAS_AIO_CALLS && ACE_HAS_POSIX_REALTIME_SIGNALS */ // = Create Tasks. One pool of threads to handle completions on // SIGRTMIN and the other one to handle completions on SIGRTMAX. My_Task task1, task2; task1.open (&proactor1); task2.open (&proactor2); // Handler for completions. My_Handler handler; // = Create a few MyResult objects and post them to Proactor. const size_t NrCompletions (10); My_Result *result_objects [NrCompletions]; int signal_number = ACE_SIGRTMAX; size_t ri = 0; Completions_To_Go = NrCompletions; // Creation. for (ri = 0; ri < NrCompletions; ri++) { // Use RTMIN and RTMAX proactor alternatively, to post // completions. if (ri % 2) signal_number = ACE_SIGRTMIN; else signal_number = ACE_SIGRTMAX; // Create the result. ACE_NEW_RETURN (result_objects [ri], My_Result (handler, 0, signal_number, ri), 1); } ACE_OS::sleep(5); // Post all the result objects. ACE_Proactor *proactor; for (ri = 0; ri < NrCompletions; ri++) { // Use RTMIN and RTMAX Proactor alternatively, to post // completions. if (ri % 2) proactor = &proactor1; else proactor = &proactor2; if (result_objects [ri]->post_completion (proactor->implementation ()) == -1) ACE_ERROR_RETURN ((LM_ERROR, "Test failed\n"), 1); } ACE_Thread_Manager::instance ()->wait (); int status = 0; size_t to_go = Completions_To_Go.value (); if (size_t (0) != to_go) { ACE_ERROR ((LM_ERROR, "Fail! Expected all completions to finish but %u to go\n", to_go)); status = 1; } ACE_DEBUG ((LM_DEBUG, "(%P | %t):Test ends\n")); return status; }