diff --git a/CMakeLists.txt b/CMakeLists.txt index ad89a0e..45f420f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ endif() # Add include directories include_directories(${CMAKE_SOURCE_DIR}/deps) -include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/deps/libtcod) +include_directories(${CMAKE_SOURCE_DIR}/deps/libtcod) # Python includes: use different paths for Windows vs Linux if(MCRF_CROSS_WINDOWS) @@ -29,7 +29,7 @@ if(MCRF_CROSS_WINDOWS) include_directories(${CMAKE_SOURCE_DIR}/deps/cpython/PC) # For other Windows-specific headers # Also include SFML and libtcod Windows headers include_directories(${CMAKE_SOURCE_DIR}/__lib_windows/sfml/include) - include_directories(SYSTEM ${CMAKE_SOURCE_DIR}/__lib_windows/libtcod/include) + include_directories(${CMAKE_SOURCE_DIR}/__lib_windows/libtcod/include) else() # Native builds (Linux/Windows): use existing Python setup include_directories(${CMAKE_SOURCE_DIR}/deps/cpython) diff --git a/src/PythonObjectCache.cpp b/src/PythonObjectCache.cpp index 4d3e453..b280eb2 100644 --- a/src/PythonObjectCache.cpp +++ b/src/PythonObjectCache.cpp @@ -36,17 +36,15 @@ void PythonObjectCache::registerObject(uint64_t serial, PyObject* weakref) { PyObject* PythonObjectCache::lookup(uint64_t serial) { if (serial == 0) return nullptr; - - // No mutex needed for read - GIL protects PyWeakref_GetRef + + // No mutex needed for read - GIL protects PyWeakref_GetObject auto it = cache.find(serial); if (it != cache.end()) { - PyObject* obj = nullptr; - int result = PyWeakref_GetRef(it->second, &obj); - if (result == 1 && obj) { - // obj is already a strong reference from PyWeakref_GetRef + PyObject* obj = PyWeakref_GetObject(it->second); + if (obj && obj != Py_None) { + Py_INCREF(obj); return obj; } - // result == 0: dead reference, result == -1: error } return nullptr; } @@ -64,18 +62,14 @@ void PythonObjectCache::remove(uint64_t serial) { void PythonObjectCache::cleanup() { std::lock_guard lock(serial_mutex); - + auto it = cache.begin(); while (it != cache.end()) { - PyObject* obj = nullptr; - int result = PyWeakref_GetRef(it->second, &obj); - if (result <= 0) { - // Dead reference or error - remove from cache + PyObject* obj = PyWeakref_GetObject(it->second); + if (!obj || obj == Py_None) { Py_DECREF(it->second); it = cache.erase(it); } else { - // Still alive - release the strong reference we obtained - Py_DECREF(obj); ++it; } }