Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/DeprecatedString.h>
8#include <AK/Optional.h>
9#include <LibCore/ElapsedTimer.h>
10#include <LibMain/Main.h>
11#include <unistd.h>
12
13static void usage()
14{
15 warnln("usage: allocate [number [unit (B/KiB/MiB)]]");
16 exit(1);
17}
18
19enum class Unit {
20 Bytes,
21 KiB,
22 MiB,
23};
24
25ErrorOr<int> serenity_main(Main::Arguments arguments)
26{
27 int count = 50;
28 auto unit = Unit::MiB;
29
30 if (arguments.argc >= 2) {
31 auto number = arguments.strings[1].to_uint();
32 if (!number.has_value()) {
33 usage();
34 }
35 count = number.value();
36 }
37
38 if (arguments.argc >= 3) {
39 if (arguments.strings[2] == "B")
40 unit = Unit::Bytes;
41 else if (arguments.strings[2] == "KiB")
42 unit = Unit::KiB;
43 else if (arguments.strings[2] == "MiB")
44 unit = Unit::MiB;
45 else
46 usage();
47 }
48
49 switch (unit) {
50 case Unit::Bytes:
51 break;
52 case Unit::KiB:
53 count *= KiB;
54 break;
55 case Unit::MiB:
56 count *= MiB;
57 break;
58 }
59
60 outln("allocating memory ({} bytes)...", count);
61 auto timer = Core::ElapsedTimer::start_new();
62 char* ptr = (char*)malloc(count);
63 if (!ptr) {
64 outln("failed.");
65 return 1;
66 }
67 outln("done in {}ms", timer.elapsed());
68
69 auto pages = count / PAGE_SIZE;
70 auto step = pages / 10;
71
72 outln("writing one byte to each page of allocated memory...");
73 timer.start();
74 auto timer2 = Core::ElapsedTimer::start_new();
75 for (int i = 0; i < pages; ++i) {
76 ptr[i * PAGE_SIZE] = 1;
77
78 if (i != 0 && (i % step) == 0) {
79 auto ms = timer2.elapsed();
80 if (ms == 0)
81 ms = 1;
82
83 auto bps = double(step * PAGE_SIZE) / (double(ms) / 1000);
84
85 outln("step took {}ms ({}MiB/s)", ms, bps / MiB);
86
87 timer2.start();
88 }
89 }
90 outln("done in {}ms", timer.elapsed());
91
92 outln("sleeping for ten seconds...");
93 for (int i = 0; i < 10; i++) {
94 outln("{}", i);
95 sleep(1);
96 }
97 outln("done.");
98
99 outln("freeing memory...");
100 timer.start();
101 free(ptr);
102 outln("done in {}ms", timer.elapsed());
103
104 return 0;
105}