glx/glvnd: Use strcmp() based binary search in FindGLXFunction()
authorEmil Velikov <emil.velikov@collabora.com>
Wed, 11 May 2016 18:01:54 +0000 (14:01 -0400)
committerEmil Velikov <emil.l.velikov@gmail.com>
Mon, 30 May 2016 16:53:44 +0000 (17:53 +0100)
It will allows us to find the function within 6 attempts, out of the ~80
entry long table.

v2: calculate middle on each iteration, correctly set the lower limit.

Reviewed-by: Adam Jackson <ajax@redhat.com> (v1)
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
src/glx/glxglvnd.c

index c7c35ca3a14753cf03ed5663fd77e9913d98e5c5..96cd1fd7e95102a81090ae21b70a42a915d32414 100644 (file)
@@ -19,11 +19,20 @@ static void *__glXGLVNDGetProcAddress(const GLubyte *procName)
 
 static int FindGLXFunction(const GLubyte *name)
 {
-    int i;
-
-    for (i = 0; i < DI_FUNCTION_COUNT; i++) {
-        if (strcmp((const char *) name, __glXDispatchTableStrings[i]) == 0)
-            return i;
+    unsigned first = 0;
+    unsigned last = DI_FUNCTION_COUNT - 1;
+
+    while (first <= last) {
+        unsigned middle = (first + last) / 2;
+        int comp = strcmp((const char *) name,
+                          __glXDispatchTableStrings[middle]);
+
+        if (comp < 0)
+            first = middle + 1;
+        else if (comp > 0)
+            last = middle - 1;
+        else
+            return middle;
     }
     return -1;
 }