From bd8c620e73a00060b1a9e85cabe0a29395d75340 Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 4 Feb 2023 17:50:44 +0000 Subject: [PATCH 1/5] scripts: build modules to tmp directory before copying over to reload --- src/scripts/CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 33459e24..2285bf59 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -5,7 +5,8 @@ file(GLOB SCRIPT_INCLUDE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.h") message("exec: ${EXECUTABLE_OUTPUT_PATH}") -set(SCRIPT_LIB_DIR "${EXECUTABLE_OUTPUT_PATH}/compiledscripts/" ) +set(SCRIPT_POSTBUILD_DIR "${EXECUTABLE_OUTPUT_PATH}/compiledscripts/") +set(SCRIPT_LIB_DIR "${EXECUTABLE_OUTPUT_PATH}/tmp/compiledscripts/" ) set(EXECUTABLE_OUTPUT_PATH "${SCRIPT_LIB_DIR}") set(LIBRARY_OUTPUT_PATH "${SCRIPT_LIB_DIR}") set(RUNTIME_OUTPUT_DIRECTORY "${SCRIPT_LIB_DIR}") @@ -55,15 +56,23 @@ foreach(_scriptDir ${children}) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ScriptLoader.cpp.in" "${_scriptDir}/ScriptLoader.cpp") + set(ScriptTargetName "script_${_name}") + # Copy the modules over once they're built. Prevent watchdog from trying to reload partially written files. if(MSVC) add_custom_command(TARGET "script_${_name}" POST_BUILD COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.exp" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.lib" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.ilk" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SCRIPT_LIB_DIR}/script_${_name}.dll" ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll + ) + else() + add_custom_command(TARGET "script_${_name}" POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR}/ ) endif() + unset(ScriptTargetName) unset(ScriptIncludes) unset(ScriptNames) endif() From e5fd01baafdba6d4e367fc08d57d47b141bc6d54 Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 4 Feb 2023 18:42:38 +0000 Subject: [PATCH 2/5] fix build cause extra slash in scripts cmake --- src/scripts/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 2285bf59..f32c5082 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -68,7 +68,7 @@ foreach(_scriptDir ${children}) ) else() add_custom_command(TARGET "script_${_name}" POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR}/ + COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR} ) endif() From 6f457a4e7ef8f46a824c6ec17decca16b2a9d3f4 Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 4 Feb 2023 19:24:43 +0000 Subject: [PATCH 3/5] scripts: write a temp file when building modules so watchdog waits --- src/scripts/CMakeLists.txt | 4 ++++ src/world/Script/ScriptLoader.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index f32c5082..39f05dff 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -64,11 +64,15 @@ foreach(_scriptDir ${children}) COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.exp" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.lib" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.ilk" + COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll_LOCK COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SCRIPT_LIB_DIR}/script_${_name}.dll" ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll + COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll_LOCK ) else() add_custom_command(TARGET "script_${_name}" POST_BUILD + COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}/$_LOCK COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR} + COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}/$_LOCK ) endif() diff --git a/src/world/Script/ScriptLoader.cpp b/src/world/Script/ScriptLoader.cpp index 9e42af29..59d36ea6 100644 --- a/src/world/Script/ScriptLoader.cpp +++ b/src/world/Script/ScriptLoader.cpp @@ -74,6 +74,10 @@ Sapphire::Scripting::ScriptInfo* Sapphire::Scripting::ScriptLoader::loadModule( fs::create_directories( cacheDir ); fs::path dest( cacheDir /= f.filename().string() ); + // make sure the module has finished building before trying to copy it + if( fs::exists( f.string() + "_LOCK" ) ) + return nullptr; + try { fs::copy_file( f, dest, fs::copy_options::overwrite_existing ); From f9b5e0e8748bd13686d005418d86403aebff6562 Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 4 Feb 2023 20:10:14 +0000 Subject: [PATCH 4/5] more watchdog shenanigans --- src/scripts/CMakeLists.txt | 4 ++-- src/world/Script/NativeScriptMgr.cpp | 15 +++++++++++++++ src/world/Script/NativeScriptMgr.h | 3 +++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 39f05dff..42159135 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -70,9 +70,9 @@ foreach(_scriptDir ${children}) ) else() add_custom_command(TARGET "script_${_name}" POST_BUILD - COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}/$_LOCK + COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}$_LOCK COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR} - COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}/$_LOCK + COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}$_LOCK ) endif() diff --git a/src/world/Script/NativeScriptMgr.cpp b/src/world/Script/NativeScriptMgr.cpp index e932c0f7..9ce22785 100644 --- a/src/world/Script/NativeScriptMgr.cpp +++ b/src/world/Script/NativeScriptMgr.cpp @@ -9,6 +9,8 @@ namespace Sapphire::Scripting bool NativeScriptMgr::loadScript( const std::string& path ) { + std::scoped_lock lock( m_mutex ); + auto module = m_loader.loadModule( path ); if( !module ) return false; @@ -47,11 +49,15 @@ namespace Sapphire::Scripting const std::string NativeScriptMgr::getModuleExtension() { + std::scoped_lock lock( m_mutex ); + return m_loader.getModuleExtension(); } bool NativeScriptMgr::unloadScript( const std::string& name ) { + std::scoped_lock lock( m_mutex ); + auto info = m_loader.getScriptInfo( name ); if( !info ) return false; @@ -61,6 +67,8 @@ namespace Sapphire::Scripting bool NativeScriptMgr::unloadScript( ScriptInfo* info ) { + std::scoped_lock lock( m_mutex ); + for( auto& script : info->scripts ) { m_scripts[ script->getType() ].erase( script->getId() ); @@ -83,11 +91,14 @@ namespace Sapphire::Scripting if( !unloadScript( info ) ) return; + std::scoped_lock lock( m_mutex ); m_scriptLoadQueue.push( libPath ); } void NativeScriptMgr::processLoadQueue() { + std::scoped_lock lock( m_mutex ); + std::vector< std::string > deferredLoads; while( !m_scriptLoadQueue.empty() ) @@ -110,11 +121,15 @@ namespace Sapphire::Scripting void NativeScriptMgr::findScripts( std::set< Sapphire::Scripting::ScriptInfo* >& scripts, const std::string& search ) { + std::scoped_lock lock( m_mutex ); + return m_loader.findScripts( scripts, search ); } bool NativeScriptMgr::isModuleLoaded( const std::string& name ) { + std::scoped_lock lock( m_mutex ); + return m_loader.isModuleLoaded( name ); } diff --git a/src/world/Script/NativeScriptMgr.h b/src/world/Script/NativeScriptMgr.h index 668408a0..d7c56c40 100644 --- a/src/world/Script/NativeScriptMgr.h +++ b/src/world/Script/NativeScriptMgr.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "ScriptLoader.h" @@ -29,6 +30,8 @@ namespace Sapphire::Scripting */ std::queue< std::string > m_scriptLoadQueue; + std::recursive_mutex m_mutex; + /*! * @brief Used to unload a script * From 835ba3889e0287c76b5b8cba65c863863b645f0b Mon Sep 17 00:00:00 2001 From: Tahir Date: Sat, 4 Feb 2023 20:33:11 +0000 Subject: [PATCH 5/5] attempt to fix ci for scripts cmake --- src/scripts/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt index 42159135..b68c3c0b 100644 --- a/src/scripts/CMakeLists.txt +++ b/src/scripts/CMakeLists.txt @@ -64,13 +64,13 @@ foreach(_scriptDir ${children}) COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.exp" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.lib" COMMAND ${CMAKE_COMMAND} -E remove "${SCRIPT_LIB_DIR}/script_${_name}.ilk" - COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll_LOCK - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SCRIPT_LIB_DIR}/script_${_name}.dll" ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll - COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}/${ScriptTargetName}.dll_LOCK + COMMAND ${CMAKE_COMMAND} -E copy "${SCRIPT_LIB_DIR}/script_${_name}.dll" ${SCRIPT_POSTBUILD_DIR}${ScriptTargetName}.dll_LOCK + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SCRIPT_LIB_DIR}/script_${_name}.dll" ${SCRIPT_POSTBUILD_DIR}${ScriptTargetName}.dll + COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}${ScriptTargetName}.dll_LOCK ) else() add_custom_command(TARGET "script_${_name}" POST_BUILD - COMMAND ${CMAKE_COMMAND} -E touch ${SCRIPT_POSTBUILD_DIR}$_LOCK + COMMAND ${CMAKE_COMMAND} -E copy $ ${SCRIPT_POSTBUILD_DIR}_LOCK COMMAND ${CMAKE_COMMAND} -E copy_if_different $ ${SCRIPT_POSTBUILD_DIR} COMMAND ${CMAKE_COMMAND} -E remove ${SCRIPT_POSTBUILD_DIR}$_LOCK )