亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? wait.cpp

?? 加密函數庫:包括多種加密解密算法,數字簽名,散列算法
?? CPP
字號:
// wait.cpp - written and placed in the public domain by Wei Dai

#include "pch.h"
#include "wait.h"
#include "misc.h"

#ifdef SOCKETS_AVAILABLE

#ifdef USE_BERKELEY_STYLE_SOCKETS
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#endif

NAMESPACE_BEGIN(CryptoPP)

WaitObjectContainer::WaitObjectContainer()
{
	Clear();
}

void WaitObjectContainer::Clear()
{
#ifdef USE_WINDOWS_STYLE_SOCKETS
	m_handles.clear();
#else
	m_maxFd = 0;
	FD_ZERO(&m_readfds);
	FD_ZERO(&m_writefds);
#endif
	m_noWait = false;
}

#ifdef USE_WINDOWS_STYLE_SOCKETS

struct WaitingThreadData
{
	bool waitingToWait, terminate;
	HANDLE startWaiting, stopWaiting;
	const HANDLE *waitHandles;
	unsigned int count;
	HANDLE threadHandle;
	DWORD threadId;
	DWORD* error;
};

WaitObjectContainer::~WaitObjectContainer()
{
	try		// don't let exceptions escape destructor
	{
		if (!m_threads.empty())
		{
			HANDLE threadHandles[MAXIMUM_WAIT_OBJECTS];
			unsigned int i;
			for (i=0; i<m_threads.size(); i++)
			{
				WaitingThreadData &thread = *m_threads[i];
				while (!thread.waitingToWait)	// spin until thread is in the initial "waiting to wait" state
					Sleep(0);
				thread.terminate = true;
				threadHandles[i] = thread.threadHandle;
			}
			PulseEvent(m_startWaiting);
			::WaitForMultipleObjects(m_threads.size(), threadHandles, TRUE, INFINITE);
			for (i=0; i<m_threads.size(); i++)
				CloseHandle(threadHandles[i]);
			CloseHandle(m_startWaiting);
			CloseHandle(m_stopWaiting);
		}
	}
	catch (...)
	{
	}
}


void WaitObjectContainer::AddHandle(HANDLE handle)
{
	m_handles.push_back(handle);
}

DWORD WINAPI WaitingThread(LPVOID lParam)
{
	std::auto_ptr<WaitingThreadData> pThread((WaitingThreadData *)lParam);
	WaitingThreadData &thread = *pThread;
	std::vector<HANDLE> handles;

	while (true)
	{
		thread.waitingToWait = true;
		::WaitForSingleObject(thread.startWaiting, INFINITE);
		thread.waitingToWait = false;

		if (thread.terminate)
			break;
		if (!thread.count)
			continue;

		handles.resize(thread.count + 1);
		handles[0] = thread.stopWaiting;
		std::copy(thread.waitHandles, thread.waitHandles+thread.count, handles.begin()+1);

		DWORD result = ::WaitForMultipleObjects(handles.size(), &handles[0], FALSE, INFINITE);

		if (result == WAIT_OBJECT_0)
			continue;	// another thread finished waiting first, so do nothing
		SetEvent(thread.stopWaiting);
		if (!(result > WAIT_OBJECT_0 && result < WAIT_OBJECT_0 + handles.size()))
		{
			assert(!"error in WaitingThread");	// break here so we can see which thread has an error
			*thread.error = ::GetLastError();
		}
	}

	return S_OK;	// return a value here to avoid compiler warning
}

void WaitObjectContainer::CreateThreads(unsigned int count)
{
	unsigned int currentCount = m_threads.size();
	if (currentCount == 0)
	{
		m_startWaiting = ::CreateEvent(NULL, TRUE, FALSE, NULL);
		m_stopWaiting = ::CreateEvent(NULL, TRUE, FALSE, NULL);
	}

	if (currentCount < count)
	{
		m_threads.resize(count);
		for (unsigned int i=currentCount; i<count; i++)
		{
			m_threads[i] = new WaitingThreadData;
			WaitingThreadData &thread = *m_threads[i];
			thread.terminate = false;
			thread.startWaiting = m_startWaiting;
			thread.stopWaiting = m_stopWaiting;
			thread.waitingToWait = false;
			thread.threadHandle = CreateThread(NULL, 0, &WaitingThread, &thread, 0, &thread.threadId);
		}
	}
}

bool WaitObjectContainer::Wait(unsigned long milliseconds)
{
	if (m_noWait || m_handles.empty())
		return true;

	if (m_handles.size() > MAXIMUM_WAIT_OBJECTS)
	{
		// too many wait objects for a single WaitForMultipleObjects call, so use multiple threads
		static const unsigned int WAIT_OBJECTS_PER_THREAD = MAXIMUM_WAIT_OBJECTS-1;
		unsigned int nThreads = (m_handles.size() + WAIT_OBJECTS_PER_THREAD - 1) / WAIT_OBJECTS_PER_THREAD;
		if (nThreads > MAXIMUM_WAIT_OBJECTS)	// still too many wait objects, maybe implement recursive threading later?
			throw Err("WaitObjectContainer: number of wait objects exceeds limit");
		CreateThreads(nThreads);
		DWORD error = S_OK;
		
		for (unsigned int i=0; i<m_threads.size(); i++)
		{
			WaitingThreadData &thread = *m_threads[i];
			while (!thread.waitingToWait)	// spin until thread is in the initial "waiting to wait" state
				Sleep(0);
			if (i<nThreads)
			{
				thread.waitHandles = &m_handles[i*WAIT_OBJECTS_PER_THREAD];
				thread.count = STDMIN(WAIT_OBJECTS_PER_THREAD, m_handles.size() - i*WAIT_OBJECTS_PER_THREAD);
				thread.error = &error;
			}
			else
				thread.count = 0;
		}

		ResetEvent(m_stopWaiting);
		PulseEvent(m_startWaiting);

		DWORD result = ::WaitForSingleObject(m_stopWaiting, milliseconds);
		if (result == WAIT_OBJECT_0)
		{
			if (error == S_OK)
				return true;
			else
				throw Err("WaitObjectContainer: WaitForMultipleObjects failed with error " + IntToString(error));
		}
		SetEvent(m_stopWaiting);
		if (result == WAIT_TIMEOUT)
			return false;
		else
			throw Err("WaitObjectContainer: WaitForSingleObject failed with error " + IntToString(::GetLastError()));
	}
	else
	{
		DWORD result = ::WaitForMultipleObjects(m_handles.size(), &m_handles[0], FALSE, milliseconds);
		if (result >= WAIT_OBJECT_0 && result < WAIT_OBJECT_0 + m_handles.size())
			return true;
		else if (result == WAIT_TIMEOUT)
			return false;
		else
			throw Err("WaitObjectContainer: WaitForMultipleObjects failed with error " + IntToString(::GetLastError()));
	}
}

#else

void WaitObjectContainer::AddReadFd(int fd)
{
	FD_SET(fd, &m_readfds);
	m_maxFd = STDMAX(m_maxFd, fd);
}

void WaitObjectContainer::AddWriteFd(int fd)
{
	FD_SET(fd, &m_writefds);
	m_maxFd = STDMAX(m_maxFd, fd);
}

bool WaitObjectContainer::Wait(unsigned long milliseconds)
{
	if (m_noWait || m_maxFd == 0)
		return true;

	timeval tv, *timeout;

	if (milliseconds == INFINITE_TIME)
		timeout = NULL;
	else
	{
		tv.tv_sec = milliseconds / 1000;
		tv.tv_usec = (milliseconds % 1000) * 1000;
		timeout = &tv;
	}

	int result = select(m_maxFd+1, &m_readfds, &m_writefds, NULL, timeout);

	if (result > 0)
		return true;
	else if (result == 0)
		return false;
	else
		throw Err("WaitObjectContainer: select failed with error " + errno);
}

#endif

// ********************************************************

bool Waitable::Wait(unsigned long milliseconds)
{
	WaitObjectContainer container;
	GetWaitObjects(container);
	return container.Wait(milliseconds);
}

NAMESPACE_END

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品久久99ma| 欧美精品自拍偷拍| 91黄色免费看| 337p日本欧洲亚洲大胆色噜噜| 国产欧美日韩在线看| 午夜欧美电影在线观看| 丁香亚洲综合激情啪啪综合| 欧美午夜寂寞影院| 国产精品欧美久久久久一区二区 | 图片区小说区区亚洲影院| 国产不卡视频在线观看| 欧美日韩亚洲综合| 国产精品成人一区二区三区夜夜夜| 欧美aaa在线| 99re这里只有精品首页| 中文字幕欧美区| 国产在线观看一区二区| 欧美一级精品在线| 亚洲sss视频在线视频| 91麻豆免费在线观看| 欧美羞羞免费网站| 国产精品一区二区在线观看网站| 蜜桃视频一区二区三区| 国产一区91精品张津瑜| 欧美亚洲国产一区在线观看网站 | 99久久免费视频.com| 亚洲精品在线免费观看视频| 亚洲综合免费观看高清完整版在线| 成人国产电影网| 国产午夜精品久久| 黄色日韩网站视频| 欧美精品一区在线观看| 美女一区二区久久| 日韩欧美综合一区| 奇米影视在线99精品| 欧美美女直播网站| 日韩成人av影视| 91精品国产欧美日韩| 日日嗨av一区二区三区四区| 92精品国产成人观看免费| 欧美日韩国产美女| 免费的成人av| 一本大道av伊人久久综合| 国产精品久久久久久久久免费丝袜 | 91久久精品一区二区三| 亚洲欧洲综合另类在线| 欧美探花视频资源| 婷婷综合在线观看| 欧美成人r级一区二区三区| 国产麻豆日韩欧美久久| 国产精品乱码妇女bbbb| 97精品电影院| 亚洲va欧美va国产va天堂影院| 欧美精选午夜久久久乱码6080| 蜜桃视频在线一区| 日本一区二区三区视频视频| 成人高清免费在线播放| 日韩毛片一二三区| 欧美专区亚洲专区| 日av在线不卡| 久久麻豆一区二区| 91美女片黄在线观看91美女| 一区二区三区色| 欧美一级久久久| www.在线欧美| 日本成人中文字幕在线视频 | 国产色产综合产在线视频| 成人性生交大合| 亚洲国产欧美在线| 久久久噜噜噜久久中文字幕色伊伊 | 亚欧色一区w666天堂| 精品女同一区二区| 97久久精品人人爽人人爽蜜臀| 午夜电影一区二区| 国产亚洲精品中文字幕| 欧美日韩电影一区| 成人成人成人在线视频| 日韩电影一区二区三区四区| 中日韩av电影| 日韩片之四级片| 色婷婷av一区二区三区gif| 精品一区二区综合| 亚洲国产精品精华液网站| 国产欧美一区二区精品性色| 欧美日韩国产高清一区二区| 成人中文字幕合集| 秋霞成人午夜伦在线观看| 亚洲手机成人高清视频| 亚洲精品一区二区三区四区高清 | 色婷婷精品大视频在线蜜桃视频| 在线成人午夜影院| 欧美影院一区二区| 国产成人免费视频网站| 日韩国产欧美三级| 玉足女爽爽91| 日本一区二区三级电影在线观看| 7878成人国产在线观看| 97超碰欧美中文字幕| 国产91丝袜在线18| 老司机一区二区| 偷拍一区二区三区四区| 一区二区三区产品免费精品久久75| 久久久久国产成人精品亚洲午夜| 欧美精品一级二级| 在线免费观看日本一区| 一本一道综合狠狠老| 粉嫩一区二区三区在线看| 欧美在线免费视屏| 99久久婷婷国产综合精品电影| 国产精品自产自拍| 国产精品亚洲午夜一区二区三区 | 精品91自产拍在线观看一区| 欧美成人免费网站| 欧美日韩精品是欧美日韩精品| 成人av集中营| 东方aⅴ免费观看久久av| 国产成人精品亚洲777人妖| 久久99精品国产91久久来源 | 中文字幕精品在线不卡| 国产夜色精品一区二区av| 久久九九久精品国产免费直播| 欧美精品一区二区高清在线观看| 91精品免费在线| 日韩欧美国产三级电影视频| 欧美一级一区二区| 日韩色视频在线观看| 精品免费国产一区二区三区四区| 日韩欧美资源站| 久久美女艺术照精彩视频福利播放| 久久一区二区三区国产精品| 欧美国产日本韩| 亚洲色图第一区| 一区二区高清免费观看影视大全| 亚洲最大成人网4388xx| 午夜精品福利一区二区蜜股av | 久久精品日产第一区二区三区高清版| 精品欧美乱码久久久久久| 国产婷婷色一区二区三区在线| 中文字幕国产一区| 亚洲尤物在线视频观看| 中文字幕久久午夜不卡| 国产毛片精品视频| 亚洲激情图片小说视频| 亚洲一区二区三区精品在线| 亚洲国产欧美在线| 久久国产麻豆精品| 国产999精品久久久久久| 色综合色综合色综合| 欧美日韩三级视频| 精品日韩成人av| 一区二区三区欧美日韩| 成人avav在线| 欧美日韩一区成人| 国产区在线观看成人精品| 亚洲精品国产无天堂网2021| 美女视频网站久久| 高清免费成人av| 欧美蜜桃一区二区三区| 国产色婷婷亚洲99精品小说| 午夜免费久久看| 国产传媒一区在线| 欧美猛男超大videosgay| 国产精品每日更新| 日本在线观看不卡视频| av电影天堂一区二区在线| 亚洲国产色一区| 91在线porny国产在线看| 欧美蜜桃一区二区三区| 91色视频在线| 精品久久国产老人久久综合| 一区二区三区国产精华| 国产乱子轮精品视频| 欧美精品日韩综合在线| 国产精品久久久久久久久动漫 | 91视频在线观看免费| 日韩一区二区电影| 亚洲午夜视频在线观看| 丁香婷婷深情五月亚洲| 欧美成人a视频| 婷婷综合另类小说色区| 色哟哟在线观看一区二区三区| 精品理论电影在线| 亚洲va欧美va人人爽| 欧美一区二区视频在线观看| 中文字幕一区二区三区视频| 久久er精品视频| 欧美一区二区三区啪啪| 亚洲综合在线第一页| 成人av一区二区三区| 久久精品视频在线免费观看 | 国产一区不卡精品| 国内外精品视频| 4438成人网| 亚洲h在线观看| 91成人免费在线视频| 亚洲欧美在线aaa| 粉嫩一区二区三区在线看| 久久嫩草精品久久久精品一| 久久精品国产成人一区二区三区| 欧美蜜桃一区二区三区|