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()); }
unsigned int MusicChannel::GetPlayTime() { boost::mutex::scoped_lock controlLock(musicMutex); return oggStream.GetPlayTime(); }
void MusicChannel::Stop() { boost::mutex::scoped_lock controlLock(musicMutex); playing = false; }
void MusicChannel::Pause() { boost::mutex::scoped_lock controlLock(musicMutex); oggStream.TogglePause(); }
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; }