#include <atomic>
#include <chrono>
#include <csignal>
#include <cstdlib>
#include <iostream>
#include <string>
#include <thread>
#include <unistd.h>
#define NOINLINE __attribute__((noinline))
static std::atomic<bool> running{true};
void onSignal(int) {
running = false;
}
NOINLINE void saveToStorage(int requestId) {
volatile int checksum = 0;
for (int i = 0; i < 200000; ++i) {
checksum += (requestId + i) % 17;
}
std::this_thread::sleep_for(std::chrono::milliseconds(80));
}
NOINLINE void buildResponse(int requestId) {
volatile int responseSize = requestId * 10;
responseSize += 42;
saveToStorage(requestId);
}
NOINLINE void calculateStatistics(int requestId) {
volatile double value = 0.0;
for (int i = 1; i < 100000; ++i) {
value += static_cast<double>(requestId + i) / i;
}
buildResponse(requestId);
}
NOINLINE void validateRequest(int requestId) {
volatile bool valid = requestId >= 0;
if (valid) {
calculateStatistics(requestId);
}
}
NOINLINE void parseRequest(int requestId) {
std::string raw = "request_" + std::to_string(requestId);
volatile char firstChar = raw[0];
(void)firstChar;
validateRequest(requestId);
}
NOINLINE void handleClient(int requestId) {
parseRequest(requestId);
}
NOINLINE void acceptConnection(int requestId) {
std::this_thread::sleep_for(std::chrono::milliseconds(50));
handleClient(requestId);
}
NOINLINE void serverLoop() {
int requestId = 1;
while (running) {
acceptConnection(requestId++);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
NOINLINE void backgroundLogger() {
while (running) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
int main() {
std::signal(SIGINT, onSignal);
std::signal(SIGTERM, onSignal);
std::cout << "Target program started." << std::endl;
std::cout << "PID: " << getpid() << std::endl;
std::cout << "Use this PID in sys_proc_callgraph." << std::endl;
std::cout << "Press Ctrl+C to stop." << std::endl;
std::thread logger(backgroundLogger);
serverLoop();
logger.join();
std::cout << "Target program stopped." << std::endl;
return 0;
}