revise installing a license file
[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
34 #include "Exynos_OSAL_Memory.h"
35 #include "Exynos_OSAL_Mutex.h"
36 #include "Exynos_OSAL_Event.h"
37
38 #undef  EXYNOS_LOG_TAG
39 #define EXYNOS_LOG_TAG    "Exynos_OSAL_EVENT"
40 #define EXYNOS_LOG_OFF
41 #include "Exynos_OSAL_Log.h"
42
43
44 OMX_ERRORTYPE Exynos_OSAL_SignalCreate(OMX_HANDLETYPE *eventHandle)
45 {
46     Exynos_OSAL_THREADEVENT *event;
47     OMX_ERRORTYPE ret = OMX_ErrorNone;
48
49     event = (Exynos_OSAL_THREADEVENT *)Exynos_OSAL_Malloc(sizeof(Exynos_OSAL_THREADEVENT));
50     if (!event) {
51         ret = OMX_ErrorInsufficientResources;
52         goto EXIT;
53     }
54
55     Exynos_OSAL_Memset(event, 0, sizeof(Exynos_OSAL_THREADEVENT));
56     event->signal = OMX_FALSE;
57
58     ret = Exynos_OSAL_MutexCreate(&event->mutex);
59     if (ret != OMX_ErrorNone) {
60         Exynos_OSAL_Free(event);
61         goto EXIT;
62     }
63
64     if (pthread_cond_init(&event->condition, NULL)) {
65         Exynos_OSAL_MutexTerminate(event->mutex);
66         Exynos_OSAL_Free(event);
67         ret = OMX_ErrorUndefined;
68         goto EXIT;
69     }
70
71     *eventHandle = (OMX_HANDLETYPE)event;
72     ret = OMX_ErrorNone;
73
74 EXIT:
75     return ret;
76 }
77
78 OMX_ERRORTYPE Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle)
79 {
80     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
81     OMX_ERRORTYPE ret = OMX_ErrorNone;
82
83     if (!event) {
84         ret = OMX_ErrorBadParameter;
85         goto EXIT;
86     }
87
88     ret = Exynos_OSAL_MutexLock(event->mutex);
89     if (ret != OMX_ErrorNone) {
90         ret = OMX_ErrorBadParameter;
91         goto EXIT;
92     }
93
94     if (pthread_cond_destroy(&event->condition)) {
95         ret = OMX_ErrorUndefined;
96         goto EXIT;
97     }
98
99     ret = Exynos_OSAL_MutexUnlock(event->mutex);
100     if (ret != OMX_ErrorNone) {
101         ret = OMX_ErrorUndefined;
102         goto EXIT;
103     }
104
105     ret = Exynos_OSAL_MutexTerminate(event->mutex);
106     if (ret != OMX_ErrorNone) {
107         ret = OMX_ErrorUndefined;
108         goto EXIT;
109     }
110
111     Exynos_OSAL_Free(event);
112
113 EXIT:
114     return ret;
115 }
116
117 OMX_ERRORTYPE Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle)
118 {
119     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
120     OMX_ERRORTYPE ret = OMX_ErrorNone;
121
122     if (!event) {
123         ret = OMX_ErrorBadParameter;
124         goto EXIT;
125     }
126
127     ret = Exynos_OSAL_MutexLock(event->mutex);
128     if (ret != OMX_ErrorNone) {
129         ret = OMX_ErrorBadParameter;
130         goto EXIT;
131     }
132
133     event->signal = OMX_FALSE;
134
135     Exynos_OSAL_MutexUnlock(event->mutex);
136
137 EXIT:
138     return ret;
139 }
140
141 OMX_ERRORTYPE Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle)
142 {
143     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
144     OMX_ERRORTYPE ret = OMX_ErrorNone;
145
146     if (!event) {
147         ret = OMX_ErrorBadParameter;
148         goto EXIT;
149     }
150
151     ret = Exynos_OSAL_MutexLock(event->mutex);
152     if (ret != OMX_ErrorNone) {
153         ret = OMX_ErrorBadParameter;
154         goto EXIT;
155     }
156
157     event->signal = OMX_TRUE;
158     pthread_cond_signal(&event->condition);
159
160     Exynos_OSAL_MutexUnlock(event->mutex);
161
162 EXIT:
163     return ret;
164 }
165
166 OMX_ERRORTYPE Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle, OMX_U32 ms)
167 {
168     Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
169     OMX_ERRORTYPE         ret = OMX_ErrorNone;
170     struct timespec       timeout;
171     struct timeval        now;
172     int                   funcret = 0;
173     OMX_U32               tv_us;
174
175     FunctionIn();
176
177     if (!event) {
178         ret = OMX_ErrorBadParameter;
179         goto EXIT;
180     }
181
182     gettimeofday(&now, NULL);
183
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;
187
188     ret = Exynos_OSAL_MutexLock(event->mutex);
189     if (ret != OMX_ErrorNone) {
190         ret = OMX_ErrorBadParameter;
191         goto EXIT;
192     }
193
194     if (ms == 0) {
195         if (!event->signal)
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));
200         ret = OMX_ErrorNone;
201     } else {
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;
206                 break;
207             }
208         }
209     }
210
211     Exynos_OSAL_MutexUnlock(event->mutex);
212
213 EXIT:
214     FunctionOut();
215
216     return ret;
217 }