xref: /aosp_15_r20/external/sandboxed-api/sandboxed_api/sandbox2/testcases/starve.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1*ec63e07aSXin Li // Copyright 2019 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li //     https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li 
15*ec63e07aSXin Li #include <sched.h>
16*ec63e07aSXin Li #include <unistd.h>
17*ec63e07aSXin Li 
18*ec63e07aSXin Li #include <csignal>
19*ec63e07aSXin Li #include <cstdint>
20*ec63e07aSXin Li 
21*ec63e07aSXin Li constexpr int kProcesses = 512;
22*ec63e07aSXin Li constexpr int kThreads = 1;
23*ec63e07aSXin Li constexpr int kSenders = 1;
24*ec63e07aSXin Li constexpr int kStackSize = 4096;
25*ec63e07aSXin Li 
26*ec63e07aSXin Li pid_t g_pids[kProcesses];
27*ec63e07aSXin Li 
28*ec63e07aSXin Li uint8_t g_stacks[kThreads][kStackSize] __attribute__((aligned(4096)));
29*ec63e07aSXin Li constexpr int kSignals[] = {
30*ec63e07aSXin Li     SIGPROF,
31*ec63e07aSXin Li };
32*ec63e07aSXin Li 
SignalHandler(int)33*ec63e07aSXin Li void SignalHandler(int) {}
34*ec63e07aSXin Li 
ChildFunc(void *)35*ec63e07aSXin Li int ChildFunc(void*) {
36*ec63e07aSXin Li   for (;;) {
37*ec63e07aSXin Li     sleep(10);
38*ec63e07aSXin Li   }
39*ec63e07aSXin Li }
40*ec63e07aSXin Li 
main()41*ec63e07aSXin Li int main() {
42*ec63e07aSXin Li   for (int i = 0; i < kProcesses; ++i) {
43*ec63e07aSXin Li     int p[2] = {0, 0};
44*ec63e07aSXin Li     char c = ' ';
45*ec63e07aSXin Li     pipe(p);
46*ec63e07aSXin Li     g_pids[i] = fork();
47*ec63e07aSXin Li     if (g_pids[i] == 0) {
48*ec63e07aSXin Li       for (int sig : kSignals) {
49*ec63e07aSXin Li         signal(sig, SignalHandler);
50*ec63e07aSXin Li       }
51*ec63e07aSXin Li       for (int j = 0; j < kThreads; ++j) {
52*ec63e07aSXin Li         int flags = CLONE_FILES | CLONE_FS | CLONE_IO | CLONE_PARENT |
53*ec63e07aSXin Li                     CLONE_SIGHAND | CLONE_THREAD | CLONE_VM;
54*ec63e07aSXin Li         clone(&ChildFunc, g_stacks[j + 1], flags, nullptr, nullptr, nullptr,
55*ec63e07aSXin Li               nullptr);
56*ec63e07aSXin Li       }
57*ec63e07aSXin Li       close(p[0]);
58*ec63e07aSXin Li       write(p[1], &c, 1);
59*ec63e07aSXin Li       close(p[1]);
60*ec63e07aSXin Li       for (;;) {
61*ec63e07aSXin Li         sleep(10);
62*ec63e07aSXin Li       }
63*ec63e07aSXin Li     }
64*ec63e07aSXin Li     read(p[0], &c, 1);
65*ec63e07aSXin Li   }
66*ec63e07aSXin Li   for (int i = 0; i < kSenders; ++i) {
67*ec63e07aSXin Li     if (fork() == 0) {
68*ec63e07aSXin Li       break;
69*ec63e07aSXin Li     }
70*ec63e07aSXin Li   }
71*ec63e07aSXin Li   for (;;) {
72*ec63e07aSXin Li     for (int sig : kSignals) {
73*ec63e07aSXin Li       for (int pid : g_pids) {
74*ec63e07aSXin Li         kill(pid, sig);
75*ec63e07aSXin Li       }
76*ec63e07aSXin Li     }
77*ec63e07aSXin Li   }
78*ec63e07aSXin Li }
79