From fbf3621d335f092560ee535014545ea337e84e49 Mon Sep 17 00:00:00 2001 From: Benjamin Eikel Date: Sat, 5 Nov 2016 15:04:42 +0100 Subject: [PATCH 1/5] Add SyncTools.h to Basics.h --- EScript/Basics.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/EScript/Basics.h b/EScript/Basics.h index 7b12a22..f3be4e4 100644 --- a/EScript/Basics.h +++ b/EScript/Basics.h @@ -17,5 +17,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 From 8f34e0e4e243d957430477933bd5939cd789b124 Mon Sep 17 00:00:00 2001 From: Benjamin Eikel Date: Sat, 5 Nov 2016 15:05:04 +0100 Subject: [PATCH 2/5] Update copyright --- EScript/Basics.h | 1 + 1 file changed, 1 insertion(+) diff --git a/EScript/Basics.h b/EScript/Basics.h index f3be4e4..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. // --------------------------------------------------------------------------------- From 6ef0fe7f882d09d92e6c68ea208923e340fbed6b Mon Sep 17 00:00:00 2001 From: Benjamin Eikel Date: Sat, 5 Nov 2016 15:19:49 +0100 Subject: [PATCH 3/5] Add CMake option to build with ES_THREADING --- CMakeLists.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index dac3620..4786f84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) From 1dfc24c5a24a954f638834bd569adb4abc052791 Mon Sep 17 00:00:00 2001 From: Benjamin Eikel Date: Sat, 5 Nov 2016 15:20:00 +0100 Subject: [PATCH 4/5] Add missing preprocessor guards for ES_THREADING --- EScript/Objects/Values/Bool.cpp | 9 ++++++++- EScript/Objects/Values/Number.cpp | 8 ++++++++ EScript/Objects/Values/String.cpp | 9 ++++++++- EScript/Runtime/FunctionCallContext.cpp | 8 ++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) 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 */ } } From a429e92e62d64abce8cc703df6d9ad48672c8017 Mon Sep 17 00:00:00 2001 From: Benjamin Eikel Date: Sat, 5 Nov 2016 15:22:45 +0100 Subject: [PATCH 5/5] Update copyright year --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4786f84..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. # ---------------------------------------------------------------------------------