diff -r a36789189b53 -r 095bea5f582e khronosfws/openmax_al/src/engine/xathreadsyncitf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/khronosfws/openmax_al/src/engine/xathreadsyncitf.c Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,139 @@ +/* + * 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: ThreadSync Itf Implementation + * + */ + +#include +#include +#include + +#include "xathreadsyncitf.h" + +/** + * Base interface XAThreadSyncItf Implementation + */ +XAresult XAThreadSyncItfImpl_EnterCriticalSection(XAThreadSyncItf self) + { + XAresult ret = XA_RESULT_SUCCESS; + XAThreadSyncItfImpl* impl = NULL; + + DEBUG_API("->XAThreadSyncItfImpl_EnterCriticalSection"); + + impl = (XAThreadSyncItfImpl*) (*self); + if (!impl || impl != impl->self) + { + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + DEBUG_API("<-XAThreadSyncItfImpl_EnterCriticalSection"); + return XA_RESULT_PARAMETER_INVALID; + } + + if (impl->engInCritical) + { + /* The calling context must not already be in + critical section state. */ + DEBUG_ERR("XA_RESULT_PRECONDITIONS_VIOLATED"); + ret = XA_RESULT_PRECONDITIONS_VIOLATED; + } + else + { + ret = XAImpl_LockMutex(impl->engCriticalSection); + if (ret == XA_RESULT_SUCCESS) + { + impl->engInCritical = XA_BOOLEAN_TRUE; + } + } + DEBUG_API("<-XAThreadSyncItfImpl_EnterCriticalSection"); + return ret; + } + +XAresult XAThreadSyncItfImpl_ExitCriticalSection(XAThreadSyncItf self) + { + XAThreadSyncItfImpl* impl = NULL; + XAresult ret = XA_RESULT_SUCCESS; + + impl = (XAThreadSyncItfImpl*) (*self); + DEBUG_API("->XAThreadSyncItfImpl_ExitCriticalSection"); + + if (!impl || impl != impl->self) + { + DEBUG_ERR("XA_RESULT_PARAMETER_INVALID"); + DEBUG_API("<-XAThreadSyncItfImpl_ExitCriticalSection"); + return XA_RESULT_PARAMETER_INVALID; + } + + if (impl->engInCritical) + { + ret = XAImpl_UnlockMutex(impl->engCriticalSection); + if (ret == XA_RESULT_SUCCESS) + { + impl->engInCritical = XA_BOOLEAN_FALSE; + } + } + else + { + /* The engine must be in critical section state */ + DEBUG_ERR("XA_RESULT_PRECONDITIONS_VIOLATED"); + ret = XA_RESULT_PRECONDITIONS_VIOLATED; + } + DEBUG_API("<-XAThreadSyncItfImpl_ExitCriticalSection"); + return ret; + } + +/** + * XAThreadSyncItfImpl -specific methods + **/ + +XAThreadSyncItfImpl* XAThreadSyncItfImpl_Create() + { + XAThreadSyncItfImpl *self = NULL; + DEBUG_API("->XAThreadSyncItfImpl_Create"); + + self = (XAThreadSyncItfImpl*) calloc(1, sizeof(XAThreadSyncItfImpl)); + + if (self) + { + /* init itf default implementation */ + self->itf.EnterCriticalSection + = XAThreadSyncItfImpl_EnterCriticalSection; + self->itf.ExitCriticalSection + = XAThreadSyncItfImpl_ExitCriticalSection; + + if (XAImpl_CreateMutex(&(self->engCriticalSection)) + != XA_RESULT_SUCCESS) + { + DEBUG_ERR("Mutex creation failed, abort"); + free(self); + DEBUG_API("<-XAThreadSyncItfImpl_Create"); + return NULL; + } + + self->self = self; + } + DEBUG_API("<-XAThreadSyncItfImpl_Create"); + return self; + } + +void XAThreadSyncItfImpl_Free(XAThreadSyncItfImpl* self) + { + DEBUG_API("->XAThreadSyncItfImpl_Free"); + if(self) + { + assert(self==self->self); + XAImpl_DeleteMutex(self->engCriticalSection); + free(self); + } + DEBUG_API("<-XAThreadSyncItfImpl_Free"); + } +