aboutsummaryrefslogtreecommitdiff
path: root/src/server/authserver
diff options
context:
space:
mode:
authorDerex <derex101@gmail.com>2011-06-23 11:14:01 +0200
committerclick <click@gonnamakeyou.com>2011-06-23 11:14:01 +0200
commitd65e1d9a3fc7d597425d6b1fed76d07b22d6008c (patch)
tree8dde4e5dfc82b559969c3916e55e9b22e15e4e70 /src/server/authserver
parent90a34fdc0644a6165bdd2dc9dcf2adf87e74807a (diff)
Core/Network: Handle running out of file descriptors on linux-based systems (windows-based systems requires additional fixes)
Signed-off-by: click <click@gonnamakeyou.com>
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