khronosfws/openmax_al/src/common/xathreadsafety.h
branchRCL_3
changeset 45 095bea5f582e
equal deleted inserted replaced
41:a36789189b53 45:095bea5f582e
       
     1 /*
       
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description: Thread Safety Header
       
    15  *
       
    16  */
       
    17 
       
    18 #ifndef XATHREADSAFETY_H_
       
    19 #define XATHREADSAFETY_H_
       
    20 
       
    21 #include "openmaxalwrapper.h"
       
    22 #include "xaplatform.h"
       
    23 #include "xadebug.h"
       
    24 
       
    25 #ifdef _DEBUG
       
    26 /*parse media object names for debug prints*/
       
    27 
       
    28 static const char* mediaobjectnames[5] =
       
    29     {
       
    30             "XATSMediaPlayer",
       
    31             "XATSMediaRecorder",
       
    32             "XATSEngine",
       
    33             "XATSRadio",
       
    34             "XATSMetaDataExtractor"
       
    35     };
       
    36 #define MEDIAOBJECTNAME(i) ((i<XATSCount)?mediaobjectnames[i]:"INVALID")
       
    37 #endif /*_DEBUG*/
       
    38 
       
    39 /* MACROS */
       
    40 /*
       
    41  * XA_IMPL_THREAD_SAFETY_ENTRY( mediaObject )
       
    42  * Description: Tries to lock media object specified by parameter. If object is already locked
       
    43  * returns error value.
       
    44  * @param mediaObject - Index of media object where check is to be done
       
    45  * @return: XA_RESULT_PRECONDITIONS_VIOLATED - If shared data mutex is already in use
       
    46  * @return: XA_RESULT_INTERNAL_ERROR - If there is problem when reserving mutex
       
    47  * @return: In success cases doesn't return
       
    48  */
       
    49 #define XA_IMPL_THREAD_SAFETY_ENTRY( mediaObject )                                      \
       
    50 {                                                                                       \
       
    51     XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
       
    52     if ( mediaObject > XATSCount )                                                      \
       
    53     {                                                                                   \
       
    54         DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
       
    55         return XA_RESULT_PARAMETER_INVALID;                                             \
       
    56     }                                                                                   \
       
    57     DEBUG_INFO_A1("Thread safety entry for %s",MEDIAOBJECTNAME(mediaObject));           \
       
    58     mutexRet = XAThreadSafety_TryLock( mediaObject );                                   \
       
    59     if ( mutexRet == XA_RESULT_PERMISSION_DENIED )                                      \
       
    60     {                                                                                   \
       
    61         DEBUG_INFO("Media object already locked!");                                     \
       
    62         return XA_RESULT_PRECONDITIONS_VIOLATED;                                        \
       
    63     }                                                                                   \
       
    64     else if ( mutexRet != XA_RESULT_SUCCESS )                                           \
       
    65     {                                                                                   \
       
    66         DEBUG_INFO("Media object lock error!");                                         \
       
    67         return XA_RESULT_INTERNAL_ERROR;                                                \
       
    68     }                                                                                   \
       
    69     /* Fall through if XA_RESULT_SUCCESS */                                             \
       
    70 }                                                                                       \
       
    71 
       
    72 #define XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS( mediaObject )                   \
       
    73 {                                                                                       \
       
    74     XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
       
    75     if ( mediaObject > XATSCount )                                                      \
       
    76     {                                                                                   \
       
    77         DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
       
    78         return;                                                                         \
       
    79     }                                                                                   \
       
    80     DEBUG_INFO_A1("Thread safety entry for %s",MEDIAOBJECTNAME(mediaObject));           \
       
    81     mutexRet = XAThreadSafety_TryLock( mediaObject );                                   \
       
    82     if ( mutexRet == XA_RESULT_PERMISSION_DENIED )                                      \
       
    83     {                                                                                   \
       
    84         DEBUG_INFO("Media object already locked!");                                     \
       
    85         return;                                                                         \
       
    86     }                                                                                   \
       
    87     else if ( mutexRet != XA_RESULT_SUCCESS )                                           \
       
    88     {                                                                                   \
       
    89         DEBUG_INFO("Media object lock error!");                                         \
       
    90         return;                                                                         \
       
    91     }                                                                                   \
       
    92     /* Fall through if XA_RESULT_SUCCESS */                                             \
       
    93 }                                                                                       \
       
    94 /*
       
    95  * XA_IMPL_THREAD_SAFETY_EXIT( mediaObject )
       
    96  * Description: Frees reserved lock for shared data related specified by parameter.
       
    97  * @param mediaObject - Index of media object where check is to be done
       
    98  * @return: XA_RESULT_PRECONDITIONS_VIOLATED if lock is not reserved
       
    99  * @return: XA_RESULT_INTERNAL_ERROR if freeing of lock cannot be done
       
   100  * @return: In success cases doesn't return anything
       
   101  */
       
   102 #define XA_IMPL_THREAD_SAFETY_EXIT( mediaObject )                                       \
       
   103 {                                                                                       \
       
   104     XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
       
   105     if ( mediaObject > XATSCount )                                                      \
       
   106     {                                                                                   \
       
   107         DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
       
   108         return XA_RESULT_PARAMETER_INVALID;                                             \
       
   109     }                                                                                   \
       
   110     DEBUG_INFO_A1("Thread safety exit for %s",MEDIAOBJECTNAME(mediaObject));            \
       
   111     mutexRet = XAThreadSafety_Unlock( mediaObject );                                    \
       
   112     if ( mutexRet != XA_RESULT_SUCCESS)                                                 \
       
   113     {                                                                                   \
       
   114         DEBUG_INFO("Unable to unlock media object!")                                    \
       
   115         return XA_RESULT_INTERNAL_ERROR;                                                \
       
   116     }                                                                                   \
       
   117 }                                                                                       \
       
   118 
       
   119 #define XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS( mediaObject )                    \
       
   120 {                                                                                       \
       
   121     XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
       
   122     if ( mediaObject > XATSCount )                                                      \
       
   123     {                                                                                   \
       
   124         DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
       
   125         return;                                                                         \
       
   126     }                                                                                   \
       
   127     DEBUG_INFO_A1("Thread safety exit for %s",MEDIAOBJECTNAME(mediaObject));            \
       
   128     mutexRet = XAThreadSafety_Unlock( mediaObject );                                    \
       
   129     if ( mutexRet != XA_RESULT_SUCCESS)                                                 \
       
   130     {                                                                                   \
       
   131         DEBUG_INFO("Unable to unlock media object!")                                    \
       
   132         return;                                                                         \
       
   133     }                                                                                   \
       
   134 }                                                                                       \
       
   135 /* ENUMERATIONS */
       
   136 
       
   137 typedef enum
       
   138     {
       
   139     XATSMediaPlayer = 0,
       
   140     XATSMediaRecorder,
       
   141     XATSEngine,
       
   142     XATSRadio,
       
   143     XATSMetaDataExtractor,
       
   144     XATSCount
       
   145     } XAThreadSafetyMediaObjects;
       
   146 
       
   147 /* FUNCTIONS */
       
   148 XAresult XAThreadSafety_Init(XAboolean tsEnable);
       
   149 XAresult XAThreadSafety_Destroy(void);
       
   150 XAresult XAThreadSafety_Unlock(XAThreadSafetyMediaObjects mediaObject);
       
   151 XAresult XAThreadSafety_TryLock(XAThreadSafetyMediaObjects mediaObject);
       
   152 
       
   153 #endif /* XATHREADSAFETY_H_ */