コード例 #1
0
ファイル: Server.cpp プロジェクト: cveticmilan/Blok1
DWORD WINAPI ThreadPopBuffer(LPVOID lpParam)
{
	T_ThreadParams params = *(T_ThreadParams*)lpParam;
	T_ProcessArray* processArray = params.processArray;
	CircularBuffer* circularBuffer = params.circularBuffer;
	CircularBuffer* syncBuffer = params.syncBuffer;
	SOCKET connectSocket = params.socket;
	bool* working = params.working;
	bool* replicatorsConnected = params.replicatorsConnected;
	bool* popFinished = params.popFinished;
	char* retVal;
	printf("[ThreadPopBuffer] ThreadPopBuffer started\n");
	int iResult;
	int numOfEmptyBuffers = 0;
	while (*working)
	{
		if (!*replicatorsConnected)
		{
			break;
		}
		numOfEmptyBuffers = 0;
		retVal = circularBuffer->Pop();
		if (retVal == NULL)
		{
			numOfEmptyBuffers++;
		}
		else
		{
			iResult = Send(retVal, *(int*)retVal, connectSocket, working);
			free(retVal);

			if (iResult == SocketStatus::Shutdown || iResult == SocketStatus::Error || iResult == SocketStatus::Closed)
			{
				printf("Replicator disconnected!\n");
				*replicatorsConnected = false;
				break;
			}
		}

		retVal = syncBuffer->Pop();
		if (retVal == NULL)
		{
			numOfEmptyBuffers++;
		}
		else
		{
			iResult = Send(retVal, *(int*)retVal, connectSocket, working);
			free(retVal);

			if (iResult == SocketStatus::Shutdown || iResult == SocketStatus::Error || iResult == SocketStatus::Closed)
			{
				printf("Replicator disconnected!\n");
				*replicatorsConnected = false;
				break;
			}
		}

		if (numOfEmptyBuffers == 2)
		{
			Sleep(SLEEP_TIME);
			continue;
		}
	}

	iResult = shutdown(params.socket, SD_SEND);
	if (iResult == SOCKET_ERROR)
	{
		printf("[206]shutdown failed with error: %d\n", WSAGetLastError());
	}

	printf("[ThreadPopBuffer] Ended gracefully\n");
	// signal ThreadForward to close socket and delete params
	*popFinished = true;
	RemoveFromProcessArray(processArray, POP_PROCESS_ID);
	return 0;
}