diff --git a/Server/Network/SocketPool.cs b/Server/Network/SocketPool.cs new file mode 100644 index 000000000..0a1e1fe58 --- /dev/null +++ b/Server/Network/SocketPool.cs @@ -0,0 +1,101 @@ +/*************************************************************************** + * SocketPool.cs + * ------------------- + * begin : May 1, 2002 + * copyright : (C) The RunUO Software Team + * email : info@runuo.com + * + * $Id$ + * + ***************************************************************************/ + +/*************************************************************************** + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + ***************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Net.Sockets; + +namespace Server.Network +{ + public class SocketPool + { + private static bool m_Created = false; + + public static bool Created + { + get { return m_Created; } + } + + private static int m_Misses = 0; + private static int m_InitialCapacity = 32; + + public static int InitialCapacity + { + get { return m_InitialCapacity; } + set { + if ( m_Created ) + return; + + m_InitialCapacity = value; + } + } + + private static Queue m_FreeSockets; + + public static void Create() + { + if ( m_Created ) + return; + + m_FreeSockets = new Queue( m_InitialCapacity ); + + for ( int i = 0; i < m_InitialCapacity; ++i ) + m_FreeSockets.Enqueue( new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ) ); + + m_Created = true; + } + + public static void Destroy() + { + if ( !m_Created ) + return; + + while ( m_FreeSockets.Count > 0 ) + m_FreeSockets.Dequeue().Close(); + + m_FreeSockets = null; + } + + public static Socket AcquireSocket() + { + lock ( m_FreeSockets ) + { + if ( m_FreeSockets.Count > 0 ) + return m_FreeSockets.Dequeue(); + + ++m_Misses; + + for ( int i = 0; i < m_InitialCapacity; ++i ) + m_FreeSockets.Enqueue( new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ) ); + + return m_FreeSockets.Dequeue(); + } + } + + public static void ReleaseSocket( Socket s ) + { + if ( s == null ) + return; + + lock ( m_FreeSockets ) + m_FreeSockets.Enqueue( s ); + } + } +} \ No newline at end of file