mirror of
https://github.com/deavmi/tristanable.git
synced 2024-09-21 13:42:56 +02:00
77 lines
1.6 KiB
D
77 lines
1.6 KiB
D
module tristanable.garbage;
|
|
|
|
import tristanable.manager : Manager;
|
|
import tristanable.request : Request;
|
|
import std.socket : Socket;
|
|
import core.thread : Thread, Duration, dur;
|
|
import bmessage : receiveMessage;
|
|
|
|
public final class GarbageCollector : Thread
|
|
{
|
|
|
|
/**
|
|
* The associated manager
|
|
*/
|
|
private Manager manager;
|
|
|
|
/**
|
|
* The queue variable pointer
|
|
*/
|
|
private Request[]* requestQueueVariable;
|
|
|
|
/**
|
|
* Whether or not the watcher is active
|
|
*/
|
|
private bool isActive;
|
|
|
|
this(Manager manager)
|
|
{
|
|
/* Set the worker function */
|
|
super(&cleaner);
|
|
|
|
/* Set the manager */
|
|
this.manager = manager;
|
|
|
|
/* Set the pointer */
|
|
requestQueueVariable = cast(Request[]*)manager.getQueueVariable();
|
|
|
|
isActive = true;
|
|
}
|
|
|
|
public void stopGC()
|
|
{
|
|
isActive = false;
|
|
}
|
|
|
|
/* TODO: Add timeout ability */
|
|
private void cleaner()
|
|
{
|
|
while(isActive)
|
|
{
|
|
/* Lock the queue */
|
|
manager.lockQueue();
|
|
|
|
/* Construct a new list */
|
|
Request[] newList;
|
|
|
|
/* Only add to this list undead requests */
|
|
foreach(Request request; *requestQueueVariable)
|
|
{
|
|
if(!request.isDead)
|
|
{
|
|
newList ~= request;
|
|
}
|
|
}
|
|
|
|
/* Update the queue to the new queue */
|
|
*requestQueueVariable = newList;
|
|
|
|
/* Unlock the queue */
|
|
manager.unlockQueue();
|
|
|
|
/* Sleep for 60 seconds after cleaning up */
|
|
sleep(dur!("seconds")(60));
|
|
|
|
}
|
|
}
|
|
} |