Compare commits

..

No commits in common. "c2877c80530646a5f3e4b679c9bcf347a1acf362" and "bf8557798acf53e960feaf9f80c99baa3e6d63ae" have entirely different histories.

2 changed files with 10 additions and 16 deletions

View file

@ -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)

View file

@ -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<std::mutex> 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;
}
}