mirror of https://github.com/python/cpython
gh-112278: Improve error handling in wmi module and tests (GH-117818)
This commit is contained in:
parent
185999bb3a
commit
7d9d6b53bc
|
@ -14,6 +14,8 @@ def wmi_exec_query(query):
|
|||
# gh-112278: WMI maybe slow response when first call.
|
||||
try:
|
||||
return _wmi.exec_query(query)
|
||||
except BrokenPipeError:
|
||||
pass
|
||||
except WindowsError as e:
|
||||
if e.winerror != 258:
|
||||
raise
|
||||
|
|
|
@ -279,10 +279,12 @@ _wmi_exec_query_impl(PyObject *module, PyObject *query)
|
|||
// a timeout. The initEvent will be set after COM initialization, it will
|
||||
// take a longer time when first initialized. The connectEvent will be set
|
||||
// after connected to WMI.
|
||||
if (!err) {
|
||||
err = wait_event(data.initEvent, 1000);
|
||||
if (!err) {
|
||||
err = wait_event(data.connectEvent, 100);
|
||||
}
|
||||
}
|
||||
|
||||
while (!err) {
|
||||
if (ReadFile(
|
||||
|
@ -305,28 +307,33 @@ _wmi_exec_query_impl(PyObject *module, PyObject *query)
|
|||
CloseHandle(data.readPipe);
|
||||
}
|
||||
|
||||
if (hThread) {
|
||||
// Allow the thread some time to clean up
|
||||
int thread_err;
|
||||
switch (WaitForSingleObject(hThread, 100)) {
|
||||
case WAIT_OBJECT_0:
|
||||
// Thread ended cleanly
|
||||
if (!GetExitCodeThread(hThread, (LPDWORD)&err)) {
|
||||
err = GetLastError();
|
||||
if (!GetExitCodeThread(hThread, (LPDWORD)&thread_err)) {
|
||||
thread_err = GetLastError();
|
||||
}
|
||||
break;
|
||||
case WAIT_TIMEOUT:
|
||||
// Probably stuck - there's not much we can do, unfortunately
|
||||
if (err == 0 || err == ERROR_BROKEN_PIPE) {
|
||||
err = WAIT_TIMEOUT;
|
||||
}
|
||||
thread_err = WAIT_TIMEOUT;
|
||||
break;
|
||||
default:
|
||||
if (err == 0 || err == ERROR_BROKEN_PIPE) {
|
||||
err = GetLastError();
|
||||
}
|
||||
thread_err = GetLastError();
|
||||
break;
|
||||
}
|
||||
// An error on our side is more likely to be relevant than one from
|
||||
// the thread, but if we don't have one on our side we'll take theirs.
|
||||
if (err == 0 || err == ERROR_BROKEN_PIPE) {
|
||||
err = thread_err;
|
||||
}
|
||||
|
||||
CloseHandle(hThread);
|
||||
}
|
||||
|
||||
CloseHandle(data.initEvent);
|
||||
CloseHandle(data.connectEvent);
|
||||
hThread = NULL;
|
||||
|
|
Loading…
Reference in New Issue