khronosfws/openmax_al/src/common/xathreadsafety.c
branchRCL_3
changeset 19 095bea5f582e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/common/xathreadsafety.c	Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Thread Safety Implementation
+ *
+ */
+
+#include <stdlib.h>
+#include "xathreadsafety.h"
+
+typedef struct
+    {
+    XAImplMutexHandle mutexTable[XATSCount];
+    XAboolean tsEnabled;
+    } XAThreadSafetyImpl;
+
+static XAThreadSafetyImpl* threadSafety;
+
+/*
+ * XAresult XAThreadSafety_Init()
+ * Description: Creates mutex table for thread safety support
+ * @return: Success value
+ */
+XAresult XAThreadSafety_Init(XAboolean tsEnable)
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAint32 i = 0;
+    DEBUG_API_A1("->XAThreadSafety_Init - tsEnable:%lu",tsEnable);
+
+    /* Initialize thread safety only once */
+    if (!threadSafety)
+        {
+        threadSafety = (XAThreadSafetyImpl *) calloc(1,
+                sizeof(XAThreadSafetyImpl));
+        if (!threadSafety)
+            {
+            DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+            DEBUG_API("<-XAThreadSafety_Init");
+            /* memory allocation failed */
+            return XA_RESULT_MEMORY_FAILURE;
+            }
+
+        threadSafety->tsEnabled = tsEnable;
+
+        if (tsEnable)
+            {
+            for (i = 0; i < XATSCount; i++)
+                {
+                ret = XAImpl_CreateMutex(&threadSafety->mutexTable[i]);
+                if (ret != XA_RESULT_SUCCESS)
+                    {
+                    break;
+                    }
+                DEBUG_INFO_A2("Created %s:%x",MEDIAOBJECTNAME(i), threadSafety->mutexTable[i] );
+                }
+            }
+        else
+            {
+            DEBUG_INFO("Thread safety: disabled.");
+            }
+        }
+
+    DEBUG_API("<-XAThreadSafety_Init");
+    return ret;
+    }
+
+/*
+ * XAresult XAThreadSafety_Destroy()
+ * Description: Destroys mutex table created for thread safety support
+ */
+XAresult XAThreadSafety_Destroy()
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAint32 i = 0;
+    DEBUG_API("->XAThreadSafety_Destroy");
+
+    if (threadSafety)
+        {
+        if (threadSafety->tsEnabled)
+            {
+            for (i = 0; i < XATSCount; i++)
+                {
+                DEBUG_INFO_A2("Free %s:%x",MEDIAOBJECTNAME(i), threadSafety->mutexTable[i] );
+                XAImpl_DeleteMutex(threadSafety->mutexTable[i]);
+                }
+            }
+        free(threadSafety);
+        }
+    else
+        {
+        DEBUG_INFO("Thread safety: disabled.");
+        }
+
+    DEBUG_API("<-XAThreadSafety_Destroy");
+    return ret;
+
+    }
+
+/*
+ * XAresult XAThreadSafety_Unlock( XAThreadSafetyMediaObjects mediaObject )
+ * Description:
+ * @param XAThreadSafetyMediaObjects mediaObject
+ * @return
+ */
+XAresult XAThreadSafety_Unlock(XAThreadSafetyMediaObjects mediaObject)
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAThreadSafety_Unlock");
+
+    if (threadSafety)
+        {
+        if (threadSafety->tsEnabled)
+            {
+            ret = XAImpl_UnlockMutex(threadSafety->mutexTable[mediaObject]);
+            if (ret == XA_RESULT_SUCCESS)
+                {
+                DEBUG_INFO_A2("Released lock for %s:%x",MEDIAOBJECTNAME(mediaObject), threadSafety->mutexTable[mediaObject] );
+                }
+            }
+        }
+    else
+        {
+        DEBUG_INFO("Thread safety: disabled.");
+        }
+    DEBUG_API("<-XAThreadSafety_Unlock");
+    return ret;
+    }
+/*
+ * XAresult XAThreadSafety_TryLock( XAThreadSafetyMediaObjects mediaObject );
+ * Description:
+ * @param XAThreadSafetyMediaObjects mediaObject
+ * @return
+ */
+XAresult XAThreadSafety_TryLock(XAThreadSafetyMediaObjects mediaObject)
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAThreadSafety_TryLock");
+
+    if (threadSafety)
+        {
+        if (threadSafety->tsEnabled)
+            {
+            ret = XAImpl_TryLockMutex(threadSafety->mutexTable[mediaObject]);
+            if (ret == XA_RESULT_SUCCESS)
+                {
+                DEBUG_INFO_A2("Locked %s:%x",MEDIAOBJECTNAME(mediaObject), threadSafety->mutexTable[mediaObject] );
+                }
+            }
+        }
+    else
+        {
+        DEBUG_INFO("Thread safety: disabled.");
+        }
+
+    DEBUG_API("<-XAThreadSafety_TryLock");
+    return ret;
+    }
+