3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OSAL_Event.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
35 #include "Exynos_OSAL_Memory.h"
36 #include "Exynos_OSAL_Mutex.h"
37 #include "Exynos_OSAL_Event.h"
40 #define EXYNOS_LOG_TAG "Exynos_OSAL_EVENT"
41 #define EXYNOS_LOG_OFF
42 #include "Exynos_OSAL_Log.h"
45 OMX_ERRORTYPE Exynos_OSAL_SignalCreate(OMX_HANDLETYPE *eventHandle)
47 Exynos_OSAL_THREADEVENT *event;
48 OMX_ERRORTYPE ret = OMX_ErrorNone;
50 event = (Exynos_OSAL_THREADEVENT *)Exynos_OSAL_Malloc(sizeof(Exynos_OSAL_THREADEVENT));
52 ret = OMX_ErrorInsufficientResources;
56 Exynos_OSAL_Memset(event, 0, sizeof(Exynos_OSAL_THREADEVENT));
57 event->signal = OMX_FALSE;
59 ret = Exynos_OSAL_MutexCreate(&event->mutex);
60 if (ret != OMX_ErrorNone) {
61 Exynos_OSAL_Free(event);
65 if (pthread_cond_init(&event->condition, NULL)) {
66 Exynos_OSAL_MutexTerminate(event->mutex);
67 Exynos_OSAL_Free(event);
68 ret = OMX_ErrorUndefined;
72 *eventHandle = (OMX_HANDLETYPE)event;
79 OMX_ERRORTYPE Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle)
81 Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
82 OMX_ERRORTYPE ret = OMX_ErrorNone;
85 ret = OMX_ErrorBadParameter;
89 ret = Exynos_OSAL_MutexLock(event->mutex);
90 if (ret != OMX_ErrorNone) {
91 ret = OMX_ErrorBadParameter;
95 if (pthread_cond_destroy(&event->condition)) {
96 ret = OMX_ErrorUndefined;
100 ret = Exynos_OSAL_MutexUnlock(event->mutex);
101 if (ret != OMX_ErrorNone) {
102 ret = OMX_ErrorUndefined;
106 ret = Exynos_OSAL_MutexTerminate(event->mutex);
107 if (ret != OMX_ErrorNone) {
108 ret = OMX_ErrorUndefined;
112 Exynos_OSAL_Free(event);
118 OMX_ERRORTYPE Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle)
120 Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
121 OMX_ERRORTYPE ret = OMX_ErrorNone;
124 ret = OMX_ErrorBadParameter;
128 ret = Exynos_OSAL_MutexLock(event->mutex);
129 if (ret != OMX_ErrorNone) {
130 ret = OMX_ErrorBadParameter;
134 event->signal = OMX_FALSE;
136 Exynos_OSAL_MutexUnlock(event->mutex);
142 OMX_ERRORTYPE Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle)
144 Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
145 OMX_ERRORTYPE ret = OMX_ErrorNone;
148 ret = OMX_ErrorBadParameter;
152 ret = Exynos_OSAL_MutexLock(event->mutex);
153 if (ret != OMX_ErrorNone) {
154 ret = OMX_ErrorBadParameter;
158 event->signal = OMX_TRUE;
159 pthread_cond_signal(&event->condition);
161 Exynos_OSAL_MutexUnlock(event->mutex);
167 OMX_ERRORTYPE Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle, OMX_U32 ms)
169 Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
170 OMX_ERRORTYPE ret = OMX_ErrorNone;
171 struct timespec timeout;
179 ret = OMX_ErrorBadParameter;
183 gettimeofday(&now, NULL);
185 tv_us = now.tv_usec + ms * 1000;
186 timeout.tv_sec = now.tv_sec + tv_us / 1000000;
187 timeout.tv_nsec = (tv_us % 1000000) * 1000;
189 ret = Exynos_OSAL_MutexLock(event->mutex);
190 if (ret != OMX_ErrorNone) {
191 ret = OMX_ErrorBadParameter;
197 ret = OMX_ErrorTimeout;
198 } else if (ms == DEF_MAX_WAIT_TIME) {
199 while (!event->signal)
200 pthread_cond_wait(&event->condition, (pthread_mutex_t *)(event->mutex));
203 while (!event->signal) {
204 funcret = pthread_cond_timedwait(&event->condition, (pthread_mutex_t *)(event->mutex), &timeout);
205 if ((!event->signal) && (funcret == ETIMEDOUT)) {
206 ret = OMX_ErrorTimeout;
212 Exynos_OSAL_MutexUnlock(event->mutex);