• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2010, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34 *   @file  timm_osal_Mutexs.c
35 *   This file contains methods that provides the functionality
36 *
37 *  @path \
38 *
39 */
40 /* -------------------------------------------------------------------------- */
41 /* =========================================================================
42  *!
43  *! Revision History
44  *! ===================================
45  *! 04-Nov-2008 Maiya ShreeHarsha: Linux specific changes
46  *! 0.1: Created the first draft version, ksrini@ti.com
47  * ========================================================================= */
48 
49 /******************************************************************************
50 * Includes
51 ******************************************************************************/
52 
53 
54 #include "timm_osal_types.h"
55 #include "timm_osal_trace.h"
56 #include "timm_osal_error.h"
57 #include "timm_osal_memory.h"
58 #include "timm_osal_semaphores.h"
59 
60 #include <errno.h>
61 
62 #include <pthread.h>
63 #include <sys/time.h>
64 
65 
66 /* ========================================================================== */
67 /**
68 * @fn TIMM_OSAL_MutexCreate function
69 *
70 *
71 */
72 /* ========================================================================== */
TIMM_OSAL_MutexCreate(TIMM_OSAL_PTR * pMutex)73 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexCreate(TIMM_OSAL_PTR * pMutex)
74 {
75 	TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;
76 	pthread_mutex_t *plMutex = TIMM_OSAL_NULL;
77 
78 	plMutex =
79 	    (pthread_mutex_t *) TIMM_OSAL_Malloc(sizeof(pthread_mutex_t), 0,
80 	    0, 0);
81 	if (TIMM_OSAL_NULL == plMutex)
82 	{
83 		bReturnStatus = TIMM_OSAL_ERR_ALLOC;
84 		goto EXIT;
85 	}
86 
87 	/*if (SUCCESS != pthread_mutex_init(plMutex, pAttr)) */
88 	if (SUCCESS != pthread_mutex_init(plMutex, TIMM_OSAL_NULL))
89 	{
90 		/*TIMM_OSAL_Error ("Mutex Create failed !"); */
91 		/*goto EXIT; */
92 	} else
93 	{
94 	/**pMutex = (TIMM_OSAL_PTR *)plMutex;*/
95 		*pMutex = (TIMM_OSAL_PTR) plMutex;
96 		bReturnStatus = TIMM_OSAL_ERR_NONE;
97 	}
98       EXIT:
99 	/*if((TIMM_OSAL_ERR_NONE != bReturnStatus)) {
100 	   TIMM_OSAL_Free(plMutex);
101 	   } */
102 	if ((TIMM_OSAL_ERR_NONE != bReturnStatus) &&
103 	    (TIMM_OSAL_NULL != plMutex))
104 	{
105 		TIMM_OSAL_Free(plMutex);
106 	}
107 	return bReturnStatus;
108 
109 /**********************************************************/
110 /*return TIMM_OSAL_SemaphoreCreate(pMutex, 1);*/
111 /**********************************************************/
112 }
113 
114 /* ========================================================================== */
115 /**
116 * @fn TIMM_OSAL_MutexDelete function
117 *
118 *
119 */
120 /* ========================================================================== */
TIMM_OSAL_MutexDelete(TIMM_OSAL_PTR pMutex)121 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexDelete(TIMM_OSAL_PTR pMutex)
122 {
123 	TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_NONE;
124 	pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex;
125 
126 	if (plMutex == TIMM_OSAL_NULL)
127 	{
128 		bReturnStatus = TIMM_OSAL_ERR_PARAMETER;
129 		goto EXIT;
130 	}
131 	/*can we do away with if or with switch case */
132 	if (SUCCESS != pthread_mutex_destroy(plMutex))
133 	{
134 		/*TIMM_OSAL_Error("Delete Mutex failed !"); */
135 		bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;;
136 	}
137 
138 	TIMM_OSAL_Free(plMutex);
139       EXIT:
140 	return bReturnStatus;
141 /**********************************************************/
142 /*return TIMM_OSAL_SemaphoreDelete(pMutex);*/
143 /**********************************************************/
144 
145 }
146 
147 /* ========================================================================== */
148 /**
149 * @fn TIMM_OSAL_MutexObtain function
150 *
151 *
152 */
153 /* ========================================================================== */
154 
TIMM_OSAL_MutexObtain(TIMM_OSAL_PTR pMutex,TIMM_OSAL_U32 uTimeOut)155 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexObtain(TIMM_OSAL_PTR pMutex,
156     TIMM_OSAL_U32 uTimeOut)
157 {
158 	TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;
159 	struct timespec abs_timeout;
160 	struct timeval ltime_now;
161 	TIMM_OSAL_U32 ltimenow_us;
162 	pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex;
163 
164 	if (plMutex == TIMM_OSAL_NULL)
165 	{
166 		bReturnStatus = TIMM_OSAL_ERR_PARAMETER;
167 		goto EXIT;
168 	}
169 
170 	if (TIMM_OSAL_SUSPEND == uTimeOut)
171 	{
172 		if (SUCCESS != pthread_mutex_lock(plMutex))
173 		{
174 			/*TIMM_OSAL_Error("Lock Mutex failed !"); */
175 			goto EXIT;
176 		}
177 	} else if (TIMM_OSAL_NO_SUSPEND == uTimeOut)
178 	{
179 		if (SUCCESS != pthread_mutex_trylock(plMutex))
180 		{
181 			/*TIMM_OSAL_Error("Lock Mutex failed !"); */
182 			goto EXIT;
183 		}
184 	} else
185 	{
186 		gettimeofday(&ltime_now, NULL);
187 		/*uTimeOut is assumed to be in milliseconds */
188 		ltimenow_us = ltime_now.tv_usec + 1000 * uTimeOut;
189 		abs_timeout.tv_sec = ltime_now.tv_sec + uTimeOut / 1000;
190 		abs_timeout.tv_nsec = (ltimenow_us % 1000000) * 1000;
191 
192 #ifdef _POSIX_VERSION_1_
193 		if (SUCCESS != pthread_mutex_lock(plMutex))
194 		{		//Some Posix versions dont support timeout
195 #else
196 		if (SUCCESS != pthread_mutex_timedlock(plMutex, &abs_timeout))
197 		{
198 #endif
199 			/*TIMM_OSAL_Error("Lock Mutex failed !"); */
200 			goto EXIT;
201 		}
202 	}
203 	bReturnStatus = TIMM_OSAL_ERR_NONE;
204 
205       EXIT:
206 	return bReturnStatus;
207 /**********************************************************/
208 /*return TIMM_OSAL_SemaphoreObtain(pMutex, uTimeOut);*/
209 /**********************************************************/
210 }
211 
212 
213 
214 /* ========================================================================== */
215 /**
216 * @fn TIMM_OSAL_MutexRelease function
217 *
218 *
219 */
220 /* ========================================================================== */
221 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexRelease(TIMM_OSAL_PTR pMutex)
222 {
223 	TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;
224 	pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex;
225 
226 	if (TIMM_OSAL_NULL == plMutex)
227 	{
228 		bReturnStatus = TIMM_OSAL_ERR_PARAMETER;
229 		goto EXIT;
230 	}
231 
232 	if (SUCCESS != pthread_mutex_unlock(plMutex))
233 	{
234 		/*TIMM_OSAL_Error("Unlock Mutex failed !"); */
235 	} else
236 	{
237 		bReturnStatus = TIMM_OSAL_ERR_NONE;
238 	}
239       EXIT:
240 	return bReturnStatus;
241 /**********************************************************/
242 /*return TIMM_OSAL_SemaphoreRelease(pMutex);*/
243 /**********************************************************/
244 }
245