mirror of https://github.com/OpenMW/openmw.git
Move LuaWorker to a separate file
parent
cd18c81e58
commit
212c7c7f25
@ -0,0 +1,92 @@
|
||||
#include "worker.hpp"
|
||||
|
||||
#include "luamanagerimp.hpp"
|
||||
|
||||
#include <apps/openmw/profile.hpp>
|
||||
|
||||
#include <components/settings/settings.hpp>
|
||||
|
||||
#include <osgViewer/Viewer>
|
||||
|
||||
namespace MWLua
|
||||
{
|
||||
Worker::Worker(LuaManager& manager, osgViewer::Viewer& viewer)
|
||||
: mManager(manager)
|
||||
, mViewer(viewer)
|
||||
{
|
||||
if (Settings::Manager::getInt("lua num threads", "Lua") > 0)
|
||||
mThread = std::thread([this] { run(); });
|
||||
}
|
||||
|
||||
Worker::~Worker()
|
||||
{
|
||||
if (mThread && mThread->joinable())
|
||||
{
|
||||
Log(Debug::Error)
|
||||
<< "Unexpected destruction of LuaWorker; likely there is an unhandled exception in the main thread.";
|
||||
join();
|
||||
}
|
||||
}
|
||||
|
||||
void Worker::allowUpdate()
|
||||
{
|
||||
if (!mThread)
|
||||
return;
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(mMutex);
|
||||
mUpdateRequest = true;
|
||||
}
|
||||
mCV.notify_one();
|
||||
}
|
||||
|
||||
void Worker::finishUpdate()
|
||||
{
|
||||
if (mThread)
|
||||
{
|
||||
std::unique_lock<std::mutex> lk(mMutex);
|
||||
mCV.wait(lk, [&] { return !mUpdateRequest; });
|
||||
}
|
||||
else
|
||||
update();
|
||||
}
|
||||
|
||||
void Worker::join()
|
||||
{
|
||||
if (mThread)
|
||||
{
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(mMutex);
|
||||
mJoinRequest = true;
|
||||
}
|
||||
mCV.notify_one();
|
||||
mThread->join();
|
||||
}
|
||||
}
|
||||
|
||||
void Worker::update()
|
||||
{
|
||||
const osg::Timer_t frameStart = mViewer.getStartTick();
|
||||
const unsigned int frameNumber = mViewer.getFrameStamp()->getFrameNumber();
|
||||
OMW::ScopedProfile<OMW::UserStatsType::Lua> profile(
|
||||
frameStart, frameNumber, *osg::Timer::instance(), *mViewer.getViewerStats());
|
||||
|
||||
mManager.update();
|
||||
}
|
||||
|
||||
void Worker::run() noexcept
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
std::unique_lock<std::mutex> lk(mMutex);
|
||||
mCV.wait(lk, [&] { return mUpdateRequest || mJoinRequest; });
|
||||
if (mJoinRequest)
|
||||
break;
|
||||
|
||||
update();
|
||||
|
||||
mUpdateRequest = false;
|
||||
lk.unlock();
|
||||
mCV.notify_one();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
#ifndef OPENMW_MWLUA_WORKER_H
|
||||
#define OPENMW_MWLUA_WORKER_H
|
||||
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <optional>
|
||||
#include <thread>
|
||||
|
||||
namespace osgViewer
|
||||
{
|
||||
class Viewer;
|
||||
}
|
||||
|
||||
namespace MWLua
|
||||
{
|
||||
class LuaManager;
|
||||
|
||||
class Worker
|
||||
{
|
||||
public:
|
||||
explicit Worker(LuaManager& manager, osgViewer::Viewer& viewer);
|
||||
|
||||
~Worker();
|
||||
|
||||
void allowUpdate();
|
||||
|
||||
void finishUpdate();
|
||||
|
||||
void join();
|
||||
|
||||
private:
|
||||
void update();
|
||||
|
||||
void run() noexcept;
|
||||
|
||||
LuaManager& mManager;
|
||||
osgViewer::Viewer& mViewer;
|
||||
std::mutex mMutex;
|
||||
std::condition_variable mCV;
|
||||
bool mUpdateRequest = false;
|
||||
bool mJoinRequest = false;
|
||||
std::optional<std::thread> mThread;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // OPENMW_MWLUA_LUAWORKER_H
|
Loading…
Reference in New Issue