summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/tanya/async/event/epoll.d2
-rw-r--r--source/tanya/async/event/iocp.d8
-rw-r--r--source/tanya/async/event/kqueue.d2
-rw-r--r--source/tanya/async/event/selector.d10
-rw-r--r--source/tanya/async/loop.d15
-rw-r--r--source/tanya/async/watcher.d11
-rw-r--r--source/tanya/container/list.d18
-rw-r--r--source/tanya/container/queue.d1
8 files changed, 39 insertions, 28 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/list.d b/source/tanya/container/list.d
index 4b717ed..4c99906 100644
--- a/source/tanya/container/list.d
+++ b/source/tanya/container/list.d
@@ -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.
*/
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;