]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/cpp_api/s_async.cpp
Expose getPointedThing to Lua
[dragonfireclient.git] / src / script / cpp_api / s_async.cpp
index 1716326330355825b9b9e94b7fcf1de18e42bf11..5cca5fc03778f2b27bc050cb43d8cd51375946d8 100644 (file)
@@ -33,39 +33,32 @@ extern "C" {
 #include "porting.h"
 #include "common/c_internal.h"
 
-/******************************************************************************/
-AsyncEngine::AsyncEngine() :
-       initDone(false),
-       jobIdCounter(0)
-{
-}
-
 /******************************************************************************/
 AsyncEngine::~AsyncEngine()
 {
 
        // Request all threads to stop
        for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin();
-                       it != workerThreads.end(); it++) {
+                       it != workerThreads.end(); ++it) {
                (*it)->stop();
        }
 
 
        // Wake up all threads
        for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin();
-                       it != workerThreads.end(); it++) {
+                       it != workerThreads.end(); ++it) {
                jobQueueCounter.post();
        }
 
        // Wait for threads to finish
        for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin();
-                       it != workerThreads.end(); it++) {
+                       it != workerThreads.end(); ++it) {
                (*it)->wait();
        }
 
        // Force kill all threads
        for (std::vector<AsyncWorkerThread *>::iterator it = workerThreads.begin();
-                       it != workerThreads.end(); it++) {
+                       it != workerThreads.end(); ++it) {
                delete *it;
        }
 
@@ -76,13 +69,9 @@ AsyncEngine::~AsyncEngine()
 }
 
 /******************************************************************************/
-bool AsyncEngine::registerFunction(const char* name, lua_CFunction func)
+void AsyncEngine::registerStateInitializer(StateInitializer func)
 {
-       if (initDone) {
-               return false;
-       }
-       functionList[name] = func;
-       return true;
+       stateInitializers.push_back(func);
 }
 
 /******************************************************************************/
@@ -99,7 +88,8 @@ void AsyncEngine::initialize(unsigned int numEngines)
 }
 
 /******************************************************************************/
-unsigned int AsyncEngine::queueAsyncJob(std::string func, std::string params)
+unsigned int AsyncEngine::queueAsyncJob(const std::string &func,
+               const std::string &params)
 {
        jobQueueMutex.lock();
        LuaJobInfo toAdd;
@@ -123,7 +113,6 @@ LuaJobInfo AsyncEngine::getJob()
        jobQueueMutex.lock();
 
        LuaJobInfo retval;
-       retval.valid = false;
 
        if (!jobQueue.empty()) {
                retval = jobQueue.front();
@@ -136,7 +125,7 @@ LuaJobInfo AsyncEngine::getJob()
 }
 
 /******************************************************************************/
-void AsyncEngine::putJobResult(LuaJobInfo result)
+void AsyncEngine::putJobResult(const LuaJobInfo &result)
 {
        resultQueueMutex.lock();
        resultQueue.push_back(result);
@@ -203,11 +192,9 @@ void AsyncEngine::pushFinishedJobs(lua_State* L) {
 /******************************************************************************/
 void AsyncEngine::prepareEnvironment(lua_State* L, int top)
 {
-       for (std::map<std::string, lua_CFunction>::iterator it = functionList.begin();
-                       it != functionList.end(); it++) {
-               lua_pushstring(L, it->first.c_str());
-               lua_pushcfunction(L, it->second);
-               lua_settable(L, top);
+       for (std::vector<StateInitializer>::iterator it = stateInitializers.begin();
+                       it != stateInitializers.end(); it++) {
+               (*it)(L, top);
        }
 }
 
@@ -243,8 +230,12 @@ void* AsyncWorkerThread::run()
        lua_State *L = getStack();
 
        std::string script = getServer()->getBuiltinLuaPath() + DIR_DELIM + "init.lua";
-       if (!loadScript(script)) {
-               FATAL_ERROR("execution of async base environment failed!");
+       try {
+               loadScript(script);
+       } catch (const ModError &e) {
+               errorstream << "Execution of async base environment failed: "
+                       << e.what() << std::endl;
+               FATAL_ERROR("Execution of async base environment failed");
        }
 
        int error_handler = PUSH_ERROR_HANDLER(L);
@@ -259,7 +250,7 @@ void* AsyncWorkerThread::run()
                // Wait for job
                LuaJobInfo toProcess = jobDispatcher->getJob();
 
-               if (toProcess.valid == false || stopRequested()) {
+               if (!toProcess.valid || stopRequested()) {
                        continue;
                }