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(); 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(); 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 = { value: T, next: Node }; + +export default class Queue { + private top: Node = null; + private rear: Node = null; + public length: number = 0; + + public push(value: T): void { + const node: Node = { 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(this.length); + for (let node = this.top, i = 0; node !== null; node = node.next, i++) { + arr[i] = node.value; + } + return arr; + } +}