bool LocalSocketPrivate::waitForDataWritten(QElapsedTimer& timer, int timeout)
{
	bool	readyRead		=	false;
	bool	readyWrite	=	false;
	
	disableReadNotifier();
	disableWriteNotifier();
	disableExceptionNotifier();
	
	QReadLocker		controlLock(&m_controlLock);
	
	while(m_isOpen && (timeout > 0 ? timer.elapsed() < timeout : !readyWrite))
	{
		controlLock.unlock();
		
		// We need to read and to write
		readyWrite	=	true;
		// We need to read
		readyRead		=	true;
		
		bool	ret	=	waitForReadOrWrite(readyRead, readyWrite, (timeout > 0 ? timeout - timer.elapsed() : 0));
		
		// Failed to wait
		if(!ret)
		{
			controlLock.relock();
			
			if(m_isOpen)
			{
				enableReadNotifier();
				enableWriteNotifier();
				enableExceptionNotifier();
			}
			
			return false;
		}
		
		// Read and write data if we can
		if(readyWrite)
			writeData();
		if(readyRead)
			readData();
		
		if(readyWrite)
			break;
		
		readyRead		=	false;
		readyWrite	=	false;
	}
	controlLock.unlock();
	
	enableReadNotifier();
	enableWriteNotifier();
	enableExceptionNotifier();
  
	return readyWrite;
}
void LocalSocketPrivate::setError(const QString& errorString)
{
// 	qDebug("[%p] LocalSocketPrivate::setError() - %s", this, qPrintable(errorString));
	
	{
		QWriteLocker		controlLock(&m_controlLock);
		m_errorString	=	errorString;
	}
	
	emit(error(errorString));
	
	setClosed();
}
void LocalSocketPrivate::enableExceptionNotifier()
{
	QReadLocker		controlLock(&m_controlLock);
	
	if(!m_socketDescriptor)
		return;
	
	QWriteLocker		notifierLocker(&m_notifierLock);
	
	if(!m_exceptionNotifier)
	{
		m_exceptionNotifier	=	new QSocketNotifier(m_socketDescriptor, QSocketNotifier::Exception);
		connect(m_exceptionNotifier, SIGNAL(activated(int)), SLOT(exception()));
	}
	
	m_exceptionNotifier->setEnabled(true);
}
void LocalSocketPrivate::flush()
{
	QReadLocker		readLocker(&m_writeBufferLock);
	QReadLocker		controlLock(&m_controlLock);
	
	while(m_isOpen && !m_writeBuffer.isEmpty() && !m_currentReadData.isEmpty())
	{
		controlLock.unlock();
		readLocker.unlock();
// 		qDebug("[%p] LocalSocketPrivate::flush() - flushing", this);
		writeData();
		readData();
		
		readLocker.relock();
		controlLock.relock();
	}
}
void LocalSocketPrivate::setOpened()
{
	QWriteLocker		controlLock(&m_controlLock);
	
	if(m_isOpen)
		return;
	
	m_isOpen	=	true;
	controlLock.unlock();
	
	// Enable notifiers
	enableReadNotifier();
	enableWriteNotifier();
	enableExceptionNotifier();
	
	writeData();
	readData();
}
void LocalSocketPrivate::setClosed()
{
	QWriteLocker		controlLock(&m_controlLock);
	
	if(!m_isOpen)
		return;
	
// 	qDebug("[%p] LocalSocketPrivate::setClosed()", this);
	
	m_isOpen	=	false;
	m_socketDescriptor	=	0;
	controlLock.unlock();
	
	// Remove socket notifier
	removeReadNotifier();
	removeWriteNotifier();
	removeExceptionNotifier();
	
	QWriteLocker		writeLocker(&m_writeBufferLock);
	
	// Clear write data
	if(m_currentlyWritingFileDescriptor)
		delete m_currentlyWritingFileDescriptor;
	m_currentlyWritingFileDescriptor	=	0;
	m_currentWriteData.clear();
	m_currentWriteDataPos	=	0;
	m_writeBuffer.clear();
  writeLocker.unlock();
	
	// Clear temporary read data
	m_currentReadData.clear();
	m_tempReadBuffer.clear();
	m_tempReadFileDescBuffer.clear();
	
	emit(disconnected());
}
示例#7
0
unsigned int MusicChannel::GetPlayTime()
{
	boost::mutex::scoped_lock controlLock(musicMutex);
	return oggStream.GetPlayTime();
}
示例#8
0
void MusicChannel::Stop()
{
	boost::mutex::scoped_lock controlLock(musicMutex);
	playing = false;
}
示例#9
0
void MusicChannel::Pause()
{
	boost::mutex::scoped_lock controlLock(musicMutex);
	oggStream.TogglePause();
}
示例#10
0
void MusicChannel::SetVolume(float newvolume)
{
	volume = newvolume;
	boost::mutex::scoped_lock controlLock(musicMutex);
	oggStream.SetVolume(nextTrack.volume * volume);
}
bool LocalSocketPrivate::waitForReadyRead(QElapsedTimer& timer, int timeout)
{
	bool	readyRead		=	false;
	bool	readyWrite	=	false;
	
  // Don't disable and reenable the socket notifiers as it seems unneeded, costs a lot of cpu time and blocks at some time (with lots of sockets)
// 	disableReadNotifier();
// 	disableWriteNotifier();
// 	disableExceptionNotifier();
	
	QReadLocker		controlLock(&m_controlLock);
	
	while(m_isOpen && (timeout > 0 ? timer.elapsed() < timeout : !readyWrite))
	{
		controlLock.unlock();
    QReadLocker   readLocker(&m_readBufferLock);
    // We need to read
    readyRead		=	m_readBuffer.isEmpty();
		readLocker.unlock();
    
    if(!readyRead)
      return true;
    
    QReadLocker   writeLocker(&m_writeBufferLock);
    // Do we need to write?
    readyWrite  = (!m_currentWriteData.isEmpty() || !m_writeBuffer.isEmpty());
    writeLocker.unlock();
		
		bool	ret	=	waitForReadOrWrite(readyRead, readyWrite, (timeout > 0 ? timeout - timer.elapsed() : 0));
		
		// Failed to wait
		if(!ret)
		{
			controlLock.relock();
			if(m_isOpen)
			{
        // Don't disable and reenable the socket notifiers as it seems unneeded, costs a lot of cpu time and blocks at some time (with lots of sockets)
// 				enableReadNotifier();
// 				enableWriteNotifier();
// 				enableExceptionNotifier();
			}
			
			return false;
		}
		
		// Read and write data if we can
		if(readyWrite)
			writeData();
		if(readyRead)
			readData();
		
		if(readyRead)
			break;
		
		readyRead		=	false;
		readyWrite	=	false;
	}
	controlLock.unlock();
	
  // Don't disable and reenable the socket notifiers as it seems unneeded, costs a lot of cpu time and blocks at some time (with lots of sockets)
// 	enableReadNotifier();
// 	enableWriteNotifier();
// 	enableExceptionNotifier();
  
	return readyRead;
}