Patch #977553: speed up RegEnumKey call
authorGeorg Brandl <georg@python.org>
Sat, 18 Feb 2006 23:35:11 +0000 (23:35 +0000)
committerGeorg Brandl <georg@python.org>
Sat, 18 Feb 2006 23:35:11 +0000 (23:35 +0000)
PC/_winreg.c

index 965acf1e180f85e8e6f6def71642076f6dc87d4f..c97bbc6a07776776be409373b61a091dfb79dd33 100644 (file)
@@ -1033,30 +1033,23 @@ PyEnumKey(PyObject *self, PyObject *args)
        long rc;
        PyObject *retStr;
        char *retBuf;
-       DWORD len;
+       DWORD len = 256;  /* includes NULL terminator */
+       char tmpbuf[256]; /* max key name length is 255 */
 
        if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
                return NULL;
        if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
                return NULL;
-
-       if ((rc = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, &len,
-                                 NULL, NULL, NULL, NULL, NULL, NULL))
-           != ERROR_SUCCESS)
-               return PyErr_SetFromWindowsErrWithFunction(rc,
-                                                          "RegQueryInfoKey");
-       ++len;    /* include null terminator */
-       retStr = PyString_FromStringAndSize(NULL, len);
-       if (retStr == NULL)
-               return NULL;
-       retBuf = PyString_AS_STRING(retStr);
-
-       if ((rc = RegEnumKey(hKey, index, retBuf, len)) != ERROR_SUCCESS) {
-               Py_DECREF(retStr);
-               return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKey");
-       }
-       _PyString_Resize(&retStr, strlen(retBuf));
-       return retStr;
+       
+       Py_BEGIN_ALLOW_THREADS
+       rc = RegEnumKeyEx(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
+       Py_END_ALLOW_THREADS
+       if (rc != ERROR_SUCCESS)
+               return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
+       
+       ++len;  /* include null terminator */
+       retStr = PyString_FromStringAndSize(tmpbuf, len);
+       return retStr;  /* can be NULL */
 }
 
 static PyObject *