void WindowsPipeSender::GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack) { if (m_resultPending) container.AddHandle(m_event, CallStack("WindowsPipeSender::GetWaitObjects() - result pending", &callStack)); else container.SetNoWait(CallStack("WindowsPipeSender::GetWaitObjects() - result ready", &callStack)); }
void SocketReceiver::GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack) { if (m_resultPending) container.AddHandle(m_event, CallStack("SocketReceiver::GetWaitObjects() - result pending", &callStack)); else if (!m_eofReceived) container.SetNoWait(CallStack("SocketReceiver::GetWaitObjects() - result ready", &callStack)); }
lword NonblockingSink::TimedFlush(unsigned long maxTime, size_t targetSize) { m_blockedBySpeedLimit = false; size_t curBufSize = GetCurrentBufferSize(); if (curBufSize <= targetSize && (targetSize || !EofPending())) return 0; if (!GetMaxBytesPerSecond()) return DoFlush(maxTime, targetSize); bool forever = (maxTime == INFINITE_TIME); unsigned long timeToGo = maxTime; Timer timer(Timer::MILLISECONDS, forever); lword totalFlushed = 0; timer.StartTimer(); while (true) { size_t flushSize = UnsignedMin(curBufSize - targetSize, ComputeCurrentTransceiveLimit()); if (flushSize || EofPending()) { if (!forever) timeToGo = SaturatingSubtract(maxTime, timer.ElapsedTime()); size_t ret = (size_t)DoFlush(timeToGo, curBufSize - flushSize); if (ret) { NoteTransceive(ret); curBufSize -= ret; totalFlushed += ret; } } if (curBufSize <= targetSize && (targetSize || !EofPending())) break; if (!forever) { timeToGo = SaturatingSubtract(maxTime, timer.ElapsedTime()); if (!timeToGo) break; } double waitTime = TimeToNextTransceive(); if (!forever && waitTime > timeToGo) { m_blockedBySpeedLimit = true; break; } WaitObjectContainer container; LimitedBandwidth::GetWaitObjects(container, CallStack("NonblockingSink::TimedFlush() - speed limit", 0)); container.Wait((unsigned long)waitTime); } return totalFlushed; }
void NetworkSource::GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack) { if (BlockedBySpeedLimit()) LimitedBandwidth::GetWaitObjects(container, CallStack("NetworkSource::GetWaitObjects() - speed limit", &callStack)); else if (!m_outputBlocked) { if (m_dataBegin == m_dataEnd) AccessReceiver().GetWaitObjects(container, CallStack("NetworkSource::GetWaitObjects() - no data", &callStack)); else container.SetNoWait(CallStack("NetworkSource::GetWaitObjects() - have data", &callStack)); } AttachedTransformation()->GetWaitObjects(container, CallStack("NetworkSource::GetWaitObjects() - attachment", &callStack)); }
bool Waitable::Wait(unsigned long milliseconds) { WaitObjectContainer container; GetWaitObjects(container); return container.Wait(milliseconds); }
size_t NonblockingSource::GeneralPump2( lword& byteCount, bool blockingOutput, unsigned long maxTime, bool checkDelimiter, byte delimiter) { m_blockedBySpeedLimit = false; if (!GetMaxBytesPerSecond()) { size_t ret = DoPump(byteCount, blockingOutput, maxTime, checkDelimiter, delimiter); m_doPumpBlocked = (ret != 0); return ret; } bool forever = (maxTime == INFINITE_TIME); unsigned long timeToGo = maxTime; Timer timer(Timer::MILLISECONDS, forever); lword maxSize = byteCount; byteCount = 0; timer.StartTimer(); while (true) { lword curMaxSize = UnsignedMin(ComputeCurrentTransceiveLimit(), maxSize - byteCount); if (curMaxSize || m_doPumpBlocked) { if (!forever) timeToGo = SaturatingSubtract(maxTime, timer.ElapsedTime()); size_t ret = DoPump(curMaxSize, blockingOutput, timeToGo, checkDelimiter, delimiter); m_doPumpBlocked = (ret != 0); if (curMaxSize) { NoteTransceive(curMaxSize); byteCount += curMaxSize; } if (ret) return ret; } if (maxSize != ULONG_MAX && byteCount >= maxSize) break; if (!forever) { timeToGo = SaturatingSubtract(maxTime, timer.ElapsedTime()); if (!timeToGo) break; } double waitTime = TimeToNextTransceive(); if (!forever && waitTime > timeToGo) { m_blockedBySpeedLimit = true; break; } WaitObjectContainer container; LimitedBandwidth::GetWaitObjects(container, CallStack("NonblockingSource::GeneralPump2() - speed limit", 0)); container.Wait((unsigned long)waitTime); } return 0; }
void LimitedBandwidth::GetWaitObjects(WaitObjectContainer &container, const CallStack &callStack) { double nextTransceiveTime = TimeToNextTransceive(); if (nextTransceiveTime) container.ScheduleEvent(nextTransceiveTime, CallStack("LimitedBandwidth::GetWaitObjects()", &callStack)); }
void SocketSender::GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack) { container.AddWriteFd(m_s, CallStack("SocketSender::GetWaitObjects()", &callStack)); }
void SocketReceiver::GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack) { if (!m_eofReceived) container.AddReadFd(m_s, CallStack("SocketReceiver::GetWaitObjects()", &callStack)); }
bool Waitable::Wait(unsigned long milliseconds, CallStack const& callStack) { WaitObjectContainer container; GetWaitObjects(container, callStack); // reduce clutter by not adding this func to stack return container.Wait(milliseconds); }
void ForwardTcpPort(const char *sourcePortName, const char *destinationHost, const char *destinationPortName) { #ifdef SOCKETS_AVAILABLE SocketsInitializer sockInit; Socket sockListen, sockSource, sockDestination; int sourcePort = Socket::PortNameToNumber(sourcePortName); int destinationPort = Socket::PortNameToNumber(destinationPortName); sockListen.Create(); sockListen.Bind(sourcePort); cout << "Listing on port " << sourcePort << ".\n"; sockListen.Listen(); sockListen.Accept(sockSource); cout << "Connection accepted on port " << sourcePort << ".\n"; sockListen.CloseSocket(); cout << "Making connection to " << destinationHost << ", port " << destinationPort << ".\n"; sockDestination.Create(); sockDestination.Connect(destinationHost, destinationPort); cout << "Connection made to " << destinationHost << ", starting to forward.\n"; SocketSource out(sockSource, false, new SocketSink(sockDestination)); SocketSource in(sockDestination, false, new SocketSink(sockSource)); WaitObjectContainer waitObjects; while (!(in.SourceExhausted() && out.SourceExhausted())) { waitObjects.Clear(); out.GetWaitObjects(waitObjects); in.GetWaitObjects(waitObjects); waitObjects.Wait(INFINITE_TIME); if (!out.SourceExhausted()) { cout << "o" << flush; out.PumpAll2(false); if (out.SourceExhausted()) cout << "EOF received on source socket.\n"; } if (!in.SourceExhausted()) { cout << "i" << flush; in.PumpAll2(false); if (in.SourceExhausted()) cout << "EOF received on destination socket.\n"; } } #else cout << "Socket support was not enabled at compile time.\n"; exit(-1); #endif }