Ejemplo n.º 1
0
bool
O2Client::
Stop(void)
{
	if (!Active)
		return false;

	Active = false;

	ConnectSessionLock.Lock();
	{
		for (O2SocketSessionPSetIt ssit = connectss.begin(); ssit != connectss.end(); ssit++)
			closesocket((*ssit)->sock);
	}
	ConnectSessionLock.Unlock();

	SessionListLock.Lock();
	{
		for (O2SocketSessionPListIt ssit = sss.begin(); ssit != sss.end(); ssit++)
			closesocket((*ssit)->sock);
	}
	SessionListLock.Unlock();

	QueueExistSignal.On();
	SessionExistSignal.On();

	HANDLE handles[2] = { LaunchThreadHandle, NetIOThreadHandle };
	WaitForMultipleObjects(2, handles, TRUE, INFINITE);
	CloseHandle(LaunchThreadHandle);
	CloseHandle(NetIOThreadHandle);
	LaunchThreadHandle = 0;
	NetIOThreadHandle = 0;

	while (1) {
		ConnectSessionLock.Lock();
		size_t n = connectss.size();
		ConnectSessionLock.Unlock();
		if (n == 0) break;
		Sleep(THREAD_ALIVE_WAIT_MS);
	}

	OnClientStop();

	if (Logger)
		Logger->AddLog(O2LT_INFO, ClientName.c_str(), 0, 0, L"停止");
	return true;
}
Ejemplo n.º 2
0
bool
O2Client::
Stop(void)
{
	if (!Active)
		return false;

	Active = false;

	ConnectSessionLock.Lock();
	{
		for (O2SocketSessionPSetIt ssit = connectss.begin(); ssit != connectss.end(); ssit++)
		{
#ifdef _WIN32           /** winsock */
			closesocket((*ssit)->sock);
#else                   /** bsd socket */
			close((*ssit)->sock);
#endif
		}		
	}
	ConnectSessionLock.Unlock();

	SessionListLock.Lock();
	{
		for (O2SocketSessionPListIt ssit = sss.begin(); ssit != sss.end(); ssit++)
		{
#ifdef _WIN32		/** winsock */
			closesocket((*ssit)->sock);
#else         		/** bsd socket */
			close((*ssit)->sock);
#endif
		}
	}
	SessionListLock.Unlock();

	QueueExistSignal.On();
	SessionExistSignal.On();

#ifdef _WIN32 /** win32 thread */
	HANDLE handles[2] = { LaunchThreadHandle, NetIOThreadHandle };
	WaitForMultipleObjects(2, handles, TRUE, INFINITE);
	CloseHandle(LaunchThreadHandle);
	CloseHandle(NetIOThreadHandle);
	LaunchThreadHandle = 0;
	NetIOThreadHandle = 0;
#else   /** POSIX thrad */
	neosmart::WaitForMultipleEvents(handles, 2, TRUE, DosMocking::INFINITE);
	neosmart::DestroyEvent(handles[0]);
	neosmart::DestroyEvent(handles[1]);
	LaunchThreadHandle = 0;
	NetIOThreadHandle = 0;
#endif

	while (1) {
		ConnectSessionLock.Lock();
		size_t n = connectss.size();
		ConnectSessionLock.Unlock();
		if (n == 0) break;
		Sleep(THREAD_ALIVE_WAIT_MS);
	}

	OnClientStop();

	if (Logger)
		Logger->AddLog(O2LT_INFO, ClientName.c_str(), 0, 0, L"停止");
	return true;
}