Skip to content

Commit

Permalink
refactor: move the Job implementation
Browse files Browse the repository at this point in the history
The jobset has been moved into the Lua::Manager class and can generically
run any job on the "Lua" job queue.

The job has been moved into the SaveGameManager class so that any code
can load game data as Json in a job.
  • Loading branch information
mwerle committed Oct 11, 2024
1 parent c0493e4 commit 20a7010
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 47 deletions.
28 changes: 28 additions & 0 deletions src/SaveGameManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,29 @@ static const char s_saveDirName[] = "savefiles";

static const int s_saveVersion = 90;

// A simple job to load a savegame into a Json object
class LoadGameToJsonJob : public Job
{
public:
LoadGameToJsonJob(std::string_view filename, void(*callback)(std::string_view, const Json &)) :
m_filename(filename), m_callback(callback)
{
}

virtual void OnRun() {
m_rootNode = SaveGameManager::LoadGameToJson(m_filename);
};
virtual void OnFinish() {
m_callback(m_filename, m_rootNode);
};
virtual void OnCancel() {};
private:
std::string m_filename;
Json m_rootNode;
void(*m_callback)(std::string_view, const Json &);
};


void SaveGameManager::Init()
{
if (!FileSystem::userFiles.MakeDirectory(s_saveDirName)) {
Expand Down Expand Up @@ -59,6 +82,11 @@ Json SaveGameManager::LoadGameToJson(const std::string &filename)
return JsonUtils::LoadJsonSaveFile(FileSystem::JoinPathBelow(s_saveDirName, filename), FileSystem::userFiles);
}

Job *SaveGameManager::LoadGameToJsonJob(std::string_view filename, void(*callback)(std::string_view, const Json &))
{
return new class LoadGameToJsonJob(filename, callback);
}

Game *SaveGameManager::LoadGame(const std::string &name)
{
Output("SaveGameManager::LoadGame('%s')\n", name.c_str());
Expand Down
14 changes: 14 additions & 0 deletions src/SaveGameManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <vector>

class Game;
class Job;

class SaveGameManager {
public:
Expand Down Expand Up @@ -48,6 +49,19 @@ class SaveGameManager {
*/
static Json LoadGameToJson(const std::string &name);

/** Create a job which can be scheduled on a job queue to load the game as
* a Json object.
* This is provided as LoadGameToJson can be expensive.
*
* The \p callback is called in the main thread with the Json data once the
* job has completed.
*
* \param[in] name The name of the savegame to load.
* \param[in] callback A callback to be called once the data has been loaded.
* \return On success, a newly-created Job which can be passed to a job queue.
*/
static Job *LoadGameToJsonJob(std::string_view name, void(*callback)(std::string_view, const Json &));

/** Save the game.
* NOTE: This function will throw an exception if an error occurs while
* saving the game.
Expand Down
47 changes: 1 addition & 46 deletions src/lua/LuaGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,49 +25,6 @@
#include "galaxy/Galaxy.h"
#include "pigui/LuaPiGui.h"

/* A class to provide Jobs for various game tasks.
* The initial driver was to handle loading of savegame statistics in the
* background, but it was made generic enough to allow adding other jobs. */
class LuaGameJobs
{
private:
class SaveGameJob : public Job
{
public:
SaveGameJob(std::string_view filename, void(*callback)(std::string_view, const Json &)) :
m_filename(filename), m_callback(callback)
{
}

virtual void OnRun() {
m_rootNode = SaveGameManager::LoadGameToJson(m_filename);
};
virtual void OnFinish() {
m_callback(m_filename, m_rootNode);
};
virtual void OnCancel() {};
private:
std::string m_filename;
Json m_rootNode;
void(*m_callback)(std::string_view, const Json &);
};

JobSet m_jobs;

public:
LuaGameJobs() :
m_jobs(Pi::GetAsyncJobQueue())
{
}

void jobLoadGameToJson(std::string_view filename, void(*callback)(std::string_view, const Json &))
{
m_jobs.Order(new SaveGameJob(filename, callback));
}
};

static LuaGameJobs *gameJobs = nullptr;

/*
* Interface: Game
*
Expand Down Expand Up @@ -198,7 +155,7 @@ static void onSaveGameStatsJobFinished(std::string_view filename, const Json &ro
static int l_game_savegame_stats(lua_State *l)
{
const std::string filename = LuaPull<std::string>(l, 1);
gameJobs->jobLoadGameToJson(filename, onSaveGameStatsJobFinished);
Lua::manager->ScheduleJob(SaveGameManager::LoadGameToJsonJob(filename, onSaveGameStatsJobFinished));
return 0;
}

Expand Down Expand Up @@ -847,7 +804,5 @@ void LuaGame::Register()
lua_setfield(l, -2, "Game");
lua_pop(l, 1);

gameJobs = new LuaGameJobs();

LUA_DEBUG_END(l, 0);
}
10 changes: 9 additions & 1 deletion src/lua/LuaManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@

#include "LuaManager.h"
#include "FileSystem.h"
#include "Pi.h"
#include "utils.h"

#include <cstdlib>

bool instantiated = false;

LuaManager::LuaManager() :
m_lua(0)
m_lua(0), m_jobs(Pi::GetAsyncJobQueue())
{
if (instantiated) {
Output("Can't instantiate more than one LuaManager");
Expand Down Expand Up @@ -51,3 +52,10 @@ void LuaManager::CollectGarbage()
{
lua_gc(m_lua, LUA_GCCOLLECT, 0);
}

void LuaManager::ScheduleJob(Job *job)
{
if (job) {
m_jobs.Order(job);
}
}
5 changes: 5 additions & 0 deletions src/lua/LuaManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#ifndef _LUAMANAGER_H
#define _LUAMANAGER_H

#include "JobQueue.h"
#include "LuaUtils.h"

class LuaManager {
Expand All @@ -15,11 +16,15 @@ class LuaManager {
size_t GetMemoryUsage() const;
void CollectGarbage();

// Schedule a job to be run on the LuaManager job queue
void ScheduleJob(Job *job);

private:
LuaManager(const LuaManager &);
LuaManager &operator=(const LuaManager &) = delete;

lua_State *m_lua;
JobSet m_jobs;
};

#endif

0 comments on commit 20a7010

Please sign in to comment.