diff options
Diffstat (limited to 'src/server/authserver')
| -rwxr-xr-x | src/server/authserver/Server/RealmAcceptor.h | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/server/authserver/Server/RealmAcceptor.h b/src/server/authserver/Server/RealmAcceptor.h index a245c7914f5..99817dfddac 100755 --- a/src/server/authserver/Server/RealmAcceptor.h +++ b/src/server/authserver/Server/RealmAcceptor.h @@ -29,7 +29,11 @@ class RealmAcceptor : public ACE_Acceptor<RealmSocket, ACE_SOCK_Acceptor> { public: RealmAcceptor(void) { } - virtual ~RealmAcceptor(void) { } + virtual ~RealmAcceptor(void) + { + if (reactor()) + reactor()->cancel_timer(this, 1); + } protected: virtual int make_svc_handler(RealmSocket *&sh) @@ -41,6 +45,26 @@ protected: sh->set_session(new AuthSocket(*sh)); return 0; } + + virtual int handle_timeout(const ACE_Time_Value& /*current_time*/, const void* /*act = 0*/) + { + sLog->outBasic("Resuming acceptor"); + reactor()->cancel_timer(this, 1); + return reactor()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK); + } + + virtual int handle_accept_error(void) + { +#if defined(ENFILE) && defined(EMFILE) + if (errno == ENFILE || errno == EMFILE) + { + sLog->outError("Out of file descriptors, suspending incoming connections for 10 seconds"); + reactor()->remove_handler(this, ACE_Event_Handler::ACCEPT_MASK | ACE_Event_Handler::DONT_CALL); + reactor()->schedule_timer(this, NULL, ACE_Time_Value(10)); + } +#endif + return 0; + } }; #endif |
