You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.1 KiB
C++
93 lines
2.1 KiB
C++
//
|
|
// Created by anton on 6/24/22.
|
|
//
|
|
|
|
#ifndef PMP_GLOBAL_THREAD_POOL_H
|
|
#define PMP_GLOBAL_THREAD_POOL_H
|
|
|
|
#include <iostream>
|
|
#include <cassert>
|
|
#include <functional>
|
|
#include <unordered_map>
|
|
#include <stack>
|
|
#include <queue>
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <thread>
|
|
#include <mutex>
|
|
#include <chrono>
|
|
#include <atomic>
|
|
#include <random>
|
|
#include <sodium.h>
|
|
#include <unordered_set>
|
|
#include <map>
|
|
#include <optional>
|
|
#include <boost/lockfree/stack.hpp>
|
|
|
|
#include "call_frame.h"
|
|
#include "helpers.h"
|
|
|
|
namespace pmp::core {
|
|
|
|
class global_thread_pool {
|
|
|
|
private:
|
|
|
|
call_frame* m_root_frame;
|
|
|
|
// frame creation / lookup stuff
|
|
std::atomic<frame_id_t> m_last_id;
|
|
std::unordered_map<int, call_frame*> m_frames;
|
|
std::mutex m_frames_lock;
|
|
|
|
|
|
// thread stuff
|
|
std::atomic<bool> m_active;
|
|
const size_t m_thread_count;
|
|
std::vector<std::thread> m_threads;
|
|
|
|
boost::lockfree::stack<std::shared_ptr<call_frame>> stack;
|
|
|
|
void worker();
|
|
|
|
public:
|
|
explicit global_thread_pool(call_frame* root_frame) : m_root_frame(root_frame), m_last_id(0), m_frames(),
|
|
m_frames_lock(), m_active(true), m_thread_count(std::thread::hardware_concurrency()),
|
|
stack(100)
|
|
{
|
|
std::cout << "Init GlobalThreadPool" << std::endl;
|
|
|
|
m_threads = std::vector<std::thread>(m_thread_count);
|
|
|
|
for (size_t i = 0; i < m_thread_count; i++) {
|
|
m_threads[i] = std::thread([&] {
|
|
worker();
|
|
});
|
|
}
|
|
}
|
|
|
|
~global_thread_pool() {
|
|
if (m_active) {
|
|
std::cout << "GlobalThreadPool destructor called before join!" << std::endl;
|
|
join();
|
|
}
|
|
|
|
assert(!m_active);
|
|
}
|
|
|
|
frame_id_t insert_frame(void *argument, void *scope, call_frame_target *target_function, frame_id_t parent);
|
|
|
|
void stop() { m_active = false; }
|
|
|
|
void join();
|
|
|
|
size_t thread_count() const { return m_thread_count; }
|
|
size_t thread_count() { return m_thread_count; }
|
|
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif //PMP_GLOBAL_THREAD_POOL_H
|