@@ -86,10 +86,10 @@ _PyCriticalSection_Resume(PyThreadState *tstate);
8686
8787// (private) slow path for locking the mutex
8888PyAPI_FUNC (void )
89- _PyCriticalSection_BeginSlow (PyThreadState * tstate , PyCriticalSection * c , PyMutex * m );
89+ _PyCriticalSection_BeginSlow (PyCriticalSection * c , PyMutex * m );
9090
9191PyAPI_FUNC (void )
92- _PyCriticalSection2_BeginSlow (PyThreadState * tstate , PyCriticalSection2 * c , PyMutex * m1 , PyMutex * m2 ,
92+ _PyCriticalSection2_BeginSlow (PyCriticalSection2 * c , PyMutex * m1 , PyMutex * m2 ,
9393 int is_m1_locked );
9494
9595PyAPI_FUNC (void )
@@ -104,30 +104,33 @@ _PyCriticalSection_IsActive(uintptr_t tag)
104104}
105105
106106static inline void
107- _PyCriticalSection_BeginMutex (PyThreadState * tstate , PyCriticalSection * c , PyMutex * m )
107+ _PyCriticalSection_BeginMutex (PyCriticalSection * c , PyMutex * m )
108108{
109+ PyThreadState * tstate = PyThreadState_GET ();
110+ c -> _cs_tstate = tstate ;
109111 if (PyMutex_LockFast (m )) {
110112 c -> _cs_mutex = m ;
111113 c -> _cs_prev = tstate -> critical_section ;
112114 tstate -> critical_section = (uintptr_t )c ;
113115 }
114116 else {
115- _PyCriticalSection_BeginSlow (tstate , c , m );
117+ _PyCriticalSection_BeginSlow (c , m );
116118 }
117119}
118120
119121static inline void
120- _PyCriticalSection_Begin (PyThreadState * tstate , PyCriticalSection * c , PyObject * op )
122+ _PyCriticalSection_Begin (PyCriticalSection * c , PyObject * op )
121123{
122- _PyCriticalSection_BeginMutex (tstate , c , & op -> ob_mutex );
124+ _PyCriticalSection_BeginMutex (c , & op -> ob_mutex );
123125}
124126
125127// Removes the top-most critical section from the thread's stack of critical
126128// sections. If the new top-most critical section is inactive, then it is
127129// resumed.
128130static inline void
129- _PyCriticalSection_Pop (PyThreadState * tstate , PyCriticalSection * c )
131+ _PyCriticalSection_Pop (PyCriticalSection * c )
130132{
133+ PyThreadState * tstate = c -> _cs_tstate ;
131134 uintptr_t prev = c -> _cs_prev ;
132135 tstate -> critical_section = prev ;
133136
@@ -137,7 +140,7 @@ _PyCriticalSection_Pop(PyThreadState *tstate, PyCriticalSection *c)
137140}
138141
139142static inline void
140- _PyCriticalSection_End (PyThreadState * tstate , PyCriticalSection * c )
143+ _PyCriticalSection_End (PyCriticalSection * c )
141144{
142145 // If the mutex is NULL, we used the fast path in
143146 // _PyCriticalSection_BeginSlow for locks already held in the top-most
@@ -146,17 +149,17 @@ _PyCriticalSection_End(PyThreadState *tstate, PyCriticalSection *c)
146149 return ;
147150 }
148151 PyMutex_Unlock (c -> _cs_mutex );
149- _PyCriticalSection_Pop (tstate , c );
152+ _PyCriticalSection_Pop (c );
150153}
151154
152155static inline void
153- _PyCriticalSection2_BeginMutex (PyThreadState * tstate , PyCriticalSection2 * c , PyMutex * m1 , PyMutex * m2 )
156+ _PyCriticalSection2_BeginMutex (PyCriticalSection2 * c , PyMutex * m1 , PyMutex * m2 )
154157{
155158 if (m1 == m2 ) {
156159 // If the two mutex arguments are the same, treat this as a critical
157160 // section with a single mutex.
158161 c -> _cs_mutex2 = NULL ;
159- _PyCriticalSection_BeginMutex (tstate , & c -> _cs_base , m1 );
162+ _PyCriticalSection_BeginMutex (& c -> _cs_base , m1 );
160163 return ;
161164 }
162165
@@ -169,6 +172,9 @@ _PyCriticalSection2_BeginMutex(PyThreadState *tstate, PyCriticalSection2 *c, PyM
169172 m2 = tmp ;
170173 }
171174
175+ PyThreadState * tstate = PyThreadState_GET ();
176+ c -> _cs_base ._cs_tstate = tstate ;
177+
172178 if (PyMutex_LockFast (m1 )) {
173179 if (PyMutex_LockFast (m2 )) {
174180 c -> _cs_base ._cs_mutex = m1 ;
@@ -179,22 +185,22 @@ _PyCriticalSection2_BeginMutex(PyThreadState *tstate, PyCriticalSection2 *c, PyM
179185 tstate -> critical_section = p ;
180186 }
181187 else {
182- _PyCriticalSection2_BeginSlow (tstate , c , m1 , m2 , 1 );
188+ _PyCriticalSection2_BeginSlow (c , m1 , m2 , 1 );
183189 }
184190 }
185191 else {
186- _PyCriticalSection2_BeginSlow (tstate , c , m1 , m2 , 0 );
192+ _PyCriticalSection2_BeginSlow (c , m1 , m2 , 0 );
187193 }
188194}
189195
190196static inline void
191- _PyCriticalSection2_Begin (PyThreadState * tstate , PyCriticalSection2 * c , PyObject * a , PyObject * b )
197+ _PyCriticalSection2_Begin (PyCriticalSection2 * c , PyObject * a , PyObject * b )
192198{
193- _PyCriticalSection2_BeginMutex (tstate , c , & a -> ob_mutex , & b -> ob_mutex );
199+ _PyCriticalSection2_BeginMutex (c , & a -> ob_mutex , & b -> ob_mutex );
194200}
195201
196202static inline void
197- _PyCriticalSection2_End (PyThreadState * tstate , PyCriticalSection2 * c )
203+ _PyCriticalSection2_End (PyCriticalSection2 * c )
198204{
199205 // if mutex1 is NULL, we used the fast path in
200206 // _PyCriticalSection_BeginSlow for mutexes that are already held,
@@ -208,7 +214,7 @@ _PyCriticalSection2_End(PyThreadState *tstate, PyCriticalSection2 *c)
208214 PyMutex_Unlock (c -> _cs_mutex2 );
209215 }
210216 PyMutex_Unlock (c -> _cs_base ._cs_mutex );
211- _PyCriticalSection_Pop (tstate , & c -> _cs_base );
217+ _PyCriticalSection_Pop (& c -> _cs_base );
212218}
213219
214220static inline void
@@ -252,43 +258,12 @@ _PyCriticalSection_AssertHeldObj(PyObject *op)
252258#endif
253259}
254260
255- #undef Py_BEGIN_CRITICAL_SECTION
256- # define Py_BEGIN_CRITICAL_SECTION (op ) \
257- { \
258- PyCriticalSection _py_cs; \
259- PyThreadState *_cs_tstate = _PyThreadState_GET(); \
260- _PyCriticalSection_Begin(_cs_tstate, &_py_cs, _PyObject_CAST(op))
261-
262- #undef Py_BEGIN_CRITICAL_SECTION_MUTEX
263- # define Py_BEGIN_CRITICAL_SECTION_MUTEX (mutex ) \
264- { \
265- PyCriticalSection _py_cs; \
266- PyThreadState *_cs_tstate = _PyThreadState_GET(); \
267- _PyCriticalSection_BeginMutex(_cs_tstate, &_py_cs, mutex)
268-
269- #undef Py_END_CRITICAL_SECTION
270- # define Py_END_CRITICAL_SECTION () \
271- _PyCriticalSection_End(_cs_tstate, &_py_cs); \
272- }
273-
274- #undef Py_BEGIN_CRITICAL_SECTION2
275- # define Py_BEGIN_CRITICAL_SECTION2 (a , b ) \
276- { \
277- PyCriticalSection2 _py_cs2; \
278- PyThreadState *_cs_tstate = _PyThreadState_GET(); \
279- _PyCriticalSection2_Begin(_cs_tstate, &_py_cs2, _PyObject_CAST(a), _PyObject_CAST(b))
280-
281- #undef Py_BEGIN_CRITICAL_SECTION2_MUTEX
282- # define Py_BEGIN_CRITICAL_SECTION2_MUTEX (m1 , m2 ) \
283- { \
284- PyCriticalSection2 _py_cs2; \
285- PyThreadState *_cs_tstate = _PyThreadState_GET(); \
286- _PyCriticalSection2_BeginMutex(_cs_tstate, &_py_cs2, m1, m2)
287-
288- #undef Py_END_CRITICAL_SECTION2
289- # define Py_END_CRITICAL_SECTION2 () \
290- _PyCriticalSection2_End(_cs_tstate, &_py_cs2); \
291- }
261+ #define PyCriticalSection_Begin _PyCriticalSection_Begin
262+ #define PyCriticalSection_BeginMutex _PyCriticalSection_BeginMutex
263+ #define PyCriticalSection_End _PyCriticalSection_End
264+ #define PyCriticalSection2_Begin _PyCriticalSection2_Begin
265+ #define PyCriticalSection2_BeginMutex _PyCriticalSection2_BeginMutex
266+ #define PyCriticalSection2_End _PyCriticalSection2_End
292267
293268#endif /* Py_GIL_DISABLED */
294269
0 commit comments