1'use strict';
2// Flags: --expose-gc
3// just a simple http server and client.
4
5const common = require('../common');
6const onGC = require('../common/ongc');
7
8const cpus = require('os').availableParallelism();
9
10function serverHandler(req, res) {
11  res.writeHead(200, { 'Content-Type': 'text/plain' });
12  res.end('Hello World\n');
13}
14
15const http = require('http');
16const numRequests = 36;
17let createClients = true;
18let done = 0;
19let count = 0;
20let countGC = 0;
21
22const server = http.createServer(serverHandler);
23server.listen(0, common.mustCall(() => {
24  for (let i = 0; i < cpus; i++)
25    getAll(numRequests);
26}));
27
28function getAll(requestsRemaining) {
29  if (!createClients)
30    return;
31
32  if (requestsRemaining <= 0)
33    return;
34
35  const req = http.get({
36    hostname: 'localhost',
37    pathname: '/',
38    port: server.address().port
39  }, cb);
40
41  count++;
42  onGC(req, { ongc });
43
44  setImmediate(getAll, requestsRemaining - 1);
45}
46
47function cb(res) {
48  res.resume();
49  done += 1;
50}
51
52function ongc() {
53  countGC++;
54}
55
56setImmediate(status);
57
58function status() {
59  if (done > 0) {
60    createClients = false;
61    global.gc();
62    console.log(`done/collected/total: ${done}/${countGC}/${count}`);
63    if (countGC === count) {
64      server.close();
65    } else {
66      setImmediate(status);
67    }
68  } else {
69    setImmediate(status);
70  }
71}
72