#pragma once
#include <trantor/net/EventLoopThread.h>
#include <trantor/utils/NonCopyable.h>
#include <unordered_map>
#include <vector>
#include <sys/stat.h>
namespace drogon
{
class SharedLibManager : public trantor::NonCopyable
{
  public:
    SharedLibManager(const std::vector<std::string> &libPaths,
                     const std::string &outputPath);
    ~SharedLibManager();
  private:
    void managerLibs();
    std::vector<std::string> libPaths_;
    std::string outputPath_;
    struct DLStat
    {
        void *handle{nullptr};
        struct timespec mTime = {0, 0};
    };
    std::unordered_map<std::string, DLStat> dlMap_;
    void *compileAndLoadLib(const std::string &sourceFile, void *oldHld);
    void *loadLib(const std::string &soFile, void *oldHld);
    bool shouldCompileLib(const std::string &soFile,
                          const struct stat &sourceStat);
    trantor::TimerId timeId_;
    trantor::EventLoopThread workingThread_;
};
}  