commit
abfccc35a2
@ -162,7 +162,7 @@ final class EpollLoop : SelectorLoop
|
||||
}
|
||||
else if (transport.output.length)
|
||||
{
|
||||
pendings.enqueue(transport);
|
||||
pendings.insertBack(transport);
|
||||
}
|
||||
}
|
||||
if (events[i].events & EPOLLOUT)
|
||||
|
@ -273,7 +273,7 @@ final class IOCPLoop : Loop
|
||||
transport.socket.shutdown();
|
||||
defaultAllocator.dispose(transport.socket);
|
||||
transport.exception = exception;
|
||||
pendings.enqueue(transport);
|
||||
pendings.insertBack(transport);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -316,11 +316,11 @@ final class IOCPLoop : Loop
|
||||
auto socket = listener.endAccept(overlapped);
|
||||
auto transport = defaultAllocator.make!StreamTransport(socket);
|
||||
|
||||
connection.incoming.enqueue(transport);
|
||||
connection.incoming.insertBack(transport);
|
||||
|
||||
reify(transport, EventMask(Event.none), EventMask(Event.read, Event.write));
|
||||
|
||||
pendings.enqueue(connection);
|
||||
pendings.insertBack(connection);
|
||||
listener.beginAccept(overlapped);
|
||||
break;
|
||||
case OverlappedSocketEvent.read:
|
||||
@ -360,7 +360,7 @@ final class IOCPLoop : Loop
|
||||
{
|
||||
transport.socket.beginReceive(transport.output[], overlapped);
|
||||
}
|
||||
pendings.enqueue(transport);
|
||||
pendings.insertBack(transport);
|
||||
}
|
||||
break;
|
||||
case OverlappedSocketEvent.write:
|
||||
|
@ -279,7 +279,7 @@ final class KqueueLoop : SelectorLoop
|
||||
}
|
||||
else if (transport.output.length)
|
||||
{
|
||||
pendings.enqueue(transport);
|
||||
pendings.insertBack(transport);
|
||||
}
|
||||
}
|
||||
else if (events[i].filter == EVFILT_WRITE)
|
||||
|
@ -218,12 +218,12 @@ abstract class SelectorLoop : Loop
|
||||
this() @nogc
|
||||
{
|
||||
super();
|
||||
connections = Array!SocketWatcher(maxEvents);
|
||||
this.connections = Array!SocketWatcher(maxEvents);
|
||||
}
|
||||
|
||||
~this() @nogc
|
||||
{
|
||||
foreach (ref connection; connections)
|
||||
foreach (ref connection; this.connections[])
|
||||
{
|
||||
// We want to free only the transports. ConnectionWatcher are
|
||||
// created by the user and should be freed by himself.
|
||||
@ -266,7 +266,7 @@ abstract class SelectorLoop : Loop
|
||||
transport.socket.shutdown();
|
||||
defaultAllocator.dispose(transport.socket);
|
||||
transport.exception = exception;
|
||||
pendings.enqueue(transport);
|
||||
pendings.insertBack(transport);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -394,12 +394,12 @@ abstract class SelectorLoop : Loop
|
||||
}
|
||||
|
||||
reify(transport, EventMask(Event.none), EventMask(Event.read, Event.write));
|
||||
connection.incoming.enqueue(transport);
|
||||
connection.incoming.insertBack(transport);
|
||||
}
|
||||
|
||||
if (!connection.incoming.empty)
|
||||
{
|
||||
pendings.enqueue(connection);
|
||||
pendings.insertBack(connection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ import std.typecons;
|
||||
import tanya.async.transport;
|
||||
import tanya.async.watcher;
|
||||
import tanya.container.buffer;
|
||||
import tanya.container.queue;
|
||||
import tanya.container.list;
|
||||
import tanya.memory;
|
||||
import tanya.network.socket;
|
||||
|
||||
@ -163,7 +163,7 @@ abstract class Loop
|
||||
private bool done = true;
|
||||
|
||||
/// Pending watchers.
|
||||
protected Queue!Watcher pendings;
|
||||
protected DList!Watcher pendings;
|
||||
|
||||
/**
|
||||
* Returns: Maximal event count can be got at a time
|
||||
@ -188,7 +188,6 @@ abstract class Loop
|
||||
*/
|
||||
this() @nogc
|
||||
{
|
||||
pendings = Queue!Watcher();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -196,9 +195,9 @@ abstract class Loop
|
||||
*/
|
||||
~this() @nogc
|
||||
{
|
||||
foreach (w; pendings)
|
||||
for (; !this.pendings.empty; this.pendings.removeFront())
|
||||
{
|
||||
defaultAllocator.dispose(w);
|
||||
defaultAllocator.dispose(this.pendings.front);
|
||||
}
|
||||
}
|
||||
|
||||
@ -213,9 +212,9 @@ abstract class Loop
|
||||
poll();
|
||||
|
||||
// Invoke pendings
|
||||
foreach (ref w; this.pendings)
|
||||
for (; !this.pendings.empty; this.pendings.removeFront())
|
||||
{
|
||||
w.invoke();
|
||||
this.pendings.front.invoke();
|
||||
}
|
||||
}
|
||||
while (!this.done);
|
||||
@ -244,7 +243,7 @@ abstract class Loop
|
||||
{
|
||||
auto loop = defaultAllocator.make!TestLoop;
|
||||
auto watcher = defaultAllocator.make!DummyWatcher;
|
||||
loop.pendings.enqueue(watcher);
|
||||
loop.pendings.insertBack(watcher);
|
||||
|
||||
assert(!watcher.invoked);
|
||||
loop.run();
|
||||
|
@ -20,7 +20,7 @@ import tanya.async.loop;
|
||||
import tanya.async.protocol;
|
||||
import tanya.async.transport;
|
||||
import tanya.container.buffer;
|
||||
import tanya.container.queue;
|
||||
import tanya.container.list;
|
||||
import tanya.memory;
|
||||
import tanya.network.socket;
|
||||
|
||||
@ -91,7 +91,7 @@ abstract class SocketWatcher : Watcher
|
||||
class ConnectionWatcher : SocketWatcher
|
||||
{
|
||||
/// Incoming connection queue.
|
||||
Queue!DuplexTransport incoming;
|
||||
DList!DuplexTransport incoming;
|
||||
|
||||
private Protocol delegate() @nogc protocolFactory;
|
||||
|
||||
@ -102,7 +102,6 @@ class ConnectionWatcher : SocketWatcher
|
||||
this(Socket socket) @nogc
|
||||
{
|
||||
super(socket);
|
||||
incoming = Queue!DuplexTransport();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -124,10 +123,10 @@ class ConnectionWatcher : SocketWatcher
|
||||
}
|
||||
do
|
||||
{
|
||||
foreach (transport; incoming)
|
||||
for (; !this.incoming.empty; this.incoming.removeFront())
|
||||
{
|
||||
transport.protocol = protocolFactory();
|
||||
transport.protocol.connected(transport);
|
||||
this.incoming.front.protocol = protocolFactory();
|
||||
this.incoming.front.protocol.connected(this.incoming.front);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,9 +3,10 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/**
|
||||
* Linked list.
|
||||
* This module contains singly-linked ($(D_PSYMBOL SList)) and doubly-linked
|
||||
* ($(D_PSYMBOL DList)) lists.
|
||||
*
|
||||
* Copyright: Eugene Wissner 2016-2017.
|
||||
* Copyright: Eugene Wissner 2016-2018.
|
||||
* License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
|
||||
* Mozilla Public License, v. 2.0).
|
||||
* Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
|
||||
@ -924,7 +925,7 @@ struct SList(T)
|
||||
}
|
||||
|
||||
/**
|
||||
* Forward range for the $(D_PSYMBOL DList).
|
||||
* Bidirectional range for the $(D_PSYMBOL DList).
|
||||
*
|
||||
* Params:
|
||||
* L = List type.
|
||||
@ -1014,6 +1015,17 @@ struct DRange(L)
|
||||
/**
|
||||
* Doubly-linked list.
|
||||
*
|
||||
* $(D_PSYMBOL DList) can be also used as a queue. Elements can be enqueued
|
||||
* with $(D_PSYMBOL DList.insertBack). To process the queue a `for`-loop comes
|
||||
* in handy:
|
||||
*
|
||||
* ---
|
||||
* for (; !dlist.empty; dlist.removeFront())
|
||||
* {
|
||||
* do_something_with(dlist.front);
|
||||
* }
|
||||
* ---
|
||||
*
|
||||
* Params:
|
||||
* T = Content type.
|
||||
*/
|
||||
|
@ -12,6 +12,7 @@
|
||||
* Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/container/queue.d,
|
||||
* tanya/container/queue.d)
|
||||
*/
|
||||
deprecated("Use tanya.container.list.DList instead")
|
||||
module tanya.container.queue;
|
||||
|
||||
import tanya.algorithm.mutation;
|
||||
|
Loading…
Reference in New Issue
Block a user