diff --git a/CMakeLists.txt b/CMakeLists.txt index dac3620..534884c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ # CMakeLists.txt # This file is part of the EScript programming language (https://github.com/EScript) # -# Copyright (C) 2011-2014 Claudius Jähn -# Copyright (C) 2011-2013 Benjamin Eikel +# Copyright (C) 2011-2014 Claudius Jähn +# Copyright (C) 2011-2016 Benjamin Eikel # # Licensed under the MIT License. See LICENSE file for details. # --------------------------------------------------------------------------------- @@ -69,11 +69,24 @@ set(ESCRIPT_SOURCES E_Libs/MathLib.cpp E_Libs/StdLib.cpp ) +option(BUILD_ESCRIPT_THREADING "Defines if EScript is built with threading support.") +if(BUILD_ESCRIPT_THREADING) + list(APPEND ESCRIPT_SOURCES E_Libs/ThreadingLib.cpp) +endif() if(WIN32) list(APPEND ESCRIPT_SOURCES E_Libs/Win32Lib.cpp) endif() add_library(EScript SHARED ${ESCRIPT_SOURCES}) +if(BUILD_ESCRIPT_THREADING) + target_compile_definitions(EScript PRIVATE ES_THREADING) + + # Dependency on pthread + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) + target_link_libraries(EScript PRIVATE Threads::Threads) +endif() + include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) diff --git a/EScript/Basics.h b/EScript/Basics.h index 7b12a22..940cdb0 100644 --- a/EScript/Basics.h +++ b/EScript/Basics.h @@ -2,6 +2,7 @@ // This file is part of the EScript programming language (https://github.com/EScript) // // Copyright (C) 2013 Claudius Jähn +// Copyright (C) 2016 Benjamin Eikel // // Licensed under the MIT License. See LICENSE file for details. // --------------------------------------------------------------------------------- @@ -17,5 +18,8 @@ #include "Utils/Macros.h" #include "Utils/StdConversions.h" #include "Utils/StdFactories.h" +#ifdef ES_THREADING +#include "Utils/SyncTools.h" +#endif #endif // ESCRIPT_BASICS_H diff --git a/EScript/Objects/Values/Bool.cpp b/EScript/Objects/Values/Bool.cpp index 1031835..a443dcd 100644 --- a/EScript/Objects/Values/Bool.cpp +++ b/EScript/Objects/Values/Bool.cpp @@ -88,6 +88,7 @@ Bool * Bool::create(bool value){ #ifdef ES_DEBUG_MEMORY return new Bool(value); #endif +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ if(pool.empty()){ @@ -101,9 +102,11 @@ Bool * Bool::create(bool value){ return o; } }else{ +#endif /* ES_THREADING */ return new Bool(false); +#ifdef ES_THREADING } - +#endif /* ES_THREADING */ } void Bool::release(Bool * o){ #ifdef ES_DEBUG_MEMORY @@ -114,12 +117,16 @@ void Bool::release(Bool * o){ delete o; std::cout << "Found diff BoolType\n"; }else{ +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ pool.push(o); }else{ +#endif /* ES_THREADING */ delete o; +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } } diff --git a/EScript/Objects/Values/Number.cpp b/EScript/Objects/Values/Number.cpp index 0c7b437..2ae38c2 100644 --- a/EScript/Objects/Values/Number.cpp +++ b/EScript/Objects/Values/Number.cpp @@ -289,6 +289,7 @@ Number * Number::create(double value){ #ifdef ES_DEBUG_MEMORY return new Number(value); #endif +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ if(pool.empty()){ @@ -301,8 +302,11 @@ Number * Number::create(double value){ return n; } }else{ +#endif /* ES_THREADING */ return new Number(value); +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } //! (static) @@ -315,12 +319,16 @@ void Number::release(Number * n){ delete n; std::cout << "Found diff NumberType\n"; }else{ +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ pool.push(n); }else{ +#endif /* ES_THREADING */ delete n; +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } } //---------------------------------------------------------- diff --git a/EScript/Objects/Values/String.cpp b/EScript/Objects/Values/String.cpp index 93b4102..0cf91bf 100644 --- a/EScript/Objects/Values/String.cpp +++ b/EScript/Objects/Values/String.cpp @@ -272,7 +272,7 @@ String * String::create(const StringData & sData){ #ifdef ES_DEBUG_MEMORY return new String(sData); #endif - +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ if(pool.empty()){ @@ -285,8 +285,11 @@ String * String::create(const StringData & sData){ return o; } }else{ +#endif /* ES_THREADING */ return new String(sData); +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } void String::release(String * o){ #ifdef ES_DEBUG_MEMORY @@ -297,12 +300,16 @@ void String::release(String * o){ delete o; std::cout << "(internal) String::release: Invalid StringType\n"; }else{ +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ pool.push(o); }else{ +#endif /* ES_THREADING */ delete o; +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } } //--- diff --git a/EScript/Runtime/FunctionCallContext.cpp b/EScript/Runtime/FunctionCallContext.cpp index 5c532c1..e7ca1c2 100644 --- a/EScript/Runtime/FunctionCallContext.cpp +++ b/EScript/Runtime/FunctionCallContext.cpp @@ -29,6 +29,7 @@ static SyncTools::FastLock poolMutex; FunctionCallContext * FunctionCallContext::create(ERef userFunction,ObjRef _caller){ FunctionCallContext * fcc = nullptr; { +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ if(pool.empty()){ @@ -39,8 +40,11 @@ FunctionCallContext * FunctionCallContext::create(ERef userFunctio pool.pop(); } }else{ +#endif /* ES_THREADING */ fcc = new FunctionCallContext; +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } // fcc = new FunctionCallContext; // assert(userFunction); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -52,12 +56,16 @@ FunctionCallContext * FunctionCallContext::create(ERef userFunctio void FunctionCallContext::release(FunctionCallContext *fcc){ fcc->reset(); { +#ifdef ES_THREADING auto lock = SyncTools::tryLock(poolMutex); if(lock.owns_lock()){ pool.push(fcc); }else{ +#endif /* ES_THREADING */ delete fcc; +#ifdef ES_THREADING } +#endif /* ES_THREADING */ } }