]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/cpp_api/s_async.h
Fix CSM crash (#5779)
[dragonfireclient.git] / src / script / cpp_api / s_async.h
index 016381e5f2476c0d6484ffcaaada2fba0f6c759e..dbe0654e280282949b517d66777ef6f102338596 100644 (file)
@@ -38,7 +38,16 @@ class AsyncEngine;
 // Declarations
 
 // Data required to queue a job
-struct LuaJobInfo {
+struct LuaJobInfo
+{
+       LuaJobInfo() :
+               serializedFunction(""),
+               serializedParams(""),
+               serializedResult(""),
+               id(0),
+               valid(false)
+       {}
+
        // Function to be called in async environment
        std::string serializedFunction;
        // Parameter to be passed to function
@@ -66,16 +75,16 @@ class AsyncWorkerThread : public Thread, public ScriptApiBase {
 // Asynchornous thread and job management
 class AsyncEngine {
        friend class AsyncWorkerThread;
+       typedef void (*StateInitializer)(lua_State *L, int top);
 public:
        AsyncEngine();
        ~AsyncEngine();
 
        /**
-        * Register function to be used within engine
-        * @param name Function name to be used within Lua environment
+        * Register function to be called on new states
         * @param func C function to be called
         */
-       bool registerFunction(const char* name, lua_CFunction func);
+       void registerStateInitializer(StateInitializer func);
 
        /**
         * Create async engine tasks and lock function registration
@@ -89,7 +98,7 @@ class AsyncEngine {
         * @param params Serialized parameters
         * @return jobid The job is queued
         */
-       unsigned int queueAsyncJob(std::string func, std::string params);
+       unsigned int queueAsyncJob(const std::string &func, const std::string &params);
 
        /**
         * Engine step to process finished jobs
@@ -116,7 +125,7 @@ class AsyncEngine {
         * Put a Job result back to result queue
         * @param result result of completed job
         */
-       void putJobResult(LuaJobInfo result);
+       void putJobResult(const LuaJobInfo &result);
 
        /**
         * Initialize environment with current registred functions
@@ -131,8 +140,8 @@ class AsyncEngine {
        // Variable locking the engine against further modification
        bool initDone;
 
-       // Internal store for registred functions
-       UNORDERED_MAP<std::string, lua_CFunction> functionList;
+       // Internal store for registred state initializers
+       std::vector<StateInitializer> stateInitializers;
 
        // Internal counter to create job IDs
        unsigned int jobIdCounter;