PolicyDecision
- Added new enum type Queue - Switched to using `DList` which maintains a head AND (most importantly) a TAIL which we can therefore reach in O(1) time obviously - This above is useful for the `PolicyDecision` of `DROP_TAIL` - The `enqueue(Message)` method now respects the result of `policyCheck()` - Implemented `policyCheck()`
This commit is contained in:
parent
62c35787e3
commit
0e479307a2
|
@ -1,7 +1,7 @@
|
||||||
module renaissance.server.messagemanager;
|
module renaissance.server.messagemanager;
|
||||||
|
|
||||||
import renaissance.server.server : Server;
|
import renaissance.server.server : Server;
|
||||||
import std.container.slist : SList;
|
import std.container.dlist : DList;
|
||||||
import core.sync.mutex : Mutex;
|
import core.sync.mutex : Mutex;
|
||||||
import renaissance.logging;
|
import renaissance.logging;
|
||||||
|
|
||||||
|
@ -36,10 +36,18 @@ public struct Message
|
||||||
|
|
||||||
public enum QUEUE_DEFAULT_SIZE = 100;
|
public enum QUEUE_DEFAULT_SIZE = 100;
|
||||||
|
|
||||||
|
public enum PolicyDecision
|
||||||
|
{
|
||||||
|
DROP_INCOMING,
|
||||||
|
DROP_TAIL,
|
||||||
|
ACCEPT
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Templatize in the future on the T element type
|
||||||
public class Queue
|
public class Queue
|
||||||
{
|
{
|
||||||
private size_t maxSize;
|
private size_t maxSize;
|
||||||
private SList!(Message) queue;
|
private DList!(Message) queue;
|
||||||
private Mutex lock;
|
private Mutex lock;
|
||||||
|
|
||||||
public this(size_t maxSize = QUEUE_DEFAULT_SIZE)
|
public this(size_t maxSize = QUEUE_DEFAULT_SIZE)
|
||||||
|
@ -59,9 +67,36 @@ public class Queue
|
||||||
this.lock.unlock();
|
this.lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply queuing policy
|
||||||
|
PolicyDecision decision = policyCheck();
|
||||||
|
|
||||||
|
// If we should tail-drop
|
||||||
|
if(decision == PolicyDecision.DROP_TAIL)
|
||||||
|
{
|
||||||
|
// Drop tail
|
||||||
|
this.queue.removeBack();
|
||||||
|
}
|
||||||
|
// If we should drop the incoming
|
||||||
|
else if(decision == PolicyDecision.DROP_INCOMING)
|
||||||
|
{
|
||||||
|
// Do not insert
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Accept
|
||||||
|
else if(decision == PolicyDecision.ACCEPT)
|
||||||
|
{
|
||||||
|
// Fall through
|
||||||
|
}
|
||||||
|
|
||||||
// Enqueue
|
// Enqueue
|
||||||
this.queue.insertAfter(this.queue[], message);
|
this.queue.insertAfter(this.queue[], message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PolicyDecision policyCheck()
|
||||||
|
{
|
||||||
|
// TODO: Implement me
|
||||||
|
return PolicyDecision.ACCEPT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue