Add TCPConnection.waitForDataEx.
Allows to distinguish between timeout and no more data cases.
This commit is contained in:
parent
54208ba46f
commit
5393109669
|
@ -568,10 +568,15 @@ struct TCPConnection {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool waitForData(Duration timeout = Duration.max)
|
bool waitForData(Duration timeout = Duration.max)
|
||||||
|
{
|
||||||
|
return waitForDataEx(timeout) == WaitForDataStatus.dataAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
WaitForDataStatus waitForDataEx(Duration timeout = Duration.max)
|
||||||
{
|
{
|
||||||
mixin(tracer);
|
mixin(tracer);
|
||||||
if (!m_context) return false;
|
if (!m_context) return WaitForDataStatus.noMoreData;
|
||||||
if (m_context.readBuffer.length > 0) return true;
|
if (m_context.readBuffer.length > 0) return WaitForDataStatus.dataAvailable;
|
||||||
auto mode = timeout <= 0.seconds ? IOMode.immediate : IOMode.once;
|
auto mode = timeout <= 0.seconds ? IOMode.immediate : IOMode.once;
|
||||||
|
|
||||||
bool cancelled;
|
bool cancelled;
|
||||||
|
@ -592,7 +597,8 @@ mixin(tracer);
|
||||||
|
|
||||||
asyncAwaitAny!(true, waiter)(timeout);
|
asyncAwaitAny!(true, waiter)(timeout);
|
||||||
|
|
||||||
if (cancelled || !m_context) return false;
|
if (!m_context) return WaitForDataStatus.noMoreData;
|
||||||
|
if (cancelled) return WaitForDataStatus.timeout;
|
||||||
|
|
||||||
logTrace("Socket %s, read %s bytes: %s", m_socket, nbytes, status);
|
logTrace("Socket %s, read %s bytes: %s", m_socket, nbytes, status);
|
||||||
|
|
||||||
|
@ -607,9 +613,10 @@ mixin(tracer);
|
||||||
case IOStatus.disconnected: break;
|
case IOStatus.disconnected: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_context.readBuffer.length > 0;
|
return m_context.readBuffer.length > 0 ? WaitForDataStatus.dataAvailable : WaitForDataStatus.noMoreData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Waits asynchronously for new data to arrive.
|
/** Waits asynchronously for new data to arrive.
|
||||||
|
|
||||||
This function can be used to detach the `TCPConnection` from a
|
This function can be used to detach the `TCPConnection` from a
|
||||||
|
@ -808,6 +815,12 @@ enum WaitForDataAsyncStatus {
|
||||||
waiting,
|
waiting,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum WaitForDataStatus {
|
||||||
|
dataAvailable,
|
||||||
|
noMoreData,
|
||||||
|
timeout
|
||||||
|
}
|
||||||
|
|
||||||
unittest { // test compilation of callback with scoped destruction
|
unittest { // test compilation of callback with scoped destruction
|
||||||
static struct CB {
|
static struct CB {
|
||||||
~this() {}
|
~this() {}
|
||||||
|
|
Loading…
Reference in a new issue