diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2020-02-10 14:53:04 -0500 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2020-02-18 17:25:02 -0500 |
| commit | 3423b0a59337cf4cf99a24a1421ea33c4c641a22 (patch) | |
| tree | 3c0ff20c7fd7f74da1f16a8ac5410639e83ce2ed /src/envfs.h | |
| parent | 6ee4285588019c9842e221cd627f6627cf8ac2fa (diff) | |
threaded refresher
Diffstat (limited to 'src/envfs.h')
| -rw-r--r-- | src/envfs.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/envfs.h b/src/envfs.h index aeaa6796..1fc53bcf 100644 --- a/src/envfs.h +++ b/src/envfs.h @@ -1,17 +1,105 @@ #ifndef ENV_ENVFS_H #define ENV_ENVFS_H +#include <thread> + namespace env { +struct File +{ + std::wstring name; + FILETIME ft; +}; + +struct Directory +{ + std::wstring name; + std::list<Directory> dirs; + std::list<File> files; +}; + + +template <class T> +class ThreadPool +{ +public: + ThreadPool(std::size_t max=1) + : m_threads(max) + { + } + + ~ThreadPool() + { + join(); + } + + void setMax(std::size_t n) + { + m_threads.resize(n); + } + + void join() + { + for (auto& ti : m_threads) { + if (ti.thread.joinable()) { + ti.thread.join(); + } + } + } + + T& request() + { + if (m_threads.empty()) { + std::terminate(); + } + + for (;;) { + for (auto& ti : m_threads) { + bool expected = false; + + if (ti.busy.compare_exchange_strong(expected, true)) { + if (ti.thread.joinable()) { + ti.thread.join(); + } + + ti.thread = std::thread([&]{ + ti.o.run(); + ti.busy = false; + }); + + return ti.o; + } + } + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + } + +private: + struct ThreadInfo + { + std::thread thread; + std::atomic<bool> busy; + T o; + }; + + std::list<ThreadInfo> m_threads; +}; + + using DirStartF = void (void*, std::wstring_view); using DirEndF = void (void*, std::wstring_view); using FileF = void (void*, std::wstring_view, FILETIME); +void setHandleCloserThreadCount(std::size_t n); + void forEachEntry( const std::wstring& path, void* cx, DirStartF* dirStartF, DirEndF* dirEndF, FileF* fileF); +Directory getFilesAndDirs(const std::wstring& path); + } // namespace #endif // ENV_ENVFS_H |
