diff --git a/src/performance/performancemanager.cpp b/src/performance/performancemanager.cpp index caecf15b9a..41698fa1e8 100644 --- a/src/performance/performancemanager.cpp +++ b/src/performance/performancemanager.cpp @@ -36,22 +36,19 @@ namespace { const std::string GlobalSharedMemoryName = "OpenSpacePerformanceMeasurementData"; // Probably 255 performance blocks per node are enough, so we can get away with - // 260 bytes (one uint8_t for the number, 255 uint8_t for the names, one uint8_t - // for the reference count to keep the global memory alive, and 3 bytes to enforce - // alignment) - const size_t GlobalSharedMemorySize = 260; + // 4 bytes (one uint8_t for the number, one uint8_t for the reference count to keep + // the global memory alive, and 2 bytes to enforce alignment) + const size_t GlobalSharedMemorySize = 4; + const int MaximumNumber = 256; + struct GlobalMemory { uint8_t number; uint8_t referenceCount; - std::array values; - std::array alignment; + std::array alignment; }; - const uint8_t UnusedName = 255; - - const std::string LocalSharedMemoryNameBase = "PerformanceMeasurement_"; } @@ -95,7 +92,6 @@ void PerformanceManager::createGlobalSharedMemory() { GlobalMemory* m = reinterpret_cast(sharedMemory.memory()); m->number = 0; m->referenceCount = 1; - m->values.fill(UnusedName); sharedMemory.releaseLock(); } } @@ -111,9 +107,21 @@ void PerformanceManager::destroyGlobalSharedMemory() { sharedMemory.acquireLock(); GlobalMemory* m = reinterpret_cast(sharedMemory.memory()); --(m->referenceCount); - LINFO("Global shared performance memory reference count: " << m->referenceCount); + LINFO("Global shared performance memory reference count: " << int(m->referenceCount)); if (m->referenceCount == 0) { LINFO("Removing global shared performance memory"); + + // When the global memory is deleted, we have to get rid of all local memory as + // well. In principle, none should be left, but OpenSpace crashing might leave + // some of the memory orphaned + for (int i = 0; i < std::numeric_limits::max(); ++i) { + std::string localName = LocalSharedMemoryNameBase + std::to_string(i); + if (SharedMemory::exists(localName)) { + LINFO("Removing shared memory: " << localName); + SharedMemory::remove(localName); + } + } + SharedMemory::remove(GlobalSharedMemoryName); } sharedMemory.releaseLock(); @@ -123,6 +131,8 @@ PerformanceManager::PerformanceManager() : _performanceMemory(nullptr) { using ghoul::SharedMemory; + PerformanceManager::createGlobalSharedMemory(); + SharedMemory sharedMemory(GlobalSharedMemoryName); sharedMemory.acquireLock(); @@ -133,6 +143,7 @@ PerformanceManager::PerformanceManager() // The the first free block (which also coincides with the number of blocks uint8_t blockIndex = m->number; ++(m->number); + std::string localName = LocalSharedMemoryNameBase + std::to_string(blockIndex); // Compute the total size @@ -157,11 +168,14 @@ PerformanceManager::~PerformanceManager() { ghoul::SharedMemory sharedMemory(GlobalSharedMemoryName); sharedMemory.acquireLock(); GlobalMemory* m = reinterpret_cast(sharedMemory.memory()); - m->number = m->number - 1; + --(m->number); sharedMemory.releaseLock(); + LINFO("Remove shared memory '" << _performanceMemory->name() << "'"); ghoul::SharedMemory::remove(_performanceMemory->name()); } + + PerformanceManager::destroyGlobalSharedMemory(); } void PerformanceManager::resetPerformanceMeasurements() { diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index a131932425..e3abd6bf57 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -760,13 +760,11 @@ scripting::LuaLibrary RenderEngine::luaLibrary() { void RenderEngine::setPerformanceMeasurements(bool performanceMeasurements) { if (performanceMeasurements) { if (!_performanceManager) { - performance::PerformanceManager::createGlobalSharedMemory(); _performanceManager = std::make_unique(); } } else { _performanceManager = nullptr; - performance::PerformanceManager::destroyGlobalSharedMemory(); } } diff --git a/src/rendering/renderengine_lua.inl b/src/rendering/renderengine_lua.inl index ebb099cf23..43cbe1d4bf 100644 --- a/src/rendering/renderengine_lua.inl +++ b/src/rendering/renderengine_lua.inl @@ -33,8 +33,9 @@ namespace luascriptfunctions { */ int takeScreenshot(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 0) + if (nArguments != 0) { return luaL_error(L, "Expected %i arguments, got %i", 0, nArguments); + } OsEng.renderEngine().takeScreenshot(); return 0; } @@ -46,12 +47,14 @@ int takeScreenshot(lua_State* L) { */ int setRenderer(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } const int type = lua_type(L, -1); - if (type != LUA_TSTRING) + if (type != LUA_TSTRING) { return luaL_error(L, "Expected argument of type 'string'"); + } std::string r = lua_tostring(L, -1); OsEng.renderEngine().setRendererFromString(r); return 0; @@ -64,8 +67,9 @@ int setRenderer(lua_State* L) { */ int setNAaSamples(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } double t = luaL_checknumber(L, -1); @@ -81,12 +85,14 @@ int setNAaSamples(lua_State* L) { */ int showRenderInformation(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } const int type = lua_type(L, -1); - if (type != LUA_TBOOLEAN) + if (type != LUA_TBOOLEAN) { return luaL_error(L, "Expected argument of type 'bool'"); + } bool b = lua_toboolean(L, -1) != 0; OsEng.renderEngine().toggleInfoText(b); return 0; @@ -99,8 +105,9 @@ int showRenderInformation(lua_State* L) { */ int setPerformanceMeasurement(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } bool b = lua_toboolean(L, -1) != 0; OsEng.renderEngine().setPerformanceMeasurements(b); @@ -114,8 +121,9 @@ int setPerformanceMeasurement(lua_State* L) { */ int toggleFade(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } double t = luaL_checknumber(L, -1); @@ -133,8 +141,9 @@ int toggleFade(lua_State* L) { */ int fadeIn(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } double t = luaL_checknumber(L, -1); @@ -148,8 +157,9 @@ int fadeIn(lua_State* L) { */ int fadeOut(lua_State* L) { int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } double t = luaL_checknumber(L, -1); @@ -161,8 +171,9 @@ int registerScreenSpaceRenderable(lua_State* L) { using ghoul::lua::errorLocation; int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } ghoul::Dictionary d; try { @@ -183,8 +194,9 @@ int unregisterScreenSpaceRenderable(lua_State* L) { using ghoul::lua::errorLocation; int nArguments = lua_gettop(L); - if (nArguments != 1) + if (nArguments != 1) { return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments); + } std::string name = luaL_checkstring(L, -1);