From 17cb592b13de89bcd120ea4e237d352cd573b709 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 9 Mar 2018 08:19:17 +0100 Subject: [PATCH] Replace Queue with DList --- source/tanya/async/event/epoll.d | 2 +- source/tanya/async/event/iocp.d | 8 ++++---- source/tanya/async/event/kqueue.d | 2 +- source/tanya/async/event/selector.d | 10 +++++----- source/tanya/async/loop.d | 15 +++++++-------- source/tanya/async/watcher.d | 11 +++++------ source/tanya/container/queue.d | 1 + 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/source/tanya/async/event/epoll.d b/source/tanya/async/event/epoll.d index ff2b564..ce2f15e 100644 --- a/source/tanya/async/event/epoll.d +++ b/source/tanya/async/event/epoll.d @@ -162,7 +162,7 @@ final class EpollLoop : SelectorLoop } else if (transport.output.length) { - pendings.enqueue(transport); + pendings.insertBack(transport); } } if (events[i].events & EPOLLOUT) diff --git a/source/tanya/async/event/iocp.d b/source/tanya/async/event/iocp.d index ef82cab..69a49d3 100644 --- a/source/tanya/async/event/iocp.d +++ b/source/tanya/async/event/iocp.d @@ -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: diff --git a/source/tanya/async/event/kqueue.d b/source/tanya/async/event/kqueue.d index 3a48fdd..a170a15 100644 --- a/source/tanya/async/event/kqueue.d +++ b/source/tanya/async/event/kqueue.d @@ -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) diff --git a/source/tanya/async/event/selector.d b/source/tanya/async/event/selector.d index f177607..e388263 100644 --- a/source/tanya/async/event/selector.d +++ b/source/tanya/async/event/selector.d @@ -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); } } } diff --git a/source/tanya/async/loop.d b/source/tanya/async/loop.d index f3b568f..5f78183 100644 --- a/source/tanya/async/loop.d +++ b/source/tanya/async/loop.d @@ -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(); diff --git a/source/tanya/async/watcher.d b/source/tanya/async/watcher.d index 7650eac..c9d58b3 100644 --- a/source/tanya/async/watcher.d +++ b/source/tanya/async/watcher.d @@ -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); } } } diff --git a/source/tanya/container/queue.d b/source/tanya/container/queue.d index f8b268a..7e0d95a 100644 --- a/source/tanya/container/queue.d +++ b/source/tanya/container/queue.d @@ -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;