Program Listing for File thread.h

Return to documentation for file (rootex/os/thread.h)

#pragma once

#include "common/common.h"

#include <Windows.h>

class ThreadPool;

class Task
{
public:
    __int32 m_ID;
    __int32 m_Dependencies;
    Vector<__int32> m_Permissions;
    Function<void()> m_ExecutionTask;

    Task(const Function<void()>& executionTask);
    Task(const Task&) = default;
    ~Task() = default;

    void execute();
};

struct WorkerParameters
{
    __int32 m_Thread;
    ThreadPool* m_ThreadPool;
};

struct TaskQueue
{
    __int32 m_Jobs;
    unsigned __int32 m_Write;
    unsigned __int32 m_Read;
    Vector<Ref<Task>> m_QueueJobs;
};

struct TaskComplete
{
    __int32 m_Jobs;
    Vector<__int32> m_IDs;
};

struct TaskReady
{
    __int32 m_Jobs;
    unsigned __int32 m_Write;
    unsigned __int32 m_Read;
    Vector<__int32> m_IDs;
};

struct MasterThread
{
    TaskComplete m_TasksComplete;
    TaskReady m_TasksReady;
};

class ThreadPool
{
    bool m_IsRunning;
    __int32 m_Threads;
    Vector<WorkerParameters> m_WorkerParameters;
    WorkerParameters m_DefaultWorkerParameter;
    Vector<HANDLE> m_Handles;
    HANDLE m_DefaultHandle = 0;
    CONDITION_VARIABLE m_ConsumerVariable;
    CONDITION_VARIABLE m_ProducerVariable;
    CRITICAL_SECTION m_CriticalSection;

    __int32 m_TasksFinished;
    TaskQueue m_TaskQueue;
    TaskComplete m_TasksComplete;

    friend DWORD WINAPI MainLoop(LPVOID voidParameters);

    void initialize();
    void shutDown();

public:
    ThreadPool();
    ThreadPool(ThreadPool&) = delete;
    ~ThreadPool();

    void submit(Vector<Ref<Task>>& tasks);

    bool isCompleted() const;
    void join() const;
};