Загрузка данных


#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;
}