Remove build warnings and fixed svace issues
[platform/adaptation/ap_samsung/libomxil-e3250-v4l2.git] / openmax / osal / Exynos_OSAL_Event.c
1 /*
2  *
3  * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4  *
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16 */
17
18 /*
19  * @file        Exynos_OSAL_Event.c
20  * @brief
21  * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
22  * @version     2.0.0
23  * @history
24  *   2012.02.20 : Create
25  */
26
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <pthread.h>
32 #include <errno.h>
33 #include <sys/time.h>
34
35 #include "Exynos_OSAL_Memory.h"
36 #include "Exynos_OSAL_Mutex.h"
37 #include "Exynos_OSAL_Event.h"
38
39 #undef  EXYNOS_LOG_TAG
40 #define EXYNOS_LOG_TAG    "Exynos_OSAL_EVENT"
41 #define EXYNOS_LOG_OFF
42 #include "Exynos_OSAL_Log.h"
43
44
45 OMX_ERRORTYPE Exynos_OSAL_SignalCreate(OMX_HANDLETYPE *eventHandle)
46 {
47     Exynos_OSAL_THREADEVENT *event;
48     OMX_ERRORTYPE ret = OMX_ErrorNone;
49
50     event = (Exynos_OSAL_THREADEVENT *)Exynos_OSAL_Malloc(sizeof(Exynos_OSAL_THREADEVENT));
51     if (!event) {
52         ret = OMX_ErrorInsufficientResources;
53         goto EXIT;
54     }
55
56     Exynos_OSAL_Memset(event, 0, sizeof(Exynos_OSAL_THREADEVENT));
57     event->signal = OMX_FALSE;
58
59     ret = Exynos_OSAL_MutexCreate(&event->mutex);
60     if (ret != OMX_ErrorNone) {
61         Exynos_OSAL_Free(event);
62         goto EXIT;
63     }
64
65     if (pthread_cond_init(&event->condition, NULL)) {
66         Exynos_OSAL_MutexTerminate(event->mutex);
67         Exynos_OSAL_Free(event);
68         ret = OMX_ErrorUndefined;
69         goto EXIT;
70     }
71
72     *eventHandle = (OMX_HANDLETYPE)event;
73     ret = OMX_ErrorNone;
74
75 EXIT:
76     return ret;
77 }
78
79 OMX_ERRORTYPE Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle)
80 {
81     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
82     OMX_ERRORTYPE ret = OMX_ErrorNone;
83
84     if (!event) {
85         ret = OMX_ErrorBadParameter;
86         goto EXIT;
87     }
88
89     ret = Exynos_OSAL_MutexLock(event->mutex);
90     if (ret != OMX_ErrorNone) {
91         ret = OMX_ErrorBadParameter;
92         goto EXIT;
93     }
94
95     if (pthread_cond_destroy(&event->condition)) {
96         ret = OMX_ErrorUndefined;
97         goto EXIT;
98     }
99
100     ret = Exynos_OSAL_MutexUnlock(event->mutex);
101     if (ret != OMX_ErrorNone) {
102         ret = OMX_ErrorUndefined;
103         goto EXIT;
104     }
105
106     ret = Exynos_OSAL_MutexTerminate(event->mutex);
107     if (ret != OMX_ErrorNone) {
108         ret = OMX_ErrorUndefined;
109         goto EXIT;
110     }
111
112     Exynos_OSAL_Free(event);
113
114 EXIT:
115     return ret;
116 }
117
118 OMX_ERRORTYPE Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle)
119 {
120     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
121     OMX_ERRORTYPE ret = OMX_ErrorNone;
122
123     if (!event) {
124         ret = OMX_ErrorBadParameter;
125         goto EXIT;
126     }
127
128     ret = Exynos_OSAL_MutexLock(event->mutex);
129     if (ret != OMX_ErrorNone) {
130         ret = OMX_ErrorBadParameter;
131         goto EXIT;
132     }
133
134     event->signal = OMX_FALSE;
135
136     Exynos_OSAL_MutexUnlock(event->mutex);
137
138 EXIT:
139     return ret;
140 }
141
142 OMX_ERRORTYPE Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle)
143 {
144     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
145     OMX_ERRORTYPE ret = OMX_ErrorNone;
146
147     if (!event) {
148         ret = OMX_ErrorBadParameter;
149         goto EXIT;
150     }
151
152     ret = Exynos_OSAL_MutexLock(event->mutex);
153     if (ret != OMX_ErrorNone) {
154         ret = OMX_ErrorBadParameter;
155         goto EXIT;
156     }
157
158     event->signal = OMX_TRUE;
159     pthread_cond_signal(&event->condition);
160
161     Exynos_OSAL_MutexUnlock(event->mutex);
162
163 EXIT:
164     return ret;
165 }
166
167 OMX_ERRORTYPE Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle, OMX_U32 ms)
168 {
169     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
170     OMX_ERRORTYPE         ret = OMX_ErrorNone;
171     struct timespec       timeout;
172     struct timeval        now;
173     int                   funcret = 0;
174     OMX_U32               tv_us;
175
176     FunctionIn();
177
178     if (!event) {
179         ret = OMX_ErrorBadParameter;
180         goto EXIT;
181     }
182
183     gettimeofday(&now, NULL);
184
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;
188
189     ret = Exynos_OSAL_MutexLock(event->mutex);
190     if (ret != OMX_ErrorNone) {
191         ret = OMX_ErrorBadParameter;
192         goto EXIT;
193     }
194
195     if (ms == 0) {
196         if (!event->signal)
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));
201         ret = OMX_ErrorNone;
202     } else {
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;
207                 break;
208             }
209         }
210     }
211
212     Exynos_OSAL_MutexUnlock(event->mutex);
213
214 EXIT:
215     FunctionOut();
216
217     return ret;
218 }