diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/StarboundClient.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/StarboundClient.kt index bfc076c4..5fdbdac2 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/StarboundClient.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/StarboundClient.kt @@ -104,7 +104,7 @@ class StarboundClient : Closeable { var fullbright = true - var gameTerminated = false + var clientTerminated = false private set /** @@ -156,6 +156,8 @@ class StarboundClient : Closeable { lock.lock() try { + clients++ + if (!glfwInitialized) { check(GLFW.glfwInit()) { "Unable to initialize GLFW" } glfwInitialized = true @@ -991,21 +993,30 @@ class StarboundClient : Closeable { } override fun close() { - if (gameTerminated) + if (clientTerminated) return - if (window != MemoryUtil.NULL) { - Callbacks.glfwFreeCallbacks(window) - GLFW.glfwDestroyWindow(window) - } + lock.lock() - GLFW.glfwTerminate() - GLFW.glfwSetErrorCallback(null)?.free() + try { + if (window != MemoryUtil.NULL) { + Callbacks.glfwFreeCallbacks(window) + GLFW.glfwDestroyWindow(window) + } - gameTerminated = true + if (--clients == 0) { + GLFW.glfwTerminate() + GLFW.glfwSetErrorCallback(null)?.free() + glfwInitialized = false + } - for (callback in terminateCallbacks) { - callback.invoke() + clientTerminated = true + + for (callback in terminateCallbacks) { + callback.invoke() + } + } finally { + lock.unlock() } } @@ -1021,6 +1032,8 @@ class StarboundClient : Closeable { private val lock = ReentrantLock() @Volatile private var glfwInitialized = false + @Volatile + private var clients = 0 @JvmStatic fun readInternal(file: String): String {