当前位置: 首页 > 工具软件 > Arcemu > 使用案例 >

ARCEmu项目wow私服服务器网络模块分析(三)

秦毅
2023-12-01

看过network代码的筒子,会发现类定义的时候,经常出现一个Singleton。


为啥要单例啊,这让我们苦比的中国人情何以堪。


Singleton定义如下:

template < class type > class SERVER_DECL Singleton
{
	public:
		/// Constructor
		Singleton()
		{
			/// If you hit this assert, this singleton already exists -- you can't create another one!
			ASSERT(this->mSingleton == 0);
			this->mSingleton = static_cast<type*>(this);
		}
		/// Destructor
		virtual ~Singleton()
		{
			this->mSingleton = 0;
		}

		ARCEMU_INLINE static type & getSingleton() { ASSERT(mSingleton); return *mSingleton; }
		ARCEMU_INLINE static type* getSingletonPtr() { return mSingleton; }

	protected:

		/// Singleton pointer, must be set to 0 prior to creating the object
		static type* mSingleton;
};


人们常说知道设计模式,但不能滥用设计模式啊。


不过这里单例用的,恰到好处,不愧是10年磨一剑。


来看看单例的所到之处:


class SERVER_DECL SocketMgr : public Singleton<SocketMgr>
{
	public:
		SocketMgr();
		~SocketMgr();

		ARCEMU_INLINE HANDLE GetCompletionPort() { return m_completionPort; }
		void SpawnWorkerThreads();
		void CloseAll();
		void ShowStatus();
		void AddSocket(Socket* s)
		{
			socketLock.Acquire();
			_sockets.insert(s);
			++socket_count;
			socketLock.Release();
		}

		void RemoveSocket(Socket* s)
		{
			socketLock.Acquire();
			_sockets.erase(s);
			--socket_count;
			socketLock.Release();
		}

		void ShutdownThreads();
		long threadcount;

	private:
		HANDLE m_completionPort;
		set<Socket*> _sockets;
		Mutex socketLock;
		Arcemu::Threading::AtomicCounter socket_count;
};

这些代码看起来真舒服啊。


设计模式,依据项目环境,而是不因为设计而设计,论语有“过犹不及”。


继续下篇吧。

 类似资料: