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)
34 #include "Exynos_OSAL_Memory.h"
35 #include "Exynos_OSAL_Mutex.h"
36 #include "Exynos_OSAL_Event.h"
39 #define EXYNOS_LOG_TAG "Exynos_OSAL_EVENT"
40 #define EXYNOS_LOG_OFF
41 #include "Exynos_OSAL_Log.h"
44 OMX_ERRORTYPE
Exynos_OSAL_SignalCreate(OMX_HANDLETYPE
*eventHandle
)
46 Exynos_OSAL_THREADEVENT
*event
;
47 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
49 event
= (Exynos_OSAL_THREADEVENT
*)Exynos_OSAL_Malloc(sizeof(Exynos_OSAL_THREADEVENT
));
51 ret
= OMX_ErrorInsufficientResources
;
55 Exynos_OSAL_Memset(event
, 0, sizeof(Exynos_OSAL_THREADEVENT
));
56 event
->signal
= OMX_FALSE
;
58 ret
= Exynos_OSAL_MutexCreate(&event
->mutex
);
59 if (ret
!= OMX_ErrorNone
) {
60 Exynos_OSAL_Free(event
);
64 if (pthread_cond_init(&event
->condition
, NULL
)) {
65 Exynos_OSAL_MutexTerminate(event
->mutex
);
66 Exynos_OSAL_Free(event
);
67 ret
= OMX_ErrorUndefined
;
71 *eventHandle
= (OMX_HANDLETYPE
)event
;
78 OMX_ERRORTYPE
Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle
)
80 Exynos_OSAL_THREADEVENT
*event
= (Exynos_OSAL_THREADEVENT
*)eventHandle
;
81 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
84 ret
= OMX_ErrorBadParameter
;
88 ret
= Exynos_OSAL_MutexLock(event
->mutex
);
89 if (ret
!= OMX_ErrorNone
) {
90 ret
= OMX_ErrorBadParameter
;
94 if (pthread_cond_destroy(&event
->condition
)) {
95 ret
= OMX_ErrorUndefined
;
99 ret
= Exynos_OSAL_MutexUnlock(event
->mutex
);
100 if (ret
!= OMX_ErrorNone
) {
101 ret
= OMX_ErrorUndefined
;
105 ret
= Exynos_OSAL_MutexTerminate(event
->mutex
);
106 if (ret
!= OMX_ErrorNone
) {
107 ret
= OMX_ErrorUndefined
;
111 Exynos_OSAL_Free(event
);
117 OMX_ERRORTYPE
Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle
)
119 Exynos_OSAL_THREADEVENT
*event
= (Exynos_OSAL_THREADEVENT
*)eventHandle
;
120 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
123 ret
= OMX_ErrorBadParameter
;
127 ret
= Exynos_OSAL_MutexLock(event
->mutex
);
128 if (ret
!= OMX_ErrorNone
) {
129 ret
= OMX_ErrorBadParameter
;
133 event
->signal
= OMX_FALSE
;
135 Exynos_OSAL_MutexUnlock(event
->mutex
);
141 OMX_ERRORTYPE
Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle
)
143 Exynos_OSAL_THREADEVENT
*event
= (Exynos_OSAL_THREADEVENT
*)eventHandle
;
144 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
147 ret
= OMX_ErrorBadParameter
;
151 ret
= Exynos_OSAL_MutexLock(event
->mutex
);
152 if (ret
!= OMX_ErrorNone
) {
153 ret
= OMX_ErrorBadParameter
;
157 event
->signal
= OMX_TRUE
;
158 pthread_cond_signal(&event
->condition
);
160 Exynos_OSAL_MutexUnlock(event
->mutex
);
166 OMX_ERRORTYPE
Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle
, OMX_U32 ms
)
168 Exynos_OSAL_THREADEVENT
*event
= (Exynos_OSAL_THREADEVENT
*)eventHandle
;
169 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
170 struct timespec timeout
;
178 ret
= OMX_ErrorBadParameter
;
182 gettimeofday(&now
, NULL
);
184 tv_us
= now
.tv_usec
+ ms
* 1000;
185 timeout
.tv_sec
= now
.tv_sec
+ tv_us
/ 1000000;
186 timeout
.tv_nsec
= (tv_us
% 1000000) * 1000;
188 ret
= Exynos_OSAL_MutexLock(event
->mutex
);
189 if (ret
!= OMX_ErrorNone
) {
190 ret
= OMX_ErrorBadParameter
;
196 ret
= OMX_ErrorTimeout
;
197 } else if (ms
== DEF_MAX_WAIT_TIME
) {
198 while (!event
->signal
)
199 pthread_cond_wait(&event
->condition
, (pthread_mutex_t
*)(event
->mutex
));
202 while (!event
->signal
) {
203 funcret
= pthread_cond_timedwait(&event
->condition
, (pthread_mutex_t
*)(event
->mutex
), &timeout
);
204 if ((!event
->signal
) && (funcret
== ETIMEDOUT
)) {
205 ret
= OMX_ErrorTimeout
;
211 Exynos_OSAL_MutexUnlock(event
->mutex
);