From f443d36dbb6e819626d3feac59d3afd570f0e52f Mon Sep 17 00:00:00 2001
From: Aya Morisawa <AyaMorisawa4869@gmail.com>
Date: Tue, 14 Aug 2018 07:49:59 +0900
Subject: [PATCH] Resolve #2176

---
 src/daemons/notes-stats.ts  |  7 ++++---
 src/daemons/server-stats.ts |  7 ++++---
 src/misc/queue.ts           | 33 +++++++++++++++++++++++++++++++++
 3 files changed, 41 insertions(+), 6 deletions(-)
 create mode 100644 src/misc/queue.ts

diff --git a/src/daemons/notes-stats.ts b/src/daemons/notes-stats.ts
index 136ccb60c..3bc0269dd 100644
--- a/src/daemons/notes-stats.ts
+++ b/src/daemons/notes-stats.ts
@@ -1,21 +1,22 @@
 import * as childProcess from 'child_process';
 import Xev from 'xev';
+import Queue from '../misc/queue';
 
 const ev = new Xev();
 
 export default function() {
-	const log: any[] = [];
+	const log = new Queue<any>();
 
 	const p = childProcess.fork(__dirname + '/notes-stats-child.js');
 
 	p.on('message', stats => {
 		ev.emit('notesStats', stats);
 		log.push(stats);
-		if (log.length > 100) log.shift();
+		if (log.length > 100) log.pop();
 	});
 
 	ev.on('requestNotesStatsLog', id => {
-		ev.emit('notesStatsLog:' + id, log);
+		ev.emit('notesStatsLog:' + id, log.toArray());
 	});
 
 	process.on('exit', code => {
diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts
index 0c0a72f74..b435c12e5 100644
--- a/src/daemons/server-stats.ts
+++ b/src/daemons/server-stats.ts
@@ -2,6 +2,7 @@ import * as os from 'os';
 import * as sysUtils from 'systeminformation';
 import * as diskusage from 'diskusage';
 import Xev from 'xev';
+import Queue from '../misc/queue';
 const osUtils = require('os-utils');
 
 const ev = new Xev();
@@ -12,10 +13,10 @@ const interval = 1000;
  * Report server stats regularly
  */
 export default function() {
-	const log: any[] = [];
+	const log = new Queue<any>();
 
 	ev.on('requestServerStatsLog', id => {
-		ev.emit('serverStatsLog:' + id, log);
+		ev.emit('serverStatsLog:' + id, log.toArray());
 	});
 
 	async function tick() {
@@ -36,7 +37,7 @@ export default function() {
 		};
 		ev.emit('serverStats', stats);
 		log.push(stats);
-		if (log.length > 50) log.shift();
+		if (log.length > 50) log.pop();
 	}
 
 	tick();
diff --git a/src/misc/queue.ts b/src/misc/queue.ts
new file mode 100644
index 000000000..410878ba8
--- /dev/null
+++ b/src/misc/queue.ts
@@ -0,0 +1,33 @@
+type Node<T> = { value: T, next: Node<T> };
+
+export default class Queue<T> {
+	private top: Node<T> = null;
+	private rear: Node<T> = null;
+	public length: number = 0;
+
+	public push(value: T): void {
+		const node: Node<T> = { value, next: null };
+		if (this.top === null) {
+			this.top = node;
+			this.rear = node;
+		} else {
+			this.rear.next = node;
+			this.rear = node;
+		}
+		this.length++;
+	}
+
+	public pop(): void {
+		this.top = this.top.next;
+		if (this.top == null) this.rear = null;
+		this.length--;
+	}
+
+	public toArray(): T[] {
+		const arr: T[] = Array<T>(this.length);
+		for (let node = this.top, i = 0; node !== null; node = node.next, i++) {
+			arr[i] = node.value;
+		}
+		return arr;
+	}
+}