@@ -426,7 +426,9 @@ PyHKEY_Close(winreg_state *st, PyObject *ob_handle)
426426 if (PyHKEY_Check (st , ob_handle )) {
427427 ((PyHKEYObject * )ob_handle )-> hkey = 0 ;
428428 }
429+ Py_BEGIN_ALLOW_THREADS
429430 rc = key ? RegCloseKey (key ) : ERROR_SUCCESS ;
431+ Py_END_ALLOW_THREADS
430432 if (rc != ERROR_SUCCESS )
431433 PyErr_SetFromWindowsErrWithFunction (rc , "RegCloseKey ");
432434 return rc == ERROR_SUCCESS ;
@@ -499,14 +501,21 @@ PyWinObject_CloseHKEY(winreg_state *st, PyObject *obHandle)
499501 }
500502#if SIZEOF_LONG >= SIZEOF_HKEY
501503 else if (PyLong_Check (obHandle )) {
502- long rc = RegCloseKey ((HKEY )PyLong_AsLong (obHandle ));
504+ long rc ;
505+ Py_BEGIN_ALLOW_THREADS
506+ rc = RegCloseKey ((HKEY )PyLong_AsLong (obHandle ));
507+ Py_END_ALLOW_THREADS
503508 ok = (rc == ERROR_SUCCESS );
504509 if (!ok )
505510 PyErr_SetFromWindowsErrWithFunction (rc , "RegCloseKey" );
506511 }
507512#else
508513 else if (PyLong_Check (obHandle )) {
509- long rc = RegCloseKey ((HKEY )PyLong_AsVoidPtr (obHandle ));
514+ long rc ;
515+ HKEY hkey = (HKEY )PyLong_AsVoidPtr (obHandle );
516+ Py_BEGIN_ALLOW_THREADS
517+ rc = RegCloseKey (hkey );
518+ Py_END_ALLOW_THREADS
510519 ok = (rc == ERROR_SUCCESS );
511520 if (!ok )
512521 PyErr_SetFromWindowsErrWithFunction (rc , "RegCloseKey" );
@@ -924,7 +933,9 @@ winreg_CreateKey_impl(PyObject *module, HKEY key, const wchar_t *sub_key)
924933 (Py_ssize_t )KEY_WRITE ) < 0 ) {
925934 return NULL ;
926935 }
936+ Py_BEGIN_ALLOW_THREADS
927937 rc = RegCreateKeyW (key , sub_key , & retKey );
938+ Py_END_ALLOW_THREADS
928939 if (rc != ERROR_SUCCESS ) {
929940 PyErr_SetFromWindowsErrWithFunction (rc , "CreateKey" );
930941 return NULL ;
@@ -973,8 +984,10 @@ winreg_CreateKeyEx_impl(PyObject *module, HKEY key, const wchar_t *sub_key,
973984 (Py_ssize_t )access ) < 0 ) {
974985 return NULL ;
975986 }
987+ Py_BEGIN_ALLOW_THREADS
976988 rc = RegCreateKeyExW (key , sub_key , reserved , NULL , 0 ,
977989 access , NULL , & retKey , NULL );
990+ Py_END_ALLOW_THREADS
978991 if (rc != ERROR_SUCCESS ) {
979992 PyErr_SetFromWindowsErrWithFunction (rc , "CreateKeyEx" );
980993 return NULL ;
@@ -1187,10 +1200,12 @@ winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
11871200 (Py_ssize_t )key , index ) < 0 ) {
11881201 return NULL ;
11891202 }
1190- if ((rc = RegQueryInfoKeyW (key , NULL , NULL , NULL , NULL , NULL , NULL ,
1191- NULL ,
1192- & retValueSize , & retDataSize , NULL , NULL ))
1193- != ERROR_SUCCESS )
1203+
1204+ Py_BEGIN_ALLOW_THREADS
1205+ rc = RegQueryInfoKeyW (key , NULL , NULL , NULL , NULL , NULL , NULL , NULL ,
1206+ & retValueSize , & retDataSize , NULL , NULL );
1207+ Py_END_ALLOW_THREADS
1208+ if (rc != ERROR_SUCCESS )
11941209 return PyErr_SetFromWindowsErrWithFunction (rc ,
11951210 "RegQueryInfoKey ");
11961211 ++ retValueSize ; /* include null terminators */
@@ -1477,9 +1492,11 @@ winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
14771492 if (PySys_Audit ("winreg.QueryInfoKey" , "n" , (Py_ssize_t )key ) < 0 ) {
14781493 return NULL ;
14791494 }
1480- if ((rc = RegQueryInfoKeyW (key , NULL , NULL , 0 , & nSubKeys , NULL , NULL ,
1481- & nValues , NULL , NULL , NULL , & ft ))
1482- != ERROR_SUCCESS ) {
1495+ Py_BEGIN_ALLOW_THREADS
1496+ rc = RegQueryInfoKeyW (key , NULL , NULL , 0 , & nSubKeys , NULL , NULL ,
1497+ & nValues , NULL , NULL , NULL , & ft );
1498+ Py_END_ALLOW_THREADS
1499+ if (rc != ERROR_SUCCESS ) {
14831500 return PyErr_SetFromWindowsErrWithFunction (rc , "RegQueryInfoKey" );
14841501 }
14851502 li .LowPart = ft .dwLowDateTime ;
@@ -1587,7 +1604,9 @@ winreg_QueryValue_impl(PyObject *module, HKEY key, const wchar_t *sub_key)
15871604 PyMem_Free (pbuf );
15881605 }
15891606 if (childKey != key ) {
1607+ Py_BEGIN_ALLOW_THREADS
15901608 RegCloseKey (childKey );
1609+ Py_END_ALLOW_THREADS
15911610 }
15921611 return result ;
15931612}
@@ -1625,7 +1644,9 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const wchar_t *name)
16251644 (Py_ssize_t )key , NULL , name ) < 0 ) {
16261645 return NULL ;
16271646 }
1647+ Py_BEGIN_ALLOW_THREADS
16281648 rc = RegQueryValueExW (key , name , NULL , NULL , NULL , & bufSize );
1649+ Py_END_ALLOW_THREADS
16291650 if (rc == ERROR_MORE_DATA )
16301651 bufSize = 256 ;
16311652 else if (rc != ERROR_SUCCESS )
@@ -1637,8 +1658,10 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const wchar_t *name)
16371658
16381659 while (1 ) {
16391660 retSize = bufSize ;
1661+ Py_BEGIN_ALLOW_THREADS
16401662 rc = RegQueryValueExW (key , name , NULL , & typ ,
16411663 (BYTE * )retBuf , & retSize );
1664+ Py_END_ALLOW_THREADS
16421665 if (rc != ERROR_MORE_DATA )
16431666 break ;
16441667
0 commit comments