va-android: same as X11, also always create a new VA display on android 11/811/1
authorAustin Yuan <shengquan.yuan@gmail.com>
Thu, 16 Jun 2011 05:58:11 +0000 (13:58 +0800)
committerAustin Yuan <shengquan.yuan@gmail.com>
Thu, 16 Jun 2011 06:03:27 +0000 (14:03 +0800)
Previously a VA display will be shared if a native display is shared by multiple threads,
it will casue some thread safety issue in a multi-threaded program.

Remove the global VADisplayContextP pDisplayContexts which is not thread safe

Signed-off-by: Austin Yuan <shengquan.yuan@gmail.com>
va/android/va_android.cpp

index 190d444..869e4af 100644 (file)
@@ -45,8 +45,6 @@
 #define CHECK_SYMBOL(func) { if (!func) printf("func %s not found\n", #func); return VA_STATUS_ERROR_UNKNOWN; }
 #define DEVICE_NAME "/dev/card0"
 
-static VADisplayContextP pDisplayContexts = NULL;
-
 static int open_device (char *dev_name)
 {
     struct stat st;
@@ -81,34 +79,23 @@ static int va_DisplayContextIsValid (
     VADisplayContextP pDisplayContext
                                   )
 {
-    VADisplayContextP ctx = pDisplayContexts;
-
-    while (ctx)
-    {
-       if (ctx == pDisplayContext && pDisplayContext->pDriverContext)
-           return 1;
-       ctx = ctx->pNext;
-    }
-    return 0;
+    return (pDisplayContext != NULL &&
+            pDisplayContext->pDriverContext != NULL);
 }
 
 static void va_DisplayContextDestroy (
     VADisplayContextP pDisplayContext
 )
 {
-    VADisplayContextP *ctx = &pDisplayContexts;
+    struct dri_state *dri_state;
+
+    if (pDisplayContext == NULL)
+        return;
+
+    /* close the open-ed DRM fd */
+    dri_state = (struct dri_state *)pDisplayContext->pDriverContext->dri_state;
+    close(dri_state->fd);
 
-    /* Throw away pDisplayContext */
-    while (*ctx)
-    {
-       if (*ctx == pDisplayContext)
-       {
-           *ctx = pDisplayContext->pNext;
-           pDisplayContext->pNext = NULL;
-           break;
-       }
-       ctx = &((*ctx)->pNext);
-    }
     free(pDisplayContext->pDriverContext->dri_state);
     free(pDisplayContext->pDriverContext);
     free(pDisplayContext);
@@ -149,7 +136,7 @@ static VAStatus va_DisplayContextGetDriverName (
     *driver_name = strdup(devices[0].driver_name);
         
     dri_state->driConnectedFlag = VA_DUMMY;
-    
+
     return VA_STATUS_SUCCESS;
 }
 #else
@@ -204,7 +191,7 @@ static VAStatus va_DisplayContextGetDriverName (
            driver_name, vendor_id, device_id);
     
     dri_state->driConnectedFlag = VA_DUMMY;
-    
+
     return VA_STATUS_SUCCESS;
 }
 #endif
@@ -214,23 +201,11 @@ VADisplay vaGetDisplay (
 )
 {
     VADisplay dpy = NULL;
-    VADisplayContextP pDisplayContext = pDisplayContexts;
+    VADisplayContextP pDisplayContext;
 
     if (!native_dpy)
         return NULL;
 
-    while (pDisplayContext)
-    {
-        if (pDisplayContext->pDriverContext &&
-            pDisplayContext->pDriverContext->native_dpy == (void *)native_dpy)
-        {
-            dpy = (VADisplay)pDisplayContext;
-            break;
-        }
-        pDisplayContext = pDisplayContext->pNext;
-    }
-
-
     if (!dpy)
     {
         /* create new entry */
@@ -244,12 +219,10 @@ VADisplay vaGetDisplay (
             pDisplayContext->vadpy_magic = VA_DISPLAY_MAGIC;          
 
             pDriverContext->native_dpy       = (void *)native_dpy;
-            pDisplayContext->pNext           = pDisplayContexts;
             pDisplayContext->pDriverContext  = pDriverContext;
             pDisplayContext->vaIsValid       = va_DisplayContextIsValid;
             pDisplayContext->vaDestroy       = va_DisplayContextDestroy;
             pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
-            pDisplayContexts                 = pDisplayContext;
             pDriverContext->dri_state       = dri_state;
             dpy                              = (VADisplay)pDisplayContext;
         }