void InterprocessConnection::run() { while (! threadShouldExit()) { if (socket != nullptr) { const int ready = socket->waitUntilReady (true, 0); if (ready < 0) { { const ScopedLock sl (pipeAndSocketLock); socket = nullptr; } connectionLostInt(); break; } else if (ready > 0) { if (! readNextMessageInt()) break; } else { Thread::sleep (1); } } else if (pipe != nullptr) { if (! pipe->isOpen()) { { const ScopedLock sl (pipeAndSocketLock); pipe = nullptr; } connectionLostInt(); break; } else { if (! readNextMessageInt()) break; } } else { break; } } }
void InterprocessConnection::runThread() { while (! thread->threadShouldExit()) { if (socket != nullptr) { auto ready = socket->waitUntilReady (true, 100); if (ready < 0) { deletePipeAndSocket(); connectionLostInt(); break; } if (ready == 0) { thread->wait (1); continue; } } else if (pipe != nullptr) { if (! pipe->isOpen()) { deletePipeAndSocket(); connectionLostInt(); break; } } else { break; } if (thread->threadShouldExit() || ! readNextMessage()) break; } threadIsRunning = false; }
//============================================================================== bool InterprocessConnection::readNextMessageInt() { uint32 messageHeader[2]; const int bytes = socket != nullptr ? socket->read (messageHeader, sizeof (messageHeader), true) : pipe ->read (messageHeader, sizeof (messageHeader), -1); if (bytes == sizeof (messageHeader) && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) { int bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); if (bytesInMessage > 0) { MemoryBlock messageData ((size_t) bytesInMessage, true); int bytesRead = 0; while (bytesInMessage > 0) { if (threadShouldExit()) return false; const int numThisTime = jmin (bytesInMessage, 65536); void* const data = addBytesToPointer (messageData.getData(), bytesRead); const int bytesIn = socket != nullptr ? socket->read (data, numThisTime, true) : pipe ->read (data, numThisTime, -1); if (bytesIn <= 0) break; bytesRead += bytesIn; bytesInMessage -= bytesIn; } if (bytesRead >= 0) deliverDataInt (messageData); } } else if (bytes < 0) { if (socket != nullptr) { const ScopedLock sl (pipeAndSocketLock); socket = nullptr; } connectionLostInt(); return false; } return true; }
void InterprocessConnection::run() { while (! threadShouldExit()) { if (socket != nullptr) { const int ready = socket->waitUntilReady (true, 0); if (ready < 0) { deletePipeAndSocket(); connectionLostInt(); break; } if (ready == 0) { wait (1); continue; } } else if (pipe != nullptr) { if (! pipe->isOpen()) { deletePipeAndSocket(); connectionLostInt(); break; } } else { break; } if (threadShouldExit() || ! readNextMessageInt()) break; } }
void InterprocessConnection::disconnect() { thread->signalThreadShouldExit(); { const ScopedLock sl (pipeAndSocketLock); if (socket != nullptr) socket->close(); if (pipe != nullptr) pipe->close(); } thread->stopThread (4000); deletePipeAndSocket(); connectionLostInt(); }
bool InterprocessConnection::readNextMessage() { uint32 messageHeader[2]; auto bytes = readData (messageHeader, sizeof (messageHeader)); if (bytes == sizeof (messageHeader) && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) { auto bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); if (bytesInMessage > 0) { MemoryBlock messageData ((size_t) bytesInMessage, true); int bytesRead = 0; while (bytesInMessage > 0) { if (thread->threadShouldExit()) return false; auto numThisTime = jmin (bytesInMessage, 65536); auto bytesIn = readData (addBytesToPointer (messageData.getData(), bytesRead), numThisTime); if (bytesIn <= 0) break; bytesRead += bytesIn; bytesInMessage -= bytesIn; } if (bytesRead >= 0) deliverDataInt (messageData); } return true; } if (bytes < 0) { if (socket != nullptr) deletePipeAndSocket(); connectionLostInt(); } return false; }
void InterprocessConnection::disconnect() { if (socket != nullptr) socket->close(); if (pipe != nullptr) pipe->close(); stopThread (4000); { const ScopedLock sl (pipeAndSocketLock); socket = nullptr; pipe = nullptr; } connectionLostInt(); }