aboutsummaryrefslogtreecommitdiff
path: root/src/server/authserver
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/authserver')
-rwxr-xr-xsrc/server/authserver/Server/RealmAcceptor.h26
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