@@ -375,23 +375,26 @@ static PyObject *Dtool_EnumType_Repr(PyObject *self) {
375
375
* should be a tuple of (name, value) pairs.
376
376
*/
377
377
PyTypeObject *Dtool_EnumType_Create (const char *name, PyObject *names, const char *module) {
378
- static PyObject *enum_class = nullptr ;
379
378
#if PY_VERSION_HEX >= 0x03040000
380
- static PyObject *enum_meta = nullptr ;
381
- static PyObject *enum_create = nullptr ;
382
- if (enum_meta == nullptr ) {
383
- PyObject *enum_module = PyImport_ImportModule (" enum" );
384
- nassertr_always (enum_module != nullptr , nullptr );
379
+ PyObject *enum_module = PyImport_ImportModule (" enum" );
380
+ nassertr_always (enum_module != nullptr , nullptr );
385
381
386
- enum_class = PyObject_GetAttrString (enum_module, " Enum" );
387
- enum_meta = PyObject_GetAttrString (enum_module, " EnumMeta" );
388
- enum_create = PyObject_GetAttrString (enum_meta, " _create_" );
389
- nassertr (enum_meta != nullptr , nullptr );
390
- }
382
+ PyObject *enum_meta = PyObject_GetAttrString (enum_module, " EnumMeta" );
383
+ nassertr (enum_meta != nullptr , nullptr );
384
+
385
+ PyObject *enum_class = PyObject_GetAttrString (enum_module, " Enum" );
386
+ Py_DECREF (enum_module);
387
+ nassertr (enum_class != nullptr , nullptr );
388
+
389
+ PyObject *enum_create = PyObject_GetAttrString (enum_meta, " _create_" );
390
+ Py_DECREF (enum_meta);
391
391
392
392
PyObject *result = PyObject_CallFunction (enum_create, (char *)" OsN" , enum_class, name, names);
393
+ Py_DECREF (enum_create);
394
+ Py_DECREF (enum_class);
393
395
nassertr (result != nullptr , nullptr );
394
396
#else
397
+ static PyObject *enum_class = nullptr ;
395
398
static PyObject *name_str;
396
399
static PyObject *name_sunder_str;
397
400
static PyObject *value_str;
@@ -528,16 +531,39 @@ PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyTypedObject &in_class
528
531
* Returns a borrowed reference to the global type dictionary.
529
532
*/
530
533
Dtool_TypeMap *Dtool_GetGlobalTypeMap () {
534
+ #if PY_VERSION_HEX >= 0x030d0000 // 3.13
535
+ PyObject *istate_dict = PyInterpreterState_GetDict (PyInterpreterState_Get ());
536
+ PyObject *key = PyUnicode_InternFromString (" _interrogate_types" );
537
+ PyObject *capsule = PyDict_GetItem (istate_dict, key);
538
+ if (capsule != nullptr ) {
539
+ Py_DECREF (key);
540
+ return (Dtool_TypeMap *)PyCapsule_GetPointer (capsule, nullptr );
541
+ }
542
+ #else
531
543
PyObject *capsule = PySys_GetObject ((char *)" _interrogate_types" );
532
544
if (capsule != nullptr ) {
533
545
return (Dtool_TypeMap *)PyCapsule_GetPointer (capsule, nullptr );
534
- } else {
535
- Dtool_TypeMap *type_map = new Dtool_TypeMap;
536
- capsule = PyCapsule_New ((void *)type_map, nullptr , nullptr );
537
- PySys_SetObject ((char *)" _interrogate_types" , capsule);
546
+ }
547
+ #endif
548
+
549
+ Dtool_TypeMap *type_map = new Dtool_TypeMap;
550
+ capsule = PyCapsule_New ((void *)type_map, nullptr , nullptr );
551
+
552
+ #if PY_VERSION_HEX >= 0x030d0000 // 3.13
553
+ PyObject *result;
554
+ if (PyDict_SetDefaultRef (istate_dict, key, capsule, &result) != 0 ) {
555
+ // Another thread already beat us to it.
538
556
Py_DECREF (capsule);
539
- return type_map;
557
+ delete type_map;
558
+ capsule = result;
559
+ type_map = (Dtool_TypeMap *)PyCapsule_GetPointer (capsule, nullptr );
540
560
}
561
+ Py_DECREF (key);
562
+ #endif
563
+
564
+ PySys_SetObject ((char *)" _interrogate_types" , capsule);
565
+ Py_DECREF (capsule);
566
+ return type_map;
541
567
}
542
568
543
569
/* *
@@ -594,6 +620,10 @@ PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulen
594
620
595
621
Dtool_TypeMap *type_map = Dtool_GetGlobalTypeMap ();
596
622
623
+ #ifdef Py_GIL_DISABLED
624
+ PyMutex_Lock (&type_map->_lock );
625
+ #endif
626
+
597
627
// the module level function inits....
598
628
MethodDefmap functions;
599
629
for (size_t i = 0 ; defs[i] != nullptr ; i++) {
@@ -627,12 +657,19 @@ PyObject *Dtool_PyModuleInitHelper(const LibraryDef *defs[], const char *modulen
627
657
if (it != type_map->end ()) {
628
658
types->type = it->second ;
629
659
} else {
630
- return PyErr_Format (PyExc_NameError, " name '%s' is not defined" , types->name );
660
+ PyErr_Format (PyExc_NameError, " name '%s' is not defined" , types->name );
661
+ #ifdef Py_GIL_DISABLED
662
+ PyMutex_Unlock (&type_map->_lock );
663
+ #endif
664
+ return nullptr ;
631
665
}
632
666
++types;
633
667
}
634
668
}
635
669
}
670
+ #ifdef Py_GIL_DISABLED
671
+ PyMutex_Unlock (&type_map->_lock );
672
+ #endif
636
673
637
674
PyMethodDef *newdef = new PyMethodDef[functions.size () + 1 ];
638
675
MethodDefmap::iterator mi;
0 commit comments