1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
** $Id: TP_Reactor_Logging_Server.cpp 80826 2008-03-04 14:51:23Z wotte $
**
** Copyright 2002 Addison Wesley. All Rights Reserved.
*/
// FUZZ: disable check_for_streams_include
#include "ace/streams.h"
#include "ace/Auto_Ptr.h"
#include "ace/Reactor.h"
#include "ace/TP_Reactor.h"
#include "ace/Thread_Manager.h"
#if defined (ACE_WIN32) && (!defined (ACE_HAS_STANDARD_CPP_LIBRARY) || \
(ACE_HAS_STANDARD_CPP_LIBRARY == 0) || \
defined (ACE_USES_OLD_IOSTREAMS))
# include <stdio.h>
#else
# include <string>
#endif
#include "Reactor_Logging_Server_T.h"
#include "Logging_Acceptor_Ex.h"
typedef Reactor_Logging_Server<Logging_Acceptor_Ex>
Server_Logging_Daemon;
class Quit_Handler : public ACE_Event_Handler {
public:
Quit_Handler (ACE_Reactor *r) : ACE_Event_Handler (r) {}
virtual int handle_exception (ACE_HANDLE) {
reactor ()->end_reactor_event_loop ();
return -1; // Trigger call to handle_close() method.
}
virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask)
{ delete this; return 0; }
protected:
// Protected destructor ensures dynamic allocation.
virtual ~Quit_Handler () {}
};
static ACE_THR_FUNC_RETURN event_loop (void *arg) {
ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg);
reactor->owner (ACE_OS::thr_self ());
reactor->run_reactor_event_loop ();
return 0;
}
static ACE_THR_FUNC_RETURN controller (void *arg) {
ACE_Reactor *reactor = static_cast<ACE_Reactor *> (arg);
Quit_Handler *quit_handler = 0;
ACE_NEW_RETURN (quit_handler, Quit_Handler (reactor), 0);
#if defined (ACE_WIN32) && (!defined (ACE_HAS_STANDARD_CPP_LIBRARY) || \
(ACE_HAS_STANDARD_CPP_LIBRARY == 0) || \
defined (ACE_USES_OLD_IOSTREAMS))
for (;;) {
char user_input[80];
ACE_OS::fgets (user_input, sizeof (user_input), stdin);
if (ACE_OS::strcmp (user_input, "quit") == 0) {
reactor->notify (quit_handler);
break;
}
}
#else
for (;;) {
#if defined (ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB) && (ACE_USES_STD_NAMESPACE_FOR_STDCPP_LIB == 0)
string user_input;
getline (cin, user_input, '\n');
#else
std::string user_input;
std::getline (cin, user_input, '\n');
#endif
if (user_input == "quit") {
reactor->notify (quit_handler);
break;
}
}
#endif
return 0;
}
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
const size_t N_THREADS = 4;
ACE_TP_Reactor tp_reactor;
ACE_Reactor reactor (&tp_reactor);
auto_ptr<ACE_Reactor> delete_instance
(ACE_Reactor::instance (&reactor));
Server_Logging_Daemon *server;
// Ignore argv[0]...
--argc; ++argv;
ACE_NEW_RETURN (server,
Server_Logging_Daemon (argc, argv,
ACE_Reactor::instance ()),
1);
ACE_Thread_Manager::instance ()->spawn_n
(N_THREADS, event_loop, ACE_Reactor::instance ());
ACE_Thread_Manager::instance ()->spawn
(controller, ACE_Reactor::instance ());
return ACE_Thread_Manager::instance ()->wait ();
}
|