-
-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathfree-threading-extensions.po
More file actions
726 lines (614 loc) · 24.7 KB
/
Copy pathfree-threading-extensions.po
File metadata and controls
726 lines (614 loc) · 24.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2001 Python Software Foundation
# This file is distributed under the same license as the Python package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# python-doc bot, 2025
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Python 3.15\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-23 14:16+0000\n"
"PO-Revision-Date: 2025-09-16 00:00+0000\n"
"Last-Translator: python-doc bot, 2025\n"
"Language-Team: Japanese (https://app.transifex.com/python-doc/teams/5390/"
"ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../../howto/free-threading-extensions.rst:7
msgid "C API Extension Support for Free Threading"
msgstr ""
#: ../../howto/free-threading-extensions.rst:9
msgid ""
"Starting with the 3.13 release, CPython has support for running with the :"
"term:`global interpreter lock` (GIL) disabled in a configuration called :"
"term:`free threading`. This document describes how to adapt C API "
"extensions to support free threading."
msgstr ""
#: ../../howto/free-threading-extensions.rst:16
msgid "Identifying the Free-Threaded Build in C"
msgstr ""
#: ../../howto/free-threading-extensions.rst:18
msgid ""
"The CPython C API exposes the ``Py_GIL_DISABLED`` macro: in the free-"
"threaded build it's defined to ``1``, and in the regular build it's not "
"defined. You can use it to enable code that only runs under the free-"
"threaded build::"
msgstr ""
#: ../../howto/free-threading-extensions.rst:22
msgid ""
"#ifdef Py_GIL_DISABLED\n"
"/* code that only runs in the free-threaded build */\n"
"#endif"
msgstr ""
#: ../../howto/free-threading-extensions.rst:28
msgid ""
"On Windows, this macro is not defined automatically, but must be specified "
"to the compiler when building. The :func:`sysconfig.get_config_var` function "
"can be used to determine whether the current running interpreter had the "
"macro defined."
msgstr ""
#: ../../howto/free-threading-extensions.rst:35
msgid "Module Initialization"
msgstr ""
#: ../../howto/free-threading-extensions.rst:37
msgid ""
"Extension modules need to explicitly indicate that they support running with "
"the GIL disabled; otherwise importing the extension will raise a warning and "
"enable the GIL at runtime."
msgstr ""
#: ../../howto/free-threading-extensions.rst:41
msgid ""
"There are two ways to indicate that an extension module supports running "
"with the GIL disabled depending on whether the extension uses multi-phase or "
"single-phase initialization."
msgstr ""
#: ../../howto/free-threading-extensions.rst:46
msgid "Multi-Phase Initialization"
msgstr ""
#: ../../howto/free-threading-extensions.rst:48
msgid ""
"Extensions that use :ref:`multi-phase initialization <multi-phase-"
"initialization>` (functions like :c:func:`PyModuleDef_Init`, :c:func:"
"`PyModExport_* <PyModExport_modulename>` export hook, :c:func:"
"`PyModule_FromSlotsAndSpec`) should add a :c:data:`Py_mod_gil` slot in the "
"module definition. If your extension supports older versions of CPython, you "
"should guard the slot with a :c:data:`PY_VERSION_HEX` check."
msgstr ""
#: ../../howto/free-threading-extensions.rst:58
msgid ""
"static struct PyModuleDef_Slot module_slots[] = {\n"
" ...\n"
"#if PY_VERSION_HEX >= 0x030D0000\n"
" {Py_mod_gil, Py_MOD_GIL_NOT_USED},\n"
"#endif\n"
" {0, NULL}\n"
"};"
msgstr ""
#: ../../howto/free-threading-extensions.rst:68
msgid "Single-Phase Initialization"
msgstr ""
#: ../../howto/free-threading-extensions.rst:70
msgid ""
"Extensions that use legacy :ref:`single-phase initialization <single-phase-"
"initialization>` (that is, :c:func:`PyModule_Create`) should call :c:func:"
"`PyUnstable_Module_SetGIL` to indicate that they support running with the "
"GIL disabled. The function is only defined in the free-threaded build, so "
"you should guard the call with ``#ifdef Py_GIL_DISABLED`` to avoid "
"compilation errors in the regular build."
msgstr ""
#: ../../howto/free-threading-extensions.rst:78
msgid ""
"static struct PyModuleDef moduledef = {\n"
" PyModuleDef_HEAD_INIT,\n"
" ...\n"
"};\n"
"\n"
"PyMODINIT_FUNC\n"
"PyInit_mymodule(void)\n"
"{\n"
" PyObject *m = PyModule_Create(&moduledef);\n"
" if (m == NULL) {\n"
" return NULL;\n"
" }\n"
"#ifdef Py_GIL_DISABLED\n"
" PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);\n"
"#endif\n"
" return m;\n"
"}"
msgstr ""
#: ../../howto/free-threading-extensions.rst:98
msgid "General API Guidelines"
msgstr ""
#: ../../howto/free-threading-extensions.rst:100
msgid "Most of the C API is thread-safe, but there are some exceptions."
msgstr ""
#: ../../howto/free-threading-extensions.rst:102
msgid ""
"**Struct Fields**: Accessing fields in Python C API objects or structs "
"directly is not thread-safe if the field may be concurrently modified."
msgstr ""
#: ../../howto/free-threading-extensions.rst:104
msgid ""
"**Macros**: Accessor macros like :c:macro:`PyList_GET_ITEM`, :c:macro:"
"`PyList_SET_ITEM`, and macros like :c:macro:`PySequence_Fast_GET_SIZE` that "
"use the object returned by :c:func:`PySequence_Fast` do not perform any "
"error checking or locking. These macros are not thread-safe if the container "
"object may be modified concurrently."
msgstr ""
#: ../../howto/free-threading-extensions.rst:110
msgid ""
"**Borrowed References**: C API functions that return :term:`borrowed "
"references <borrowed reference>` may not be thread-safe if the containing "
"object is modified concurrently. See the section on :ref:`borrowed "
"references <borrowed-references>` for more information."
msgstr ""
#: ../../howto/free-threading-extensions.rst:117
msgid "Container Thread Safety"
msgstr ""
#: ../../howto/free-threading-extensions.rst:119
msgid ""
"Containers like :c:struct:`PyListObject`, :c:struct:`PyDictObject`, and :c:"
"struct:`PySetObject` perform internal locking in the free-threaded build. "
"For example, the :c:func:`PyList_Append` will lock the list before appending "
"an item."
msgstr ""
#: ../../howto/free-threading-extensions.rst:127
msgid "``PyDict_Next``"
msgstr ""
#: ../../howto/free-threading-extensions.rst:129
msgid ""
"A notable exception is :c:func:`PyDict_Next`, which does not lock the "
"dictionary. You should use :c:macro:`Py_BEGIN_CRITICAL_SECTION` to protect "
"the dictionary while iterating over it if the dictionary may be concurrently "
"modified::"
msgstr ""
#: ../../howto/free-threading-extensions.rst:134
msgid ""
"Py_BEGIN_CRITICAL_SECTION(dict);\n"
"PyObject *key, *value;\n"
"Py_ssize_t pos = 0;\n"
"while (PyDict_Next(dict, &pos, &key, &value)) {\n"
" ...\n"
"}\n"
"Py_END_CRITICAL_SECTION();"
msgstr ""
#: ../../howto/free-threading-extensions.rst:144
msgid "Borrowed References"
msgstr ""
#: ../../howto/free-threading-extensions.rst:148
msgid ""
"Some C API functions return :term:`borrowed references <borrowed "
"reference>`. These APIs are not thread-safe if the containing object is "
"modified concurrently. For example, it's not safe to use :c:func:"
"`PyList_GetItem` if the list may be modified concurrently."
msgstr ""
#: ../../howto/free-threading-extensions.rst:153
msgid ""
"The following table lists some borrowed reference APIs and their "
"replacements that return :term:`strong references <strong reference>`."
msgstr ""
#: ../../howto/free-threading-extensions.rst:157
msgid "Borrowed reference API"
msgstr ""
#: ../../howto/free-threading-extensions.rst:157
msgid "Strong reference API"
msgstr ""
#: ../../howto/free-threading-extensions.rst:159
msgid ":c:func:`PyList_GetItem`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:159
#: ../../howto/free-threading-extensions.rst:161
msgid ":c:func:`PyList_GetItemRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:161
msgid ":c:func:`PyList_GET_ITEM`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:163
msgid ":c:func:`PyDict_GetItem`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:163
#: ../../howto/free-threading-extensions.rst:165
msgid ":c:func:`PyDict_GetItemRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:165
msgid ":c:func:`PyDict_GetItemWithError`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:167
msgid ":c:func:`PyDict_GetItemString`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:167
msgid ":c:func:`PyDict_GetItemStringRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:169
msgid ":c:func:`PyDict_SetDefault`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:169
msgid ":c:func:`PyDict_SetDefaultRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:171
msgid ":c:func:`PyDict_Next`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:171
msgid "none (see :ref:`PyDict_Next`)"
msgstr ""
#: ../../howto/free-threading-extensions.rst:173
msgid ":c:func:`!PyWeakref_GetObject`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:173
#: ../../howto/free-threading-extensions.rst:175
msgid ":c:func:`PyWeakref_GetRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:175
msgid ":c:func:`!PyWeakref_GET_OBJECT`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:177
msgid ":c:func:`PyImport_AddModule`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:177
msgid ":c:func:`PyImport_AddModuleRef`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:179
msgid ":c:func:`PyCell_GET`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:179
msgid ":c:func:`PyCell_Get`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:182
msgid ""
"Not all APIs that return borrowed references are problematic. For example, :"
"c:func:`PyTuple_GetItem` is safe because tuples are immutable. Similarly, "
"not all uses of the above APIs are problematic. For example, :c:func:"
"`PyDict_GetItem` is often used for parsing keyword argument dictionaries in "
"function calls; those keyword argument dictionaries are effectively private "
"(not accessible by other threads), so using borrowed references in that "
"context is safe."
msgstr ""
#: ../../howto/free-threading-extensions.rst:190
msgid ""
"Some of these functions were added in Python 3.13. You can use the "
"`pythoncapi-compat <https://github.com/python/pythoncapi-compat>`_ package "
"to provide implementations of these functions for older Python versions."
msgstr ""
#: ../../howto/free-threading-extensions.rst:198
msgid "Memory Allocation APIs"
msgstr ""
#: ../../howto/free-threading-extensions.rst:200
msgid ""
"Python's memory management C API provides functions in three different :ref:"
"`allocation domains <allocator-domains>`: \"raw\", \"mem\", and \"object\". "
"For thread-safety, the free-threaded build requires that only Python objects "
"are allocated using the object domain, and that all Python objects are "
"allocated using that domain. This differs from the prior Python versions, "
"where this was only a best practice and not a hard requirement."
msgstr ""
#: ../../howto/free-threading-extensions.rst:209
msgid ""
"Search for uses of :c:func:`PyObject_Malloc` in your extension and check "
"that the allocated memory is used for Python objects. Use :c:func:"
"`PyMem_Malloc` to allocate buffers instead of :c:func:`PyObject_Malloc`."
msgstr ""
#: ../../howto/free-threading-extensions.rst:216
msgid "Thread State and GIL APIs"
msgstr ""
#: ../../howto/free-threading-extensions.rst:218
msgid ""
"Python provides a set of functions and macros to manage thread state and the "
"GIL, such as:"
msgstr ""
#: ../../howto/free-threading-extensions.rst:221
msgid ""
":c:func:`PyThreadState_Ensure`, :c:func:`PyThreadState_EnsureFromView`, and :"
"c:func:`PyThreadState_Release`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:223
msgid ":c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:224
msgid ":c:func:`PyEval_SaveThread` and :c:func:`PyEval_RestoreThread`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:225
msgid ":c:macro:`Py_BEGIN_ALLOW_THREADS` and :c:macro:`Py_END_ALLOW_THREADS`"
msgstr ""
#: ../../howto/free-threading-extensions.rst:227
msgid ""
"These functions should still be used in the free-threaded build to manage "
"thread state even when the :term:`GIL` is disabled. For example, if you "
"create a thread outside of Python, you must call :c:func:"
"`PyThreadState_Ensure` before calling into the Python API to ensure that the "
"thread has a valid Python thread state."
msgstr ""
#: ../../howto/free-threading-extensions.rst:233
msgid ""
"You should continue to call :c:func:`PyEval_SaveThread` or :c:macro:"
"`Py_BEGIN_ALLOW_THREADS` around blocking operations, such as I/O or lock "
"acquisitions, to allow other threads to run the :term:`cyclic garbage "
"collector <garbage collection>`."
msgstr ""
#: ../../howto/free-threading-extensions.rst:240
msgid "Protecting Internal Extension State"
msgstr ""
#: ../../howto/free-threading-extensions.rst:242
msgid ""
"Your extension may have internal state that was previously protected by the "
"GIL. You may need to add locking to protect this state. The approach will "
"depend on your extension, but some common patterns include:"
msgstr ""
#: ../../howto/free-threading-extensions.rst:246
msgid ""
"**Caches**: global caches are a common source of shared state. Consider "
"using a lock to protect the cache or disabling it in the free-threaded build "
"if the cache is not critical for performance."
msgstr ""
#: ../../howto/free-threading-extensions.rst:249
msgid ""
"**Global State**: global state may need to be protected by a lock or moved "
"to thread local storage. C11 and C++11 provide the ``thread_local`` or "
"``_Thread_local`` for `thread-local storage <https://en.cppreference.com/w/c/"
"language/storage_duration>`_."
msgstr ""
#: ../../howto/free-threading-extensions.rst:256
msgid "Critical Sections"
msgstr ""
#: ../../howto/free-threading-extensions.rst:260
msgid ""
"In the free-threaded build, CPython provides a mechanism called \"critical "
"sections\" to protect data that would otherwise be protected by the GIL. "
"While extension authors may not interact with the internal critical section "
"implementation directly, understanding their behavior is crucial when using "
"certain C API functions or managing shared state in the free-threaded build."
msgstr ""
#: ../../howto/free-threading-extensions.rst:267
msgid "What Are Critical Sections?"
msgstr ""
#: ../../howto/free-threading-extensions.rst:269
msgid ""
"Conceptually, critical sections act as a deadlock avoidance layer built on "
"top of simple mutexes. Each thread maintains a stack of active critical "
"sections. When a thread needs to acquire a lock associated with a critical "
"section (e.g., implicitly when calling a thread-safe C API function like :c:"
"func:`PyDict_SetItem`, or explicitly using macros), it attempts to acquire "
"the underlying mutex."
msgstr ""
#: ../../howto/free-threading-extensions.rst:277
msgid "Using Critical Sections"
msgstr ""
#: ../../howto/free-threading-extensions.rst:279
msgid "The primary APIs for using critical sections are:"
msgstr ""
#: ../../howto/free-threading-extensions.rst:281
msgid ""
":c:macro:`Py_BEGIN_CRITICAL_SECTION` and :c:macro:`Py_END_CRITICAL_SECTION` "
"- For locking a single object"
msgstr ""
#: ../../howto/free-threading-extensions.rst:284
msgid ""
":c:macro:`Py_BEGIN_CRITICAL_SECTION2` and :c:macro:"
"`Py_END_CRITICAL_SECTION2` - For locking two objects simultaneously"
msgstr ""
#: ../../howto/free-threading-extensions.rst:287
msgid ""
"These macros must be used in matching pairs and must appear in the same C "
"scope, since they establish a new local scope. These macros are no-ops in "
"non-free-threaded builds, so they can be safely added to code that needs to "
"support both build types."
msgstr ""
#: ../../howto/free-threading-extensions.rst:292
msgid ""
"A common use of a critical section would be to lock an object while "
"accessing an internal attribute of it. For example, if an extension type "
"has an internal count field, you could use a critical section while reading "
"or writing that field::"
msgstr ""
#: ../../howto/free-threading-extensions.rst:297
msgid ""
"// read the count, returns new reference to internal count value\n"
"PyObject *result;\n"
"Py_BEGIN_CRITICAL_SECTION(obj);\n"
"result = Py_NewRef(obj->count);\n"
"Py_END_CRITICAL_SECTION();\n"
"return result;\n"
"\n"
"// write the count, consumes reference from new_count\n"
"Py_BEGIN_CRITICAL_SECTION(obj);\n"
"obj->count = new_count;\n"
"Py_END_CRITICAL_SECTION();"
msgstr ""
#: ../../howto/free-threading-extensions.rst:311
msgid "How Critical Sections Work"
msgstr ""
#: ../../howto/free-threading-extensions.rst:313
msgid ""
"Unlike traditional locks, critical sections do not guarantee exclusive "
"access throughout their entire duration. If a thread would block while "
"holding a critical section (e.g., by acquiring another lock or performing I/"
"O), the critical section is temporarily suspended—all locks are released—and "
"then resumed when the blocking operation completes."
msgstr ""
#: ../../howto/free-threading-extensions.rst:319
msgid ""
"This behavior is similar to what happens with the GIL when a thread makes a "
"blocking call. The key differences are:"
msgstr ""
#: ../../howto/free-threading-extensions.rst:322
msgid "Critical sections operate on a per-object basis rather than globally"
msgstr ""
#: ../../howto/free-threading-extensions.rst:324
msgid ""
"Critical sections follow a stack discipline within each thread (the "
"\"begin\" and \"end\" macros enforce this since they must be paired and "
"within the same scope)"
msgstr ""
#: ../../howto/free-threading-extensions.rst:327
msgid ""
"Critical sections automatically release and reacquire locks around potential "
"blocking operations"
msgstr ""
#: ../../howto/free-threading-extensions.rst:331
msgid "Deadlock Avoidance"
msgstr ""
#: ../../howto/free-threading-extensions.rst:333
msgid "Critical sections help avoid deadlocks in two ways:"
msgstr ""
#: ../../howto/free-threading-extensions.rst:335
msgid ""
"If a thread tries to acquire a lock that's already held by another thread, "
"it first suspends all of its active critical sections, temporarily releasing "
"their locks"
msgstr ""
#: ../../howto/free-threading-extensions.rst:339
msgid ""
"When the blocking operation completes, only the top-most critical section is "
"reacquired first"
msgstr ""
#: ../../howto/free-threading-extensions.rst:342
msgid ""
"This means you cannot rely on nested critical sections to lock multiple "
"objects at once, as the inner critical section may suspend the outer ones. "
"Instead, use :c:macro:`Py_BEGIN_CRITICAL_SECTION2` to lock two objects "
"simultaneously."
msgstr ""
#: ../../howto/free-threading-extensions.rst:346
msgid ""
"Note that the locks described above are only :c:type:`PyMutex` based locks. "
"The critical section implementation does not know about or affect other "
"locking mechanisms that might be in use, like POSIX mutexes. Also note that "
"while blocking on any :c:type:`PyMutex` causes the critical sections to be "
"suspended, only the mutexes that are part of the critical sections are "
"released. If :c:type:`PyMutex` is used without a critical section, it will "
"not be released and therefore does not get the same deadlock avoidance."
msgstr ""
#: ../../howto/free-threading-extensions.rst:355
msgid "Important Considerations"
msgstr ""
#: ../../howto/free-threading-extensions.rst:357
msgid ""
"Critical sections may temporarily release their locks, allowing other "
"threads to modify the protected data. Be careful about making assumptions "
"about the state of the data after operations that might block."
msgstr ""
#: ../../howto/free-threading-extensions.rst:361
msgid ""
"Because locks can be temporarily released (suspended), entering a critical "
"section does not guarantee exclusive access to the protected resource "
"throughout the section's duration. If code within a critical section calls "
"another function that blocks (e.g., acquires another lock, performs blocking "
"I/O), all locks held by the thread via critical sections will be released. "
"This is similar to how the GIL can be released during blocking calls."
msgstr ""
#: ../../howto/free-threading-extensions.rst:368
msgid ""
"Only the lock(s) associated with the most recently entered (top-most) "
"critical section are guaranteed to be held at any given time. Locks for "
"outer, nested critical sections might have been suspended."
msgstr ""
#: ../../howto/free-threading-extensions.rst:372
msgid ""
"You can lock at most two objects simultaneously with these APIs. If you need "
"to lock more objects, you'll need to restructure your code."
msgstr ""
#: ../../howto/free-threading-extensions.rst:375
msgid ""
"While critical sections will not deadlock if you attempt to lock the same "
"object twice, they are less efficient than purpose-built reentrant locks for "
"this use case."
msgstr ""
#: ../../howto/free-threading-extensions.rst:379
msgid ""
"When using :c:macro:`Py_BEGIN_CRITICAL_SECTION2`, the order of the objects "
"doesn't affect correctness (the implementation handles deadlock avoidance), "
"but it's good practice to always lock objects in a consistent order."
msgstr ""
#: ../../howto/free-threading-extensions.rst:383
msgid ""
"Remember that the critical section macros are primarily for protecting "
"access to *Python objects* that might be involved in internal CPython "
"operations susceptible to the deadlock scenarios described above. For "
"protecting purely internal extension state, standard mutexes or other "
"synchronization primitives might be more appropriate."
msgstr ""
#: ../../howto/free-threading-extensions.rst:392
msgid "Per-Object Locks (``ob_mutex``)"
msgstr ""
#: ../../howto/free-threading-extensions.rst:394
msgid ""
"In the free-threaded build, each Python object contains a :c:member:"
"`~PyObject.ob_mutex` field of type :c:type:`PyMutex`. This mutex is "
"**reserved for use by the critical section API** (:c:macro:"
"`Py_BEGIN_CRITICAL_SECTION` / :c:macro:`Py_END_CRITICAL_SECTION`)."
msgstr ""
#: ../../howto/free-threading-extensions.rst:401
msgid ""
"Do **not** lock ``ob_mutex`` directly with ``PyMutex_Lock(&obj->ob_mutex)``. "
"Mixing direct ``PyMutex_Lock`` calls with the critical section API on the "
"same mutex can cause deadlocks."
msgstr ""
#: ../../howto/free-threading-extensions.rst:405
msgid ""
"Even if your own code never uses critical sections on a particular object "
"type, **CPython internals may use the critical section API on any Python "
"object**."
msgstr ""
#: ../../howto/free-threading-extensions.rst:408
msgid ""
"If your extension type needs its own lock, add a separate :c:type:`PyMutex` "
"field (or another synchronization primitive) to your object struct. :c:type:"
"`PyMutex` is very lightweight, so there is negligible cost to having an "
"additional one."
msgstr ""
#: ../../howto/free-threading-extensions.rst:415
msgid "Building Extensions for the Free-Threaded Build"
msgstr ""
#: ../../howto/free-threading-extensions.rst:417
msgid ""
"C API extensions need to be built specifically for the free-threaded build. "
"The wheels, shared libraries, and binaries are indicated by a ``t`` suffix."
msgstr ""
#: ../../howto/free-threading-extensions.rst:420
msgid ""
"`pypa/manylinux <https://github.com/pypa/manylinux>`_ supports the free-"
"threaded build, with the ``t`` suffix, such as ``python3.14t``."
msgstr ""
#: ../../howto/free-threading-extensions.rst:422
msgid ""
"`pypa/cibuildwheel <https://github.com/pypa/cibuildwheel>`_ supports "
"building wheels for the free-threaded build of Python 3.14 and newer."
msgstr ""
#: ../../howto/free-threading-extensions.rst:426
msgid "Limited C API and Stable ABI"
msgstr ""
#: ../../howto/free-threading-extensions.rst:428
msgid ""
"The free-threaded build does not currently support the :ref:`Limited C API "
"<limited-c-api>` or the stable ABI. If you use `setuptools <https://"
"setuptools.pypa.io/en/latest/setuptools.html>`_ to build your extension and "
"currently set ``py_limited_api=True`` you can use ``py_limited_api=not "
"sysconfig.get_config_var(\"Py_GIL_DISABLED\")`` to opt out of the limited "
"API when building with the free-threaded build."
msgstr ""
#: ../../howto/free-threading-extensions.rst:436
msgid ""
"You will need to build separate wheels specifically for the free-threaded "
"build. If you currently use the stable ABI, you can continue to build a "
"single wheel for multiple non-free-threaded Python versions."
msgstr ""
#: ../../howto/free-threading-extensions.rst:442
msgid "Windows"
msgstr "Windows"
#: ../../howto/free-threading-extensions.rst:444
msgid ""
"Due to a limitation of the official Windows installer, you will need to "
"manually define ``Py_GIL_DISABLED=1`` when building extensions from source."
msgstr ""
#: ../../howto/free-threading-extensions.rst:449
msgid ""
"`Porting Extension Modules to Support Free-Threading <https://py-free-"
"threading.github.io/porting/>`_: A community-maintained porting guide for "
"extension authors."
msgstr ""