khronosfws/openmax_al/src/common/xathreadsafety.h
author hgs
Fri, 11 Jun 2010 19:59:23 -0500
changeset 25 6f7ceef7b1d1
parent 12 5a06f39ad45b
child 33 5e8b14bae8c3
permissions -rw-r--r--
201023

/*
 * 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 Header
 *
 */

#ifndef XATHREADSAFETY_H_
#define XATHREADSAFETY_H_

#include "openmaxalwrapper.h"
#include "xaplatform.h"
#include "xadebug.h"

#ifdef _DEBUG
/*parse media object names for debug prints*/

static const char* mediaobjectnames[9] =
    {
            "XATSMediaPlayer",
            "XATSMediaRecorder",
            "XATSEngine",
            "XATSRadio",
            "XATSCamera",
            "XATSOutputMix",
            "XATSVibra",
            "XATSLEDArray",
            "XATSMetaDataExtractor"
    };
#define MEDIAOBJECTNAME(i) ((i<XATSCount)?mediaobjectnames[i]:"INVALID")
#endif /*_DEBUG*/

/* MACROS */
/*
 * XA_IMPL_THREAD_SAFETY_ENTRY( mediaObject )
 * Description: Tries to lock media object specified by parameter. If object is already locked
 * returns error value.
 * @param mediaObject - Index of media object where check is to be done
 * @return: XA_RESULT_PRECONDITIONS_VIOLATED - If shared data mutex is already in use
 * @return: XA_RESULT_INTERNAL_ERROR - If there is problem when reserving mutex
 * @return: In success cases doesn't return
 */
#define XA_IMPL_THREAD_SAFETY_ENTRY( mediaObject )                                      \
{                                                                                       \
    XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
    if ( mediaObject > XATSCount )                                                      \
    {                                                                                   \
        DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
        return XA_RESULT_PARAMETER_INVALID;                                             \
    }                                                                                   \
    DEBUG_INFO_A1("Thread safety entry for %s",MEDIAOBJECTNAME(mediaObject));           \
    mutexRet = XAThreadSafety_TryLock( mediaObject );                                   \
    if ( mutexRet == XA_RESULT_PERMISSION_DENIED )                                      \
    {                                                                                   \
        DEBUG_INFO("Media object already locked!");                                     \
        return XA_RESULT_PRECONDITIONS_VIOLATED;                                        \
    }                                                                                   \
    else if ( mutexRet != XA_RESULT_SUCCESS )                                           \
    {                                                                                   \
        DEBUG_INFO("Media object lock error!");                                         \
        return XA_RESULT_INTERNAL_ERROR;                                                \
    }                                                                                   \
    /* Fall through if XA_RESULT_SUCCESS */                                             \
}                                                                                       \

#define XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS( mediaObject )                   \
{                                                                                       \
    XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
    if ( mediaObject > XATSCount )                                                      \
    {                                                                                   \
        DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
        return;                                                                         \
    }                                                                                   \
    DEBUG_INFO_A1("Thread safety entry for %s",MEDIAOBJECTNAME(mediaObject));           \
    mutexRet = XAThreadSafety_TryLock( mediaObject );                                   \
    if ( mutexRet == XA_RESULT_PERMISSION_DENIED )                                      \
    {                                                                                   \
        DEBUG_INFO("Media object already locked!");                                     \
        return;                                                                         \
    }                                                                                   \
    else if ( mutexRet != XA_RESULT_SUCCESS )                                           \
    {                                                                                   \
        DEBUG_INFO("Media object lock error!");                                         \
        return;                                                                         \
    }                                                                                   \
    /* Fall through if XA_RESULT_SUCCESS */                                             \
}                                                                                       \
/*
 * XA_IMPL_THREAD_SAFETY_EXIT( mediaObject )
 * Description: Frees reserved lock for shared data related specified by parameter.
 * @param mediaObject - Index of media object where check is to be done
 * @return: XA_RESULT_PRECONDITIONS_VIOLATED if lock is not reserved
 * @return: XA_RESULT_INTERNAL_ERROR if freeing of lock cannot be done
 * @return: In success cases doesn't return anything
 */
#define XA_IMPL_THREAD_SAFETY_EXIT( mediaObject )                                       \
{                                                                                       \
    XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
    if ( mediaObject > XATSCount )                                                      \
    {                                                                                   \
        DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
        return XA_RESULT_PARAMETER_INVALID;                                             \
    }                                                                                   \
    DEBUG_INFO_A1("Thread safety exit for %s",MEDIAOBJECTNAME(mediaObject));            \
    mutexRet = XAThreadSafety_Unlock( mediaObject );                                    \
    if ( mutexRet != XA_RESULT_SUCCESS)                                                 \
    {                                                                                   \
        DEBUG_INFO("Unable to unlock media object!")                                    \
        return XA_RESULT_INTERNAL_ERROR;                                                \
    }                                                                                   \
}                                                                                       \

#define XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS( mediaObject )                    \
{                                                                                       \
    XAresult  mutexRet = XA_RESULT_SUCCESS;                                             \
    if ( mediaObject > XATSCount )                                                      \
    {                                                                                   \
        DEBUG_INFO("Thread safety - invalid mutex reference index");                    \
        return;                                                                         \
    }                                                                                   \
    DEBUG_INFO_A1("Thread safety exit for %s",MEDIAOBJECTNAME(mediaObject));            \
    mutexRet = XAThreadSafety_Unlock( mediaObject );                                    \
    if ( mutexRet != XA_RESULT_SUCCESS)                                                 \
    {                                                                                   \
        DEBUG_INFO("Unable to unlock media object!")                                    \
        return;                                                                         \
    }                                                                                   \
}                                                                                       \
/* ENUMERATIONS */

typedef enum
    {
    XATSMediaPlayer = 0,
    XATSMediaRecorder,
    XATSEngine,
    XATSRadio,
    XATSCamera,
    XATSOutputMix,
    XATSVibra,
    XATSLEDArray,
    XATSMetaDataExtractor,
    XATSCount
    } XAThreadSafetyMediaObjects;

/* FUNCTIONS */
XAresult XAThreadSafety_Init(XAboolean tsEnable);
XAresult XAThreadSafety_Destroy(void);
XAresult XAThreadSafety_Unlock(XAThreadSafetyMediaObjects mediaObject);
XAresult XAThreadSafety_TryLock(XAThreadSafetyMediaObjects mediaObject);

#endif /* XATHREADSAFETY_H_ */