Cython 3.3.0__cp315-cp315-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. Cython/Build/BuildExecutable.py +156 -0
  2. Cython/Build/Cache.py +199 -0
  3. Cython/Build/Cythonize.py +349 -0
  4. Cython/Build/Dependencies.py +1281 -0
  5. Cython/Build/Distutils.py +1 -0
  6. Cython/Build/Inline.py +467 -0
  7. Cython/Build/IpythonMagic.py +559 -0
  8. Cython/Build/SharedModule.py +165 -0
  9. Cython/Build/Tests/TestCyCache.py +195 -0
  10. Cython/Build/Tests/TestCythonizeArgsParser.py +480 -0
  11. Cython/Build/Tests/TestDependencies.py +133 -0
  12. Cython/Build/Tests/TestInline.py +177 -0
  13. Cython/Build/Tests/TestIpythonMagic.py +303 -0
  14. Cython/Build/Tests/TestRecythonize.py +212 -0
  15. Cython/Build/Tests/TestStripLiterals.py +155 -0
  16. Cython/Build/Tests/__init__.py +1 -0
  17. Cython/Build/__init__.py +11 -0
  18. Cython/CodeWriter.py +825 -0
  19. Cython/Compiler/AnalysedTreeTransforms.py +97 -0
  20. Cython/Compiler/Annotate.py +328 -0
  21. Cython/Compiler/AutoDocTransforms.py +320 -0
  22. Cython/Compiler/Buffer.py +679 -0
  23. Cython/Compiler/Builtin.py +1102 -0
  24. Cython/Compiler/CmdLine.py +373 -0
  25. Cython/Compiler/Code.cp315-win_amd64.pyd +0 -0
  26. Cython/Compiler/Code.pxd +154 -0
  27. Cython/Compiler/Code.py +3760 -0
  28. Cython/Compiler/CodeGeneration.py +33 -0
  29. Cython/Compiler/CythonScope.py +208 -0
  30. Cython/Compiler/Dataclass.py +890 -0
  31. Cython/Compiler/DebugFlags.py +24 -0
  32. Cython/Compiler/Errors.py +310 -0
  33. Cython/Compiler/ExprNodes.py +16273 -0
  34. Cython/Compiler/FlowControl.cp315-win_amd64.pyd +0 -0
  35. Cython/Compiler/FlowControl.pxd +112 -0
  36. Cython/Compiler/FlowControl.py +1573 -0
  37. Cython/Compiler/FusedNode.cp315-win_amd64.pyd +0 -0
  38. Cython/Compiler/FusedNode.py +978 -0
  39. Cython/Compiler/Future.py +16 -0
  40. Cython/Compiler/Interpreter.py +57 -0
  41. Cython/Compiler/Lexicon.py +422 -0
  42. Cython/Compiler/LineTable.cp315-win_amd64.pyd +0 -0
  43. Cython/Compiler/LineTable.py +114 -0
  44. Cython/Compiler/Main.py +856 -0
  45. Cython/Compiler/MatchCaseNodes.py +2200 -0
  46. Cython/Compiler/MemoryView.py +930 -0
  47. Cython/Compiler/ModuleNode.py +4548 -0
  48. Cython/Compiler/Naming.py +370 -0
  49. Cython/Compiler/Nodes.py +11304 -0
  50. Cython/Compiler/Optimize.py +5564 -0
  51. Cython/Compiler/Options.py +840 -0
  52. Cython/Compiler/ParseTreeTransforms.pxd +80 -0
  53. Cython/Compiler/ParseTreeTransforms.py +4808 -0
  54. Cython/Compiler/Parsing.cp315-win_amd64.pyd +0 -0
  55. Cython/Compiler/Parsing.pxd +9 -0
  56. Cython/Compiler/Parsing.py +4809 -0
  57. Cython/Compiler/Pipeline.py +439 -0
  58. Cython/Compiler/PyrexTypes.py +6588 -0
  59. Cython/Compiler/Pythran.py +232 -0
  60. Cython/Compiler/Scanning.cp315-win_amd64.pyd +0 -0
  61. Cython/Compiler/Scanning.pxd +70 -0
  62. Cython/Compiler/Scanning.py +720 -0
  63. Cython/Compiler/StringEncoding.cp315-win_amd64.pyd +0 -0
  64. Cython/Compiler/StringEncoding.py +354 -0
  65. Cython/Compiler/Symtab.py +3121 -0
  66. Cython/Compiler/Tests/TestBuffer.py +105 -0
  67. Cython/Compiler/Tests/TestBuiltin.py +196 -0
  68. Cython/Compiler/Tests/TestCmdLine.py +652 -0
  69. Cython/Compiler/Tests/TestCode.py +145 -0
  70. Cython/Compiler/Tests/TestFlowControl.py +65 -0
  71. Cython/Compiler/Tests/TestGrammar.py +202 -0
  72. Cython/Compiler/Tests/TestMemView.py +71 -0
  73. Cython/Compiler/Tests/TestParseTreeTransforms.py +285 -0
  74. Cython/Compiler/Tests/TestScanning.py +132 -0
  75. Cython/Compiler/Tests/TestSignatureMatching.py +73 -0
  76. Cython/Compiler/Tests/TestStringEncoding.py +20 -0
  77. Cython/Compiler/Tests/TestTreeFragment.py +63 -0
  78. Cython/Compiler/Tests/TestTreePath.py +103 -0
  79. Cython/Compiler/Tests/TestTypes.py +119 -0
  80. Cython/Compiler/Tests/TestUtilityLoad.py +112 -0
  81. Cython/Compiler/Tests/TestVisitor.py +119 -0
  82. Cython/Compiler/Tests/Utils.py +36 -0
  83. Cython/Compiler/Tests/__init__.py +1 -0
  84. Cython/Compiler/TreeFragment.py +279 -0
  85. Cython/Compiler/TreePath.py +303 -0
  86. Cython/Compiler/TypeInference.py +611 -0
  87. Cython/Compiler/TypeSlots.py +1329 -0
  88. Cython/Compiler/UFuncs.py +317 -0
  89. Cython/Compiler/UtilNodes.py +389 -0
  90. Cython/Compiler/UtilityCode.py +354 -0
  91. Cython/Compiler/Version.py +8 -0
  92. Cython/Compiler/Visitor.cp315-win_amd64.pyd +0 -0
  93. Cython/Compiler/Visitor.pxd +52 -0
  94. Cython/Compiler/Visitor.py +914 -0
  95. Cython/Compiler/__init__.py +1 -0
  96. Cython/Coverage.py +448 -0
  97. Cython/Debugger/Cygdb.py +214 -0
  98. Cython/Debugger/DebugWriter.py +82 -0
  99. Cython/Debugger/Tests/TestLibCython.py +280 -0
  100. Cython/Debugger/Tests/__init__.py +1 -0
  101. Cython/Debugger/Tests/cfuncs.c +8 -0
  102. Cython/Debugger/Tests/codefile +49 -0
  103. Cython/Debugger/Tests/test_libcython_in_gdb.py +580 -0
  104. Cython/Debugger/Tests/test_libpython_in_gdb.py +90 -0
  105. Cython/Debugger/__init__.py +1 -0
  106. Cython/Debugger/libcython.py +1548 -0
  107. Cython/Debugger/libpython.py +2821 -0
  108. Cython/Debugging.py +20 -0
  109. Cython/Distutils/__init__.py +2 -0
  110. Cython/Distutils/build_ext.py +143 -0
  111. Cython/Distutils/extension.py +96 -0
  112. Cython/Distutils/old_build_ext.py +351 -0
  113. Cython/Includes/cpython/__init__.pxd +173 -0
  114. Cython/Includes/cpython/array.pxd +152 -0
  115. Cython/Includes/cpython/bool.pxd +37 -0
  116. Cython/Includes/cpython/buffer.pxd +112 -0
  117. Cython/Includes/cpython/bytearray.pxd +33 -0
  118. Cython/Includes/cpython/bytes.pxd +200 -0
  119. Cython/Includes/cpython/cellobject.pxd +35 -0
  120. Cython/Includes/cpython/ceval.pxd +8 -0
  121. Cython/Includes/cpython/codecs.pxd +121 -0
  122. Cython/Includes/cpython/complex.pxd +60 -0
  123. Cython/Includes/cpython/contextvars.pxd +145 -0
  124. Cython/Includes/cpython/conversion.pxd +36 -0
  125. Cython/Includes/cpython/datetime.pxd +395 -0
  126. Cython/Includes/cpython/descr.pxd +26 -0
  127. Cython/Includes/cpython/dict.pxd +268 -0
  128. Cython/Includes/cpython/exc.pxd +263 -0
  129. Cython/Includes/cpython/fileobject.pxd +57 -0
  130. Cython/Includes/cpython/float.pxd +56 -0
  131. Cython/Includes/cpython/frozendict.pxd +37 -0
  132. Cython/Includes/cpython/function.pxd +65 -0
  133. Cython/Includes/cpython/genobject.pxd +25 -0
  134. Cython/Includes/cpython/getargs.pxd +12 -0
  135. Cython/Includes/cpython/instance.pxd +25 -0
  136. Cython/Includes/cpython/iterator.pxd +36 -0
  137. Cython/Includes/cpython/iterobject.pxd +24 -0
  138. Cython/Includes/cpython/list.pxd +144 -0
  139. Cython/Includes/cpython/long.pxd +180 -0
  140. Cython/Includes/cpython/longintrepr.pxd +14 -0
  141. Cython/Includes/cpython/mapping.pxd +63 -0
  142. Cython/Includes/cpython/marshal.pxd +66 -0
  143. Cython/Includes/cpython/mem.pxd +120 -0
  144. Cython/Includes/cpython/memoryview.pxd +50 -0
  145. Cython/Includes/cpython/method.pxd +49 -0
  146. Cython/Includes/cpython/module.pxd +208 -0
  147. Cython/Includes/cpython/number.pxd +258 -0
  148. Cython/Includes/cpython/object.pxd +430 -0
  149. Cython/Includes/cpython/pycapsule.pxd +143 -0
  150. Cython/Includes/cpython/pylifecycle.pxd +68 -0
  151. Cython/Includes/cpython/pyport.pxd +8 -0
  152. Cython/Includes/cpython/pystate.pxd +95 -0
  153. Cython/Includes/cpython/pythread.pxd +53 -0
  154. Cython/Includes/cpython/ref.pxd +141 -0
  155. Cython/Includes/cpython/sentinel.pxd +17 -0
  156. Cython/Includes/cpython/sequence.pxd +134 -0
  157. Cython/Includes/cpython/set.pxd +119 -0
  158. Cython/Includes/cpython/slice.pxd +70 -0
  159. Cython/Includes/cpython/time.pxd +129 -0
  160. Cython/Includes/cpython/tuple.pxd +72 -0
  161. Cython/Includes/cpython/type.pxd +146 -0
  162. Cython/Includes/cpython/unicode.pxd +639 -0
  163. Cython/Includes/cpython/version.pxd +32 -0
  164. Cython/Includes/cpython/weakref.pxd +78 -0
  165. Cython/Includes/libc/__init__.pxd +1 -0
  166. Cython/Includes/libc/complex.pxd +35 -0
  167. Cython/Includes/libc/errno.pxd +127 -0
  168. Cython/Includes/libc/float.pxd +43 -0
  169. Cython/Includes/libc/limits.pxd +28 -0
  170. Cython/Includes/libc/locale.pxd +46 -0
  171. Cython/Includes/libc/math.pxd +209 -0
  172. Cython/Includes/libc/setjmp.pxd +10 -0
  173. Cython/Includes/libc/signal.pxd +64 -0
  174. Cython/Includes/libc/stddef.pxd +9 -0
  175. Cython/Includes/libc/stdint.pxd +105 -0
  176. Cython/Includes/libc/stdio.pxd +80 -0
  177. Cython/Includes/libc/stdlib.pxd +72 -0
  178. Cython/Includes/libc/string.pxd +50 -0
  179. Cython/Includes/libc/threads.pxd +234 -0
  180. Cython/Includes/libc/time.pxd +52 -0
  181. Cython/Includes/libcpp/__init__.pxd +4 -0
  182. Cython/Includes/libcpp/algorithm.pxd +320 -0
  183. Cython/Includes/libcpp/any.pxd +16 -0
  184. Cython/Includes/libcpp/atomic.pxd +59 -0
  185. Cython/Includes/libcpp/barrier.pxd +22 -0
  186. Cython/Includes/libcpp/bit.pxd +29 -0
  187. Cython/Includes/libcpp/cast.pxd +12 -0
  188. Cython/Includes/libcpp/cmath.pxd +518 -0
  189. Cython/Includes/libcpp/complex.pxd +106 -0
  190. Cython/Includes/libcpp/condition_variable.pxd +322 -0
  191. Cython/Includes/libcpp/deque.pxd +165 -0
  192. Cython/Includes/libcpp/exception.pxd +216 -0
  193. Cython/Includes/libcpp/execution.pxd +15 -0
  194. Cython/Includes/libcpp/forward_list.pxd +63 -0
  195. Cython/Includes/libcpp/functional.pxd +26 -0
  196. Cython/Includes/libcpp/future.pxd +103 -0
  197. Cython/Includes/libcpp/iterator.pxd +34 -0
  198. Cython/Includes/libcpp/latch.pxd +17 -0
  199. Cython/Includes/libcpp/limits.pxd +61 -0
  200. Cython/Includes/libcpp/list.pxd +117 -0
  201. Cython/Includes/libcpp/map.pxd +252 -0
  202. Cython/Includes/libcpp/memory.pxd +115 -0
  203. Cython/Includes/libcpp/mutex.pxd +387 -0
  204. Cython/Includes/libcpp/numbers.pxd +15 -0
  205. Cython/Includes/libcpp/numeric.pxd +131 -0
  206. Cython/Includes/libcpp/optional.pxd +34 -0
  207. Cython/Includes/libcpp/pair.pxd +1 -0
  208. Cython/Includes/libcpp/queue.pxd +25 -0
  209. Cython/Includes/libcpp/random.pxd +166 -0
  210. Cython/Includes/libcpp/semaphore.pxd +43 -0
  211. Cython/Includes/libcpp/set.pxd +228 -0
  212. Cython/Includes/libcpp/shared_mutex.pxd +96 -0
  213. Cython/Includes/libcpp/span.pxd +87 -0
  214. Cython/Includes/libcpp/stack.pxd +11 -0
  215. Cython/Includes/libcpp/stop_token.pxd +117 -0
  216. Cython/Includes/libcpp/string.pxd +355 -0
  217. Cython/Includes/libcpp/string_view.pxd +183 -0
  218. Cython/Includes/libcpp/typeindex.pxd +15 -0
  219. Cython/Includes/libcpp/typeinfo.pxd +10 -0
  220. Cython/Includes/libcpp/unordered_map.pxd +193 -0
  221. Cython/Includes/libcpp/unordered_set.pxd +152 -0
  222. Cython/Includes/libcpp/utility.pxd +30 -0
  223. Cython/Includes/libcpp/vector.pxd +186 -0
  224. Cython/Includes/numpy/math.pxd +150 -0
  225. Cython/Includes/openmp.pxd +50 -0
  226. Cython/Includes/posix/__init__.pxd +1 -0
  227. Cython/Includes/posix/dlfcn.pxd +14 -0
  228. Cython/Includes/posix/fcntl.pxd +86 -0
  229. Cython/Includes/posix/ioctl.pxd +4 -0
  230. Cython/Includes/posix/mman.pxd +101 -0
  231. Cython/Includes/posix/resource.pxd +57 -0
  232. Cython/Includes/posix/select.pxd +21 -0
  233. Cython/Includes/posix/signal.pxd +73 -0
  234. Cython/Includes/posix/stat.pxd +98 -0
  235. Cython/Includes/posix/stdio.pxd +37 -0
  236. Cython/Includes/posix/stdlib.pxd +29 -0
  237. Cython/Includes/posix/strings.pxd +9 -0
  238. Cython/Includes/posix/time.pxd +71 -0
  239. Cython/Includes/posix/types.pxd +30 -0
  240. Cython/Includes/posix/uio.pxd +26 -0
  241. Cython/Includes/posix/unistd.pxd +271 -0
  242. Cython/Includes/posix/wait.pxd +38 -0
  243. Cython/LZSS.cp315-win_amd64.pyd +0 -0
  244. Cython/LZSS.py +184 -0
  245. Cython/Plex/Actions.cp315-win_amd64.pyd +0 -0
  246. Cython/Plex/Actions.pxd +24 -0
  247. Cython/Plex/Actions.py +119 -0
  248. Cython/Plex/DFA.cp315-win_amd64.pyd +0 -0
  249. Cython/Plex/DFA.pxd +14 -0
  250. Cython/Plex/DFA.py +164 -0
  251. Cython/Plex/Errors.py +48 -0
  252. Cython/Plex/Lexicons.py +178 -0
  253. Cython/Plex/Machines.cp315-win_amd64.pyd +0 -0
  254. Cython/Plex/Machines.pxd +36 -0
  255. Cython/Plex/Machines.py +238 -0
  256. Cython/Plex/Regexps.py +535 -0
  257. Cython/Plex/Scanners.cp315-win_amd64.pyd +0 -0
  258. Cython/Plex/Scanners.pxd +45 -0
  259. Cython/Plex/Scanners.py +328 -0
  260. Cython/Plex/Transitions.cp315-win_amd64.pyd +0 -0
  261. Cython/Plex/Transitions.pxd +14 -0
  262. Cython/Plex/Transitions.py +239 -0
  263. Cython/Plex/__init__.py +34 -0
  264. Cython/Runtime/__init__.py +1 -0
  265. Cython/Runtime/refnanny.cp315-win_amd64.pyd +0 -0
  266. Cython/Runtime/refnanny.pyx +237 -0
  267. Cython/Shadow.py +1174 -0
  268. Cython/StringIOTree.cp315-win_amd64.pyd +0 -0
  269. Cython/StringIOTree.py +169 -0
  270. Cython/Tempita/__init__.py +4 -0
  271. Cython/Tempita/_looper.py +154 -0
  272. Cython/Tempita/_tempita.cp315-win_amd64.pyd +0 -0
  273. Cython/Tempita/_tempita.py +1087 -0
  274. Cython/TestUtils.py +472 -0
  275. Cython/Tests/TestCodeWriter.py +128 -0
  276. Cython/Tests/TestCythonUtils.py +202 -0
  277. Cython/Tests/TestJediTyper.py +223 -0
  278. Cython/Tests/TestShadow.py +125 -0
  279. Cython/Tests/TestStringIOTree.py +68 -0
  280. Cython/Tests/TestTestUtils.py +89 -0
  281. Cython/Tests/__init__.py +1 -0
  282. Cython/Tests/xmlrunner.py +390 -0
  283. Cython/Utility/AsyncGen.c +1152 -0
  284. Cython/Utility/Buffer.c +866 -0
  285. Cython/Utility/BufferFormatFromTypeInfo.pxd +2 -0
  286. Cython/Utility/Builtins.c +1068 -0
  287. Cython/Utility/CConvert.pyx +153 -0
  288. Cython/Utility/CMath.c +104 -0
  289. Cython/Utility/CommonStructures.c +244 -0
  290. Cython/Utility/Complex.c +378 -0
  291. Cython/Utility/Coroutine.c +2344 -0
  292. Cython/Utility/CpdefEnums.pyx +119 -0
  293. Cython/Utility/CppConvert.pyx +282 -0
  294. Cython/Utility/CppSupport.cpp +151 -0
  295. Cython/Utility/CythonFunction.c +2185 -0
  296. Cython/Utility/Dataclasses.c +101 -0
  297. Cython/Utility/Embed.c +129 -0
  298. Cython/Utility/Exceptions.c +1331 -0
  299. Cython/Utility/Exceptions_Cy.pyx +109 -0
  300. Cython/Utility/ExtensionTypes.c +1199 -0
  301. Cython/Utility/FunctionArguments.c +1052 -0
  302. Cython/Utility/FusedFunction.pyx +44 -0
  303. Cython/Utility/ImportExport.c +972 -0
  304. Cython/Utility/MatchCase.c +981 -0
  305. Cython/Utility/MatchCase_Cy.pyx +12 -0
  306. Cython/Utility/MemoryView.pxd +108 -0
  307. Cython/Utility/MemoryView.pyx +1499 -0
  308. Cython/Utility/MemoryView_C.c +1056 -0
  309. Cython/Utility/ModuleSetupCode.c +3319 -0
  310. Cython/Utility/NumpyImportArray.c +46 -0
  311. Cython/Utility/ObjectHandling.c +3404 -0
  312. Cython/Utility/Optimize.c +2564 -0
  313. Cython/Utility/Overflow.c +378 -0
  314. Cython/Utility/Profile.c +736 -0
  315. Cython/Utility/StringTools.c +1534 -0
  316. Cython/Utility/Synchronization.c +438 -0
  317. Cython/Utility/TString.c +369 -0
  318. Cython/Utility/TestCyUtilityLoader.pyx +8 -0
  319. Cython/Utility/TestCythonScope.pyx +75 -0
  320. Cython/Utility/TestUtilityLoader.c +12 -0
  321. Cython/Utility/TypeConversion.c +1588 -0
  322. Cython/Utility/UFuncs.pyx +50 -0
  323. Cython/Utility/UFuncs_C.c +89 -0
  324. Cython/Utility/__init__.py +28 -0
  325. Cython/Utility/arrayarray.h +172 -0
  326. Cython/Utils.cp315-win_amd64.pyd +0 -0
  327. Cython/Utils.py +680 -0
  328. Cython/__init__.py +12 -0
  329. Cython/_shared.cp315-win_amd64.pyd +0 -0
  330. Cython/py.typed +0 -0
  331. cython-3.3.0.dist-info/METADATA +555 -0
  332. cython-3.3.0.dist-info/RECORD +339 -0
  333. cython-3.3.0.dist-info/WHEEL +5 -0
  334. cython-3.3.0.dist-info/entry_points.txt +4 -0
  335. cython-3.3.0.dist-info/top_level.txt +3 -0
  336. cython.py +29 -0
  337. pyximport/__init__.py +4 -0
  338. pyximport/pyxbuild.py +160 -0
  339. pyximport/pyximport.py +482 -0
@@ -0,0 +1,438 @@
1
+ /////////// Atomics.proto /////////////
2
+ //@proto_block: utility_code_proto_before_types
3
+
4
+ #include <pythread.h>
5
+
6
+ #ifndef CYTHON_ATOMICS
7
+ #define CYTHON_ATOMICS 1
8
+ #endif
9
+ // using CYTHON_ATOMICS as a cdef extern bint in the Cython memoryview code
10
+ // interacts badly with "import *". Therefore, define a helper function-like macro
11
+ #define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS
12
+ #define __PYX_GET_CYTHON_COMPILING_IN_CPYTHON_FREETHREADING() CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
13
+
14
+ #define __pyx_atomic_int_type int
15
+ #define __pyx_nonatomic_int_type int
16
+
17
+ // For standard C/C++ atomics, get the headers first so we have ATOMIC_INT_LOCK_FREE
18
+ // defined when we decide to use them.
19
+ #if CYTHON_ATOMICS && (defined(__STDC_VERSION__) && \
20
+ (__STDC_VERSION__ >= 201112L) && \
21
+ !defined(__STDC_NO_ATOMICS__))
22
+ #include <stdatomic.h>
23
+ #elif CYTHON_ATOMICS && (defined(__cplusplus) && ( \
24
+ (__cplusplus >= 201103L) || \
25
+ (defined(_MSC_VER) && _MSC_VER >= 1700)))
26
+ #include <atomic>
27
+ #endif
28
+
29
+ #if CYTHON_ATOMICS && (defined(__STDC_VERSION__) && \
30
+ (__STDC_VERSION__ >= 201112L) && \
31
+ !defined(__STDC_NO_ATOMICS__) && \
32
+ ATOMIC_INT_LOCK_FREE == 2)
33
+ // C11 atomics are available and ATOMIC_INT_LOCK_FREE is definitely on
34
+ #undef __pyx_atomic_int_type
35
+ #define __pyx_atomic_int_type atomic_int
36
+ #define __pyx_atomic_ptr_type atomic_uintptr_t
37
+ #define __pyx_nonatomic_ptr_type uintptr_t
38
+ #define __pyx_atomic_incr_relaxed(value) atomic_fetch_add_explicit(value, 1, memory_order_relaxed)
39
+ #define __pyx_atomic_incr_acq_rel(value) atomic_fetch_add_explicit(value, 1, memory_order_acq_rel)
40
+ #define __pyx_atomic_decr_acq_rel(value) atomic_fetch_sub_explicit(value, 1, memory_order_acq_rel)
41
+ #define __pyx_atomic_sub(value, arg) atomic_fetch_sub(value, arg)
42
+ #define __pyx_atomic_int_cmp_exchange(value, expected, desired) atomic_compare_exchange_strong(value, expected, desired)
43
+ #define __pyx_atomic_load(value) atomic_load(value)
44
+ #define __pyx_atomic_store(value, new_value) atomic_store(value, new_value)
45
+ #define __pyx_atomic_pointer_load_relaxed(value) atomic_load_explicit(value, memory_order_relaxed)
46
+ #define __pyx_atomic_pointer_load_acquire(value) atomic_load_explicit(value, memory_order_acquire)
47
+ #define __pyx_atomic_pointer_exchange(value, new_value) atomic_exchange(value, (__pyx_nonatomic_ptr_type)new_value)
48
+ #define __pyx_atomic_pointer_cmp_exchange(value, expected, desired) atomic_compare_exchange_strong(value, expected, desired)
49
+ #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER)
50
+ #pragma message ("Using standard C atomics")
51
+ #elif defined(__PYX_DEBUG_ATOMICS)
52
+ #warning "Using standard C atomics"
53
+ #endif
54
+ #elif CYTHON_ATOMICS && (defined(__cplusplus) && ( \
55
+ (__cplusplus >= 201103L) || \
56
+ /*_MSC_VER 1700 is Visual Studio 2012 */ \
57
+ (defined(_MSC_VER) && _MSC_VER >= 1700)) && \
58
+ ATOMIC_INT_LOCK_FREE == 2)
59
+ // C++11 atomics are available and ATOMIC_INT_LOCK_FREE is definitely on
60
+ #undef __pyx_atomic_int_type
61
+ #define __pyx_atomic_int_type std::atomic_int
62
+ #define __pyx_atomic_ptr_type std::atomic_uintptr_t
63
+ #define __pyx_nonatomic_ptr_type uintptr_t
64
+ #define __pyx_atomic_incr_relaxed(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_relaxed)
65
+ #define __pyx_atomic_incr_acq_rel(value) std::atomic_fetch_add_explicit(value, 1, std::memory_order_acq_rel)
66
+ #define __pyx_atomic_decr_acq_rel(value) std::atomic_fetch_sub_explicit(value, 1, std::memory_order_acq_rel)
67
+ #define __pyx_atomic_sub(value, arg) std::atomic_fetch_sub(value, arg)
68
+ #define __pyx_atomic_int_cmp_exchange(value, expected, desired) std::atomic_compare_exchange_strong(value, expected, desired)
69
+ #define __pyx_atomic_load(value) std::atomic_load(value)
70
+ #define __pyx_atomic_store(value, new_value) std::atomic_store(value, new_value)
71
+ #define __pyx_atomic_pointer_load_relaxed(value) std::atomic_load_explicit(value, std::memory_order_relaxed)
72
+ #define __pyx_atomic_pointer_load_acquire(value) std::atomic_load_explicit(value, std::memory_order_acquire)
73
+ #define __pyx_atomic_pointer_exchange(value, new_value) std::atomic_exchange(value, (__pyx_nonatomic_ptr_type)new_value)
74
+ #define __pyx_atomic_pointer_cmp_exchange(value, expected, desired) std::atomic_compare_exchange_strong(value, expected, desired)
75
+
76
+ #if defined(__PYX_DEBUG_ATOMICS) && defined(_MSC_VER)
77
+ #pragma message ("Using standard C++ atomics")
78
+ #elif defined(__PYX_DEBUG_ATOMICS)
79
+ #warning "Using standard C++ atomics"
80
+ #endif
81
+ #elif CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 && \
82
+ (__GNUC_MINOR__ > 1 || \
83
+ (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2))))
84
+ /* gcc >= 4.1.2 */
85
+ #define __pyx_atomic_ptr_type void*
86
+ #define __pyx_nonatomic_ptr_type void*
87
+ #define __pyx_atomic_incr_relaxed(value) __sync_fetch_and_add(value, 1)
88
+ #define __pyx_atomic_incr_acq_rel(value) __sync_fetch_and_add(value, 1)
89
+ #define __pyx_atomic_decr_acq_rel(value) __sync_fetch_and_sub(value, 1)
90
+ #define __pyx_atomic_sub(value, arg) __sync_fetch_and_sub(value, arg)
91
+ static CYTHON_INLINE int __pyx_atomic_int_cmp_exchange(__pyx_atomic_int_type* value, __pyx_nonatomic_int_type* expected, __pyx_nonatomic_int_type desired) {
92
+ __pyx_nonatomic_int_type old = __sync_val_compare_and_swap(value, *expected, desired);
93
+ int result = old == *expected;
94
+ *expected = old;
95
+ return result;
96
+ }
97
+ // the legacy gcc sync builtins don't seem to have plain "load" or "store".
98
+ #define __pyx_atomic_load(value) __sync_fetch_and_add(value, 0)
99
+ #define __pyx_atomic_store(value, new_value) __sync_lock_test_and_set(value, new_value)
100
+ #define __pyx_atomic_pointer_load_relaxed(value) __sync_fetch_and_add(value, 0)
101
+ #define __pyx_atomic_pointer_load_acquire(value) __sync_fetch_and_add(value, 0)
102
+ #define __pyx_atomic_pointer_exchange(value, new_value) __sync_lock_test_and_set(value, (__pyx_atomic_ptr_type)new_value)
103
+ static CYTHON_INLINE int __pyx_atomic_pointer_cmp_exchange(__pyx_atomic_ptr_type* value, __pyx_nonatomic_ptr_type* expected, __pyx_nonatomic_ptr_type desired) {
104
+ __pyx_nonatomic_ptr_type old = __sync_val_compare_and_swap(value, *expected, desired);
105
+ int result = old == *expected;
106
+ *expected = old;
107
+ return result;
108
+ }
109
+
110
+ #ifdef __PYX_DEBUG_ATOMICS
111
+ #warning "Using GNU atomics"
112
+ #endif
113
+ #elif CYTHON_ATOMICS && defined(_MSC_VER)
114
+ /* msvc */
115
+ #include <intrin.h>
116
+ #undef __pyx_atomic_int_type
117
+ #define __pyx_atomic_int_type long
118
+ #define __pyx_atomic_ptr_type void*
119
+ #undef __pyx_nonatomic_int_type
120
+ #define __pyx_nonatomic_int_type long
121
+ #define __pyx_nonatomic_ptr_type void*
122
+ #pragma intrinsic (_InterlockedExchangeAdd, _InterlockedExchange, _InterlockedCompareExchange, _InterlockedCompareExchangePointer, _InterlockedExchangePointer)
123
+ #define __pyx_atomic_incr_relaxed(value) _InterlockedExchangeAdd(value, 1)
124
+ #define __pyx_atomic_incr_acq_rel(value) _InterlockedExchangeAdd(value, 1)
125
+ #define __pyx_atomic_decr_acq_rel(value) _InterlockedExchangeAdd(value, -1)
126
+ #define __pyx_atomic_sub(value, arg) _InterlockedExchangeAdd(value, -arg)
127
+ static CYTHON_INLINE int __pyx_atomic_int_cmp_exchange(__pyx_atomic_int_type* value, __pyx_nonatomic_int_type* expected, __pyx_nonatomic_int_type desired) {
128
+ __pyx_nonatomic_int_type old = _InterlockedCompareExchange(value, desired, *expected);
129
+ int result = old == *expected;
130
+ *expected = old;
131
+ return result;
132
+ }
133
+ #define __pyx_atomic_load(value) _InterlockedExchangeAdd(value, 0)
134
+ #define __pyx_atomic_store(value, new_value) _InterlockedExchange(value, new_value)
135
+ // Microsoft says that simple reads are guaranteed to be atomic.
136
+ // https://learn.microsoft.com/en-gb/windows/win32/sync/interlocked-variable-access?redirectedfrom=MSDN
137
+ // The volatile cast is what CPython does.
138
+ #define __pyx_atomic_pointer_load_relaxed(value) *(void * volatile *)value
139
+ // compare/exchange is probably overkill nonsense, but plain "load" intrinsics are hard to get.
140
+ #define __pyx_atomic_pointer_load_acquire(value) _InterlockedCompareExchangePointer(value, 0, 0)
141
+ #define __pyx_atomic_pointer_exchange(value, new_value) _InterlockedExchangePointer(value, (__pyx_atomic_ptr_type)new_value)
142
+ static CYTHON_INLINE int __pyx_atomic_pointer_cmp_exchange(__pyx_atomic_ptr_type* value, __pyx_nonatomic_ptr_type* expected, __pyx_nonatomic_ptr_type desired) {
143
+ __pyx_atomic_ptr_type old = _InterlockedCompareExchangePointer(value, desired, *expected);
144
+ int result = old == *expected;
145
+ *expected = old;
146
+ return result;
147
+ }
148
+
149
+ #ifdef __PYX_DEBUG_ATOMICS
150
+ #pragma message ("Using MSVC atomics")
151
+ #endif
152
+ #else
153
+ #undef CYTHON_ATOMICS
154
+ #define CYTHON_ATOMICS 0
155
+
156
+ #ifdef __PYX_DEBUG_ATOMICS
157
+ #warning "Not using atomics"
158
+ #endif
159
+ #endif
160
+
161
+
162
+ /////////////////////// CriticalSectionsDefinition.proto /////////////////////
163
+ //@proto_block: utility_code_proto_before_types
164
+
165
+ #if !CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
166
+ #define __Pyx_PyCriticalSection void*
167
+ #define __Pyx_PyCriticalSection2 void*
168
+ #define __Pyx_PyCriticalSection_End(cs)
169
+ #define __Pyx_PyCriticalSection2_End(cs)
170
+ #else
171
+ #define __Pyx_PyCriticalSection PyCriticalSection
172
+ #define __Pyx_PyCriticalSection2 PyCriticalSection2
173
+ #define __Pyx_PyCriticalSection_End PyCriticalSection_End
174
+ #define __Pyx_PyCriticalSection2_End PyCriticalSection2_End
175
+ #endif
176
+
177
+
178
+ /////////////////////// CriticalSections.proto /////////////////////
179
+ //@proto_block: utility_code_proto_before_types
180
+ //@requires: CriticalSectionsDefinition
181
+
182
+ #if !CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
183
+ #define __Pyx_PyCriticalSection_Begin(cs, arg) (void)(cs)
184
+ #define __Pyx_PyCriticalSection2_Begin(cs, arg1, arg2) (void)(cs)
185
+ #else
186
+ #define __Pyx_PyCriticalSection_Begin PyCriticalSection_Begin
187
+ #define __Pyx_PyCriticalSection2_Begin PyCriticalSection2_Begin
188
+ #endif
189
+
190
+ #if PY_VERSION_HEX < 0x030d0000 || CYTHON_COMPILING_IN_LIMITED_API
191
+ #define __Pyx_BEGIN_CRITICAL_SECTION(o) {
192
+ #define __Pyx_END_CRITICAL_SECTION() }
193
+ #else
194
+ #define __Pyx_BEGIN_CRITICAL_SECTION Py_BEGIN_CRITICAL_SECTION
195
+ #define __Pyx_END_CRITICAL_SECTION Py_END_CRITICAL_SECTION
196
+ #endif
197
+
198
+
199
+ /////////////////////// CriticalSectionsMutex.proto /////////////////////
200
+ //@requires: CriticalSectionsDefinition
201
+
202
+ #if !CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
203
+ #define __Pyx_PyCriticalSection_BeginMutex(cs, arg) (void)(cs), (void)(arg)
204
+ #define __Pyx_PyCriticalSection2_BeginMutex(cs, arg1, arg2) (void)(cs), (void)(arg1), (void)(arg2)
205
+
206
+ #elif PY_VERSION_HEX < 0x030e00C1
207
+ #ifndef Py_BUILD_CORE
208
+ #define Py_BUILD_CORE
209
+ #endif
210
+ #include "internal/pycore_critical_section.h"
211
+ #define __Pyx_PyCriticalSection_BeginMutex _PyCriticalSection_BeginMutex
212
+ #define __Pyx_PyCriticalSection2_BeginMutex _PyCriticalSection2_BeginMutex
213
+
214
+ #else
215
+ #define __Pyx_PyCriticalSection_BeginMutex PyCriticalSection_BeginMutex
216
+ #define __Pyx_PyCriticalSection2_BeginMutex PyCriticalSection2_BeginMutex
217
+ #endif
218
+
219
+
220
+ ////////////////////// PyThreadTypeLockDecl.proto //////////
221
+ //@proto_block: utility_code_proto_before_types
222
+
223
+ // This lock type always uses PyThread_type_lock. The main reason
224
+ // to use it is if you are using the Limited API and want to
225
+ // share locks between modules.
226
+
227
+ #ifndef __PYX_HAVE_PYX_THREAD_TYPE_LOCK_DECL
228
+ #define __PYX_HAVE_PYX_THREAD_TYPE_LOCK_DECL
229
+ #define __Pyx_Locks_PyThreadTypeLock PyThread_type_lock
230
+ #define __Pyx_Locks_PyThreadTypeLock_DECL NULL
231
+ #endif
232
+
233
+
234
+ ////////////////////// PyThreadTypeLock.proto //////////////////
235
+
236
+ #define __Pyx_Locks_PyThreadTypeLock_Init(l) l = PyThread_allocate_lock()
237
+ #define __Pyx_Locks_PyThreadTypeLock_Delete(l) PyThread_free_lock(l)
238
+ #define __Pyx_Locks_PyThreadTypeLock_LockNogil(l) (void)PyThread_acquire_lock(l, WAIT_LOCK)
239
+ #define __Pyx_Locks_PyThreadTypeLock_Unlock(l) PyThread_release_lock(l)
240
+ static CYTHON_INLINE int __Pyx_Locks_PyThreadTypeLock_CanCheckLocked(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
241
+ static int __Pyx__Locks_PyThreadTypeLock_Locked(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
242
+ static void __Pyx__Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
243
+ static void __Pyx__Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock); /* proto */
244
+ // CYTHON_INLINE because these may be unused
245
+ static CYTHON_INLINE void __Pyx_Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock) {
246
+ __Pyx__Locks_PyThreadTypeLock_Lock(lock);
247
+ }
248
+ static CYTHON_INLINE void __Pyx_Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock) {
249
+ __Pyx__Locks_PyThreadTypeLock_LockGil(lock);
250
+ }
251
+ static CYTHON_INLINE int __Pyx_Locks_PyThreadTypeLock_Locked(__Pyx_Locks_PyThreadTypeLock lock) {
252
+ return __Pyx__Locks_PyThreadTypeLock_Locked(lock);
253
+ }
254
+
255
+
256
+ ////////////////////// PyThreadTypeLock ////////////////
257
+ //@requires: PyThreadTypeLockDecl
258
+
259
+ #if CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM < 0x07031400
260
+ #define PY_LOCK_ACQUIRED 1
261
+ #endif
262
+
263
+ static void __Pyx__Locks_PyThreadTypeLock_LockGil_spin(__Pyx_Locks_PyThreadTypeLock lock) {
264
+ while (1) {
265
+ int res;
266
+ Py_BEGIN_ALLOW_THREADS
267
+ res = PyThread_acquire_lock(lock, WAIT_LOCK);
268
+ // Wait on the GIL while holding the lock. But importantly we never do the inverse
269
+ // and wait on the lock while holding the GIL.
270
+ Py_END_ALLOW_THREADS
271
+ if (likely(res == PY_LOCK_ACQUIRED)) {
272
+ // All good - we got the lock
273
+ return;
274
+ }
275
+ }
276
+ }
277
+
278
+ static CYTHON_INLINE void __Pyx__Locks_PyThreadTypeLock_LockGil(__Pyx_Locks_PyThreadTypeLock lock) {
279
+ #if !CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07031400
280
+ // This is possibly dubious - it makes things faster in the uncontended case, but
281
+ // in the heavily-contended case it makes it more likely that one thread will dominate.
282
+ if (likely(PyThread_acquire_lock_timed(lock, 0, 0) == PY_LOCK_ACQUIRED)) {
283
+ // All good - we got the lock
284
+ return;
285
+ }
286
+ #endif
287
+ __Pyx__Locks_PyThreadTypeLock_LockGil_spin(lock);
288
+ }
289
+
290
+ static void __Pyx__Locks_PyThreadTypeLock_Lock(__Pyx_Locks_PyThreadTypeLock lock) {
291
+ int has_gil = 0;
292
+ #if CYTHON_COMPILING_IN_LIMITED_API
293
+ if (__PYX_LIMITED_VERSION_HEX >= 0x030d0000 || __Pyx_get_runtime_version() >= 0x030d0000) {
294
+ // Swap the existing thread state to see if we had the GIL.
295
+ // Requires re-acquiring the thread state if we had it, but no-op if we didn't.
296
+ PyThreadState *tstate = PyThreadState_Swap(NULL);
297
+ has_gil = tstate != NULL;
298
+ if (has_gil)
299
+ PyThreadState_Swap(tstate);
300
+ } else {
301
+ // We can't tell if we have the GIL. Therefore make sure we do have it
302
+ // and then restore whatever state was there before.
303
+ PyGILState_STATE state = PyGILState_Ensure();
304
+ __Pyx_Locks_PyThreadTypeLock_LockNogil(lock);
305
+ PyGILState_Release(state);
306
+ return;
307
+ }
308
+ #elif CYTHON_COMPILING_IN_PYPY || PY_VERSION_HEX < 0x030C0000
309
+ has_gil = PyGILState_Check();
310
+ #elif PY_VERSION_HEX < 0x030d0000
311
+ has_gil = _PyThreadState_UncheckedGet() != NULL;
312
+ #else
313
+ has_gil = PyThreadState_GetUnchecked() != NULL;
314
+ #endif
315
+ if (has_gil) {
316
+ __Pyx_Locks_PyThreadTypeLock_LockGil(lock);
317
+ } else {
318
+ __Pyx_Locks_PyThreadTypeLock_LockNogil(lock);
319
+ }
320
+ }
321
+
322
+ static CYTHON_INLINE int __Pyx_Locks_PyThreadTypeLock_CanCheckLocked(__Pyx_Locks_PyThreadTypeLock lock) {
323
+ CYTHON_UNUSED_VAR(lock);
324
+ // PyThread_type_lock supports checking lock status via try-acquire
325
+ return 1;
326
+ }
327
+
328
+ static int __Pyx__Locks_PyThreadTypeLock_Locked(__Pyx_Locks_PyThreadTypeLock lock) {
329
+ // Check if lock is held by attempting a non-blocking acquire.
330
+ // If acquire succeeds, the lock was not held, so release it and return 0.
331
+ // If acquire fails, the lock is held (by this or another thread), return 1.
332
+ // This works for both "other thread locked" and "this thread locked" cases.
333
+ if (PyThread_acquire_lock(lock, NOWAIT_LOCK)) {
334
+ PyThread_release_lock(lock);
335
+ return 0; // Lock was not held
336
+ }
337
+ return 1; // Lock is held
338
+ }
339
+
340
+
341
+ ////////////////////// PyMutexDecl.proto ////////////////////
342
+ //@proto_block: utility_code_proto_before_types
343
+ //@requires: PyThreadTypeLockDecl
344
+
345
+ // We support two implementations - a Py3.13+ version using PyMutex and
346
+ // an older version using PyThread_type_lock.
347
+ // In principle it'd be possible to also use things like c++ std::mutex
348
+ // (in the absence of PyMutex). I've decided against this for ABI reasons.
349
+
350
+ // With the Limited API There is an ABI problem - if a lock is ever
351
+ // shared between two modules then they must agree on the definition,
352
+ // and so Limited API sharing with regular API will disagree.
353
+
354
+ // Therefore I explicitly ban Limited API modules from using
355
+ // CythonLockType in a public way. However, they can use
356
+ // CythonCompatibleLockType which will always be PyThread_type_lock.
357
+
358
+ #ifndef __PYX_HAVE_PYX_PYMUTEX_DECL
359
+ #define __PYX_HAVE_PYX_PYMUTEX_DECL
360
+ // Not CYTHON_COMPILING_IN_LIMITED_API because this code may be in
361
+ // headers where that isn't available
362
+ #if PY_VERSION_HEX > 0x030d0000 && !defined(Py_LIMITED_API)
363
+ #define __Pyx_Locks_PyMutex PyMutex
364
+ #define __Pyx_Locks_PyMutex_DECL {0}
365
+ #else
366
+ #define __Pyx_Locks_PyMutex __Pyx_Locks_PyThreadTypeLock
367
+ #define __Pyx_Locks_PyMutex_DECL __Pyx_Locks_PyThreadTypeLock_DECL
368
+ #endif
369
+ #endif
370
+
371
+
372
+ ////////////////// PyMutex.proto ///////////////////////////
373
+ //@requires: PyThreadTypeLock
374
+ //@requires: PyMutexDecl
375
+
376
+ #if PY_VERSION_HEX > 0x030d0000 && !CYTHON_COMPILING_IN_LIMITED_API
377
+ #define __Pyx_Locks_PyMutex_Init(l) (void)(l)
378
+ #define __Pyx_Locks_PyMutex_Delete(l) (void)(l)
379
+ // Py_Mutex takes care of all GIL handling itself
380
+ #define __Pyx_Locks_PyMutex_Lock(l) PyMutex_Lock(&l)
381
+ #define __Pyx_Locks_PyMutex_Unlock(l) PyMutex_Unlock(&l)
382
+ #define __Pyx_Locks_PyMutex_LockGil(l) PyMutex_Lock(&l)
383
+ #define __Pyx_Locks_PyMutex_LockNogil(l) PyMutex_Lock(&l)
384
+
385
+ // For Python 3.13+, check if PyMutex_IsLocked is available
386
+ #if PY_VERSION_HEX >= 0x030e00C1
387
+ // Python 3.14+ has PyMutex_IsLocked API
388
+ #define __Pyx_Locks_PyMutex_Locked(l) PyMutex_IsLocked(&(l))
389
+ #else
390
+ // Python 3.13: Use atomic read of lock bits as per CPython's cpython/lock.h
391
+ // _Py_LOCKED is defined in Include/cpython/lock.h
392
+ #define __Pyx_Locks_PyMutex_Locked(l) \
393
+ ((int)(_Py_atomic_load_uint8_relaxed(&(l)._bits) & _Py_LOCKED))
394
+ #endif
395
+
396
+ // locked() is available on Python 3.13+ (atomic read) and older versions (try-acquire fallback)
397
+ #define __Pyx_Locks_PyMutex_CanCheckLocked(l) (CYTHON_UNUSED_VAR(l), 1)
398
+
399
+ #else
400
+
401
+ #define __Pyx_Locks_PyMutex_Init(l) __Pyx_Locks_PyThreadTypeLock_Init(l)
402
+ #define __Pyx_Locks_PyMutex_Delete(l) __Pyx_Locks_PyThreadTypeLock_Delete(l)
403
+ #define __Pyx_Locks_PyMutex_Lock(l) __Pyx_Locks_PyThreadTypeLock_Lock(l)
404
+ #define __Pyx_Locks_PyMutex_Unlock(l) __Pyx_Locks_PyThreadTypeLock_Unlock(l)
405
+ #define __Pyx_Locks_PyMutex_LockGil(l) __Pyx_Locks_PyThreadTypeLock_LockGil(l)
406
+ #define __Pyx_Locks_PyMutex_LockNogil(l) __Pyx_Locks_PyThreadTypeLock_LockNogil(l)
407
+ #define __Pyx_Locks_PyMutex_Locked(l) __Pyx_Locks_PyThreadTypeLock_Locked(l)
408
+ #define __Pyx_Locks_PyMutex_CanCheckLocked(l) __Pyx_Locks_PyThreadTypeLock_CanCheckLocked(l)
409
+
410
+ #endif
411
+
412
+
413
+ //////////////////////////// CythonPyMutexPublicCheck ///////////////////////////////////
414
+
415
+ #ifndef CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY
416
+ #define CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY 0
417
+ #endif
418
+
419
+ /* CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY is left for an advanced user who
420
+ * wants to disable this error. However, please don't complain to us when your code
421
+ * breaks. Whatever you do, the Limited API version always uses the "compatible" lock
422
+ * type anyway, so you're only saving yourself a few extra characters typing.
423
+ */
424
+ #if CYTHON_COMPILING_IN_LIMITED_API && !CYTHON_UNSAFE_IGNORE_PYMUTEX_ABI_COMPATIBILITY
425
+ #error cython.pymutex is shared between multiple modules in the Limited API.\
426
+ This is intentionally disabled because it is not possible for regular API and Limited API\
427
+ modules to be compatible with each other. Use cython.pythread_type_lock for a safe\
428
+ alternative lock type instead.
429
+ #endif
430
+
431
+
432
+ ////////////////////////// SharedInFreeThreading.proto //////////////////
433
+
434
+ #if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
435
+ #define __Pyx_shared_in_cpython_freethreading(x) shared(x)
436
+ #else
437
+ #define __Pyx_shared_in_cpython_freethreading(x)
438
+ #endif