コード例 #1
0
	void PollingBuffer::performTransimission(uint32_t event) {
        if (event & EPOLLOUT && m_outputData.size() != 0) {
            std::cout << "#Writing data" << std::endl;
            performWrite();
        }

        pushMessages();
        popMessages();

        if (m_ballance == 0 && (event & EPOLLIN)) {
			std::cout << "#Reading data" << std::endl;
			performRead();
		}

	}
コード例 #2
0
ファイル: Target.cpp プロジェクト: Drakesinger/Cinder
void TargetFile::write( const Buffer *buffer, size_t numFrames, size_t frameOffset )
{
	CI_ASSERT_MSG( numFrames + frameOffset <= buffer->getNumFrames(), "numFrames + frameOffset out of bounds" );

	performWrite( buffer, numFrames, frameOffset );
}
コード例 #3
0
ファイル: Target.cpp プロジェクト: Drakesinger/Cinder
void TargetFile::write( const Buffer *buffer )
{
	performWrite( buffer, buffer->getNumFrames(), 0 );
}
コード例 #4
0
ファイル: Target.cpp プロジェクト: Drakesinger/Cinder
void TargetFile::write( const Buffer *buffer, size_t numFrames )
{
	CI_ASSERT_MSG( numFrames <= buffer->getNumFrames(), "numFrames out of bounds" );

	performWrite( buffer, numFrames, 0 );
}
コード例 #5
0
ファイル: IPCPipeBase.cpp プロジェクト: EasyCoding/desura-app
void PipeBase::processEvents()
{
	DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500);

	if (isStopped())
		return;

	if (dwWait == WAIT_TIMEOUT)
		return;

	if (dwWait == WAIT_FAILED)
	{
		DWORD lErr = GetLastError();
		return;
	}

	// dwWait shows which pipe completed the operation.
	size_t i = dwWait - WAIT_OBJECT_0;  // determines which pipe
	if (i < 0 || i > (getNumEvents() - 1))
	{
		printf("Index out of range.\n");
		return;
	}

	PipeData* data = getData(i);
	DWORD cbRet = 0;

#ifdef IPC_DEBUG
	if (fh)
	{
		fprintf(fh, "Triggered event %d\n", i);
		fflush(fh);
	}
#endif
	//printf("Event %d, P: %d\n", i, data->fPendingIO);


	// Get the result if the operation was pending.
	if (data->fPendingIO)
	{
		BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);

		//printf("Pending S: %d A: %d P: %d\n", fSuccess, cbRet, data->pendingConnection);

		if (data->pendingConnection)
		{
			if (!fSuccess)
				throw gcException(ERR_PIPE, GetLastError(), gcString("Error {0}.\n", GetLastError()));

			data->pendingConnection = false;
			data->fPendingIO = FALSE;
		}
		else
		{
			DWORD err = GetLastError();

			//Buffer is full. Wait for space
			if (err == ERROR_IO_INCOMPLETE)
				fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE);

			if (!fSuccess || (cbRet == 0 && data->sender == false)) // || (cbRet != data->size && data->sender == true)
			{
				disconnectAndReconnect(i);
				ResetEvent(m_hEventsArr[i]);
				printf("Disconnect pending!\n");
				return;
			}

			if (!data->sender)
			{
				data->size = cbRet;
				finishRead(data, getManager(i));
			}
		}
	}

	bool res = false;

	// The pipe state determines which operation to do next.
	if (data->sender)
		res = performWrite(data, getManager(i));
	else
		res = performRead(data, getManager(i));

	if (res)
		ResetEvent(m_hEventsArr[i]);
}